Puerto serie y motor (SOLUCIONADO)

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...

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);
         
          }

No hay nadie por aquí que pueda echarme una mano???

¿El while (Serial.available()) no debería tener unas llaves que abarquen al resto de condiciones?

Lo que ocurre que tus comandos estan previstos que funcionen siempre. Nunca detienes la orden.
La orden debería deternse al cumplirse la condición por el fin de carrera.
Yo solo agregaría que al llegar a un fin de carrera, valor = ""

Esto podría resolver tu problema

  if (switchDer)  { // paroMotorDerecha
     digitalWrite(giroMotorDer, LOW);
     valor = "";
   }

  if (switchIzq) { // paroMotorIzquierda
     digitalWrite(giroMotorIzq, LOW);
     valor = "";
   }

al llegar a un fin de carrera el comando valor deja de valer "v"
se detiene por alcanzar el final de carrera y espera tu nuevo comando.

Ya lo he conseguido, todo gracias vosotros dos y vuestros aportes, he cambiado la posición del while y he añadido las lineas de valor =0;

Mil gracias, estoy empezando con la programación y a veces me hago unos líos tremendos. Ahora he conseguido desatascarme en este punto y puedo seguir con el proyecto. GRACIAS

El código queda así:

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);
         
          }

Si tienes mas dudas relacionadas con esto, sigue en este hilo, no crees uno nuevo.

OK, lo tengo en cuenta, muchas gracias por la ayuda...