Haz una pregunta
  Foros de Electrónica » Temas de Interés » Software de Simulación y Diseño Electrónico
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

19/04/2016 #1


Puerto serie y motor
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);
         
          }
19/04/2016 #2

Avatar de chclau

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.
19/04/2016 #3


Hola, esto lo hago todo sobre proteus, simulando los circuitos. He probado a eliminar la 'V' del puerto serie pero no me funciona...
21/04/2016 #4


No hay nadie por aquí que pueda echarme una mano???
21/04/2016 #5

Avatar de Nuyel

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)
21/04/2016 #6

Avatar de ruben90

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?
22/04/2016 #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...

---------- Actualizado después de 17 minutos ----------

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);
         
          }
22/04/2016 #8

Avatar de Nuyel

Entonces si era problema de los corchetes?

while(x) tarea1;
tarea2;

es lo mismo que
while(x) {
tarea1;
}
tarea2;
23/04/2016 #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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Software de Simulación y Diseño Electrónico

Todo lo relacionado con estos programas.

Cerrar
Foros de Electrónica » Temas de Interés » Software de Simulación y Diseño Electrónico

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.