HOLA, tengo que crear una cinta transportador capaz de cambiar dirección, velocidad, con 4 sensores IR, 1 para encender, 1 para paro definitivo y dos para que pare y después de 4 segundo se active de nuevo.
El problemas es que al momento de detectar un objeto la banda no se reactiva después de los 4 segundos debido a que el sensor se queda activo.
/*Velocidad y Direccion*/
int pulsadorizq=2;
int pulsadorder=3;
int pot=A0;
int IN3=7;
int IN4=8;
int ENB=9;
int statusizq;
int statusder;
int value;
int total;
/*Sensores*/
const int entrada1 = A1;
const int entrada2= A2;
const int entrada4= A4;
int estado1;
int estado2;
int estado4;
void setup() {
/*Velocidad y Direccion*/
pinMode(pulsadorizq,INPUT);
pinMode(pulsadorder,INPUT);
pinMode(pot,INPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(ENB,OUTPUT);
/*Sensores*/
pinMode(entrada1,INPUT);
pinMode(entrada2,INPUT);
pinMode(entrada4,INPUT);
}
void loop() {
/*Sensores*/
estado1 = digitalRead(entrada1);
if( estado1 == LOW){ /*Detecta Objeto*/
digitalWrite(IN3,HIGH); /*Enciende Motor*/
digitalWrite(IN4,LOW);
}
estado2 = digitalRead(entrada2);
if( estado2 == LOW){ /*Detecta Objeto*/
digitalWrite(IN3,LOW); /*Apaga el motor*/
digitalWrite(IN4,LOW);
delay(4000); /*Pasan 4 segundos*/
digitalWrite(IN3,HIGH); /*Deberia encender el motor*/
digitalWrite(IN4,LOW);
}
estado4 = digitalRead(entrada4);
if( estado4 == LOW){ /*Detecta Objeto*/
digitalWrite(IN3,LOW); /*Apaga Motor*/
digitalWrite(IN4,LOW);
}
/*Velocidad y Direccion*/
statusizq= digitalRead(pulsadorizq);
statusder= digitalRead(pulsadorder);
value= analogRead(pot);
total=map(value,0,1023,0,255);
analogWrite(ENB,total);
Serial.println(total);
if(statusizq==HIGH){
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
}else{
if(statusder==HIGH){
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
}
}
delay(100);
}
Tienes que trabajar con el flanco de la señal del sensor, si solo trabajas con el estado "actual" lógicamente desactivas nuevamente el motor.
Lées el sensor y lo comparas con el estado anterior, si pasa de alto a bajo apagas el motor y demás, finalmente guardas el estado para la siguiente lectura.
Algo así
bool estado2ant = true;
// luego en loop()
estado2 = digitalRead(entrada1);
if (estado2 != estado2ant) {
if (estado2 == LOW) { /*Detecta Objeto*/
digitalWrite(IN3, LOW); /*Apaga el motor*/
digitalWrite(IN4, LOW);
delay(4000); /*Pasan 4 segundos*/
digitalWrite(IN3, HIGH); /*Deberia encender el motor*/
digitalWrite(IN4, LOW);
}
estado2ant = estado2;
}
Este código es mas funcional aunque resta considerar el accionar del potenciómetro que por lo que veo solo ajusta velocidad del motor.
Los 3 detectores IR ahora funcionan con simultaneidad.
La sugerencia anterior no te permite esto que te comento porque el delay(4000) lo impide x 4 segundos.
/*Velocidad y Direccion*/
int pulsadorizq = 2;
int pulsadorder = 3;
int pot = A0;
int IN3 = 7;
int IN4 = 8;
int ENB = 9;
int statusizq;
int statusder;
int value;
int total;
/*Sensores*/
const int entrada1 = A1;
const int entrada2 = A2;
const int entrada4 = A4;
int estado1, estado1Ant;
int estado2, estado2Ant;
int estado4, estado4Ant;
bool iniciaAccion = false;
unsigned long inicioTime;
byte modo = 0;
void setup() {
/*Velocidad y Direccion*/
pinMode(pulsadorizq, INPUT);
pinMode(pulsadorder, INPUT);
pinMode(pot, INPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENB, OUTPUT);
/*Sensores*/
pinMode(entrada1, INPUT_PULLUP);
pinMode(entrada2, INPUT_PULLUP);
pinMode(entrada4, INPUT_PULLUP);
Serial.begin(115200);
}
void loop() {
/*Sensores*/
estado1 = digitalRead(entrada1);
if (!estado1 && estado1Ant) { /*Detecta Objeto*/
Serial.println("Enciendo motor x IR1");
digitalWrite(IN3, HIGH); /*Enciende Motor*/
digitalWrite(IN4, LOW);
}
estado1Ant = estado1;
estado2 = digitalRead(entrada2);
if (!estado2 && estado2Ant) { /*Detecta Objeto*/
Serial.println("Secuencia Motor 4seg IR2");
iniciaAccion = true;
modo = 0;
}
estado2Ant = estado2;
if (iniciaAccion ) {
switch (modo) {
case 0: Serial.println("apago motor x IR2");
digitalWrite(IN3, LOW); /*Apaga el motor*/
digitalWrite(IN4, LOW);
inicioTime = millis();
modo = 1;
break;
case 1: if (millis() - inicioTime > 4000UL){
Serial.println("Enciendo motor x IR2");
digitalWrite(IN3, HIGH); /*Deberia encender el motor*/
digitalWrite(IN4, LOW);
modo = 2;
}
break;
case 2: modo = 0;
Serial.println("Dejo listo para proxima acción");
iniciaAccion = false;
break;
}
}
estado4 = digitalRead(entrada4);
if (!estado4 && estado4Ant) { /*Detecta Objeto*/
Serial.println("Apaga motor x IR4");
digitalWrite(IN3, LOW); /*Apaga Motor*/
digitalWrite(IN4, LOW);
}
estado4Ant = estado4;
/*Velocidad y Direccion*/
statusizq = digitalRead(pulsadorizq);
statusder = digitalRead(pulsadorder);
value = analogRead(pot);
total = map(value, 0, 1023, 0, 255);
analogWrite(ENB, total);
Serial.println(total);
if (statusizq == HIGH) {
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
} else {
if (statusder == HIGH) {
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
}
delay(100);
}