Puerto serie y motor

#1
Hola buenas, os cuento...


Dos finales de carrera, derecha e izquierda, un motor y el puerto serie.

- Si envío por el puerto serie la letra 'V' y el final de carrera de la derecha está activo, el motor gira a la izquierda hasta que llega al final de carrera y se para.
- Si envío por el puerto serie la letra 'V' y el final de carrera de la izquierda está activo, el motor gira a la derecha hasta que llega al final de carrera y se para.

El tema es que cuando está el motor posicionado a la derecha y mando 'V' se pone a girar a la izquierda, pero cuando activa el final de carrera de la izquierda no se para y se pone a girar a la derecha...

Alguien podría ayudarme con el código???, gracias...

Código:
int giroMotorDer = 12;
int giroMotorIzq = 10;
int sensorDerecha = 9;
int sensorIzquierda = 8;
char valor;
bool switchDer, switchIzq;

void setup() {
  
  pinMode(giroMotorDer, OUTPUT);
  
  pinMode(giroMotorIzq, OUTPUT);
  pinMode(sensorDerecha, INPUT);
  pinMode(sensorIzquierda, INPUT);
  Serial.begin(9600); // inicializa comunicación serie
}

void loop() {

 
  switchDer = digitalRead(sensorDerecha);
  switchIzq = digitalRead(sensorIzquierda);
 

  
  while (Serial.available() > 0)
     valor = Serial.read();

  
     
          if (switchDer)  // paroMotorDerecha
         
          digitalWrite(giroMotorDer, LOW);
     
          if (switchIzq) // paroMotorIzquierda
          
          digitalWrite(giroMotorIzq, LOW);
        
 
      
              if (valor == 'r' && !switchDer && !switchIzq)
              {   
              giroDer();
              Serial.println("giro a derecha");
                            
              } 
              if (valor == 'v' && switchIzq && !switchDer) 
              {  
              giroDer();
              Serial.println("giro a derecha");
              
              }
              if (valor == 'v' && switchDer && !switchIzq)
              {   
              giroIzq();
              Serial.println("giro a izquierda");
              
              }

              if (valor == 'i' &&  switchIzq)
              {   
              stop();
              Serial.println("stop");
              
              }
                 
          }

          void giroDer(){

          digitalWrite(giroMotorDer, HIGH);
          }

           void giroIzq(){

        
          digitalWrite(giroMotorIzq, HIGH);
          }

          void stop(){

         
          digitalWrite(giroMotorIzq, LOW);
         
          }
 
#2
Lo que podes hacer es limpiar el valor de 'v' cuando ya culminaste una operacion.

Un consejo, aprende sobre maquinas de estados y como implementarlas en software, si no te vas a volver loco con montones de situaciones sobre las que no pensaste.

Si tuvieras una maquina de estados sabrias exactamente como ingresar a la misma y como salir de ella.
 
#5
me confunde tu código, hay corchetes eliminados, por ejemplo haces:
while (Serial.available() > 0)
valor = Serial.read();

Esto creo que lo trata como while (Serial.available() > 0) valor = Serial.read(); y prácticamente debería detener el programa ahí leyendo mientras hay datos. ¿Cómo envías el comando? por que ahí quedaría el ultimo carácter registrado, que bien podría ser 'V' o 10 (carácter de nueva línea)
 
#6
Porque tantas sentencias if, recuerda que existe su complemento else, al igual que la sentencia switch(). Yo crearía una tabla de estado con todas las posibles respuestas, las que necesite las colocó en los case y las que no en default. Sería solo probar.
Que compilador utilizas?
 
#7
Gracias a los dos, el código lo compilo con el sw de arduino y lo pruebo todo en simulador de proteus, el programa funciona bien salvo que quiero enviar la letra 'v' por el terminal virtual y según que final de carrera esté activo que se desplace de un lado a otro, he probado con if..else, he probado con switch case, etc...

El problema es que no sé como hacer para que cuando envío 'v' y según en que final de carrera esté, gire el motor a izquierda o derecha. Hay que tener en cuenta que el motor se para cada vez que llega al final de carrera y hasta que no envíe 'v' no se activa el giro a derecha o izquierda...



Ya lo tengo...

Código:
int giroMotorDer = 12;
int giroMotorIzq = 10;
int sensorDerecha = 9;
int sensorIzquierda = 8;
char valor = 0;
bool switchDer, switchIzq;

void setup() {
  
  pinMode(giroMotorDer, OUTPUT);
  
  pinMode(giroMotorIzq, OUTPUT);
  pinMode(sensorDerecha, INPUT);
  pinMode(sensorIzquierda, INPUT);
  Serial.begin(9600); // inicializa comunicación serie
}

void loop() {

 
  switchDer = digitalRead(sensorDerecha);
  switchIzq = digitalRead(sensorIzquierda);
 

 
 

  
     
          if (switchDer){  // paroMotorDerecha
         
          digitalWrite(giroMotorDer, LOW);
          valor = 0;
          }
     
          if (switchIzq){ // paroMotorIzquierda
          
          digitalWrite(giroMotorIzq, LOW);
          valor = 0;
          }

          while (Serial.available() > 0){
     valor = Serial.read();
        
 
      
              if (valor == 'r' && !switchDer && !switchIzq)
              {   
              giroDer();
              Serial.println("giro a derecha");
                            
              } 
              if (valor == 'v' && switchIzq && !switchDer) 
              {  
              giroDer();
              Serial.println("giro a derecha");
              
              }
              if (valor == 'v' && switchDer && !switchIzq)
              {   
              giroIzq();
              Serial.println("giro a izquierda");
              
              }

              if (valor == 'i' &&  switchIzq)
              {   
              stop();
              Serial.println("stop");
              
              }
                 
          }}

          void giroDer(){

          digitalWrite(giroMotorDer, HIGH);
          }

           void giroIzq(){

        
          digitalWrite(giroMotorIzq, HIGH);
          }

          void stop(){

         
          digitalWrite(giroMotorIzq, LOW);
         
          }
 
Última edición:
#9
El problema principal era que no le asignaba un valor distinto a la variable valor cada vez que se pulsaba un final de carrera, eso se ha solucionado pasando "valor = 0;" cada vez que un final de carrera se pulsa, luego el bucle while lo he cambiado de sitio y ahora funciona a la perfección.
 

Temas similares

Arriba