Simulación arduino en proteus, problema con señal de salida.

#1
Hola buenas, estoy simulando el movimiento de un motor en arduino con dos finales de carreras (switch), el tema es que el arduino me responde de forma correcta a la programación, salvo por fallo que no sé como arreglar. Cuando pruebo todo el ciclo llego al momento en el que tras llegar al final de carrera de la izquierda, meter la letra D en el terminal virtual para que el motor gire a la derecha, en el momento que simulo que ha llegado al final de carrera de la derecha, el pin correspondiente que debería de dejar de tener alimentación y no enviar nada al L293D me envía los 5 voltios de manera intermitente y provoca que el motor gire a derecha a pulsos.

No entiendo qué puede ser puesto que el código es sumamente simple, así que lo achaco a un fallo en el HW, en su simulación... Adjunto código arduino y archivo proteus.

Gracias a tod@s...

Proteus: https://www.dropbox.com/s/ofmymx0bm0advxt/prueba%20finales%20de%20carrera1.pdsprj?dl=0

Arduino: https://www.dropbox.com/s/uwg3ad5f7i3ultr/prueba finales de carrera.ino?dl=0
 
#2
Me parece que cuando pasa por la condición de parar para y cuando pasa por la de arrancar arranca; intermitente.
Hasta que no se desactive el final de carrera así se quedará. Es lo que has programado tu.

Ves borrando de tu mente para siempre el uso de los delays; son una plaga absoluta, lo fastidian todo. Pero, en caso de usarse, debería de estar al final del bucle, no dentro de un if, creo yo
 
#3
Hola buenas, he eliminado el delay pero me sigue haciendo lo mismo, el arduino me saca una señal intermitente por la patilla 8 que no debería de estar ahí puesto que le envío la instrucción de parar el motor, o sea, de dejar de enviar los 5 voltios hacia el L293D desde la patilla 8 del arduino...
 
#4
Si está ahí porque tu lo has programado así.

En tu código dices que si se pulsa el final de carrera se pare y después le dices que si recibes d y está pulsado el final de carrera se encienda.
Mientras se cumplan ambas primero se apaga y luego se enciende. Te hace caso porque se lo has dicho tu.
Eso deja de pasar cuando se deja de pulsar el final de carrera, pero mientras esté activado el motor va a saltos hasta que se separe lo suficiente.
 
#5
No, el problema me surge cuando el final de carrera de la izquierda esta arriba (LOW) y el motor gira a la derecha, entonces cuando llega al final de carrera de la derecha y se pone HIGH el motor no se para, si no que se que funcionando de forma intermitente.
 
#6
Ya lo tengo...
Código:
const byte giroMotorDerecha = 8;
const byte giroMotorIzquierda = 12;
const byte sensorDerecha = 11;
const byte sensorIzquierda = 10;
char valor;
bool switchDer, switchIzq, mIzq, mDer;

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

void loop() {

 
  switchDer = digitalRead(sensorDerecha);
  switchIzq = digitalRead(sensorIzquierda);
  mIzq = digitalRead(giroMotorIzquierda);
  mDer = digitalRead(giroMotorDerecha);

  // Leo del puerto serie la orden enviada Devuelve 'R', 'D', 'I' o 0
  if (Serial.available() > 0)
     valor = Serial.read();

  
     
          if (switchDer)  // paroMotorDerecha
          digitalWrite(giroMotorDerecha, LOW);
     
          if (switchIzq) // paroMotorIzquierda
          digitalWrite(giroMotorIzquierda, LOW);
        
 
      
  if (valor == 'r' && !switchDer && !switchIzq)
        {   
          digitalWrite(giroMotorDerecha, HIGH);
             } 
            else if (valor == 'd' && switchIzq && !switchDer) 
              {  
              digitalWrite(giroMotorDerecha, HIGH);
          }

              else if (valor == 'i' && switchDer && !switchIzq)
                  {   
                  digitalWrite(giroMotorIzquierda, HIGH);
                  }
                 
}


Ahora lo que me gustaría hacer es poder repetir todas la veces que quiera las sentencias if en el circuito, puesto que al hacer todos los if he de reiniciar el arduino, ¿alguna sugerencia?
 
Última edición:
#9
Mentira. En la realidad el final de carrera no se desactiva hasta que el motor lo separa y no se separa porque no se mueve hasta que no se separe, y como no se separa no se mueve y como no se mueve no se separa...

 
#11
Pues tienes que cambiar tu código. Porque en la realidad no va a funcionar.
Por cierto, los finales de carrera han de ser NC por seguridad, así que las condiciones van al revés.


 
#12
Pues ya lo he conseguido...


Código:
int giroMotorDer2 = 12;
int giroMotorIzq2 = 10;
int sensorDerecha = 9;
int sensorIzquierda = 8;
int led = 13;
char valor;
bool switchDer, switchIzq;

void setup() {
  
  pinMode(giroMotorDer2, OUTPUT);
  pinMode(giroMotorIzq2, OUTPUT);
  pinMode(led, 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();

         //Pulsadores
         if (switchDer)  // paroMotorDerecha
            digitalWrite(giroMotorDer2, LOW);

         if (switchIzq)  // paroMotorDerecha
            digitalWrite(giroMotorIzq2, LOW);
          
              if (valor == 'r' && !switchDer && !switchIzq)
              {   
              giroMotorDer();
              Serial.println("Posicionamiento");
              } 
              if (valor == 'd' && switchIzq && !switchDer) 
              {  
              giroMotorDer();
              Serial.println("giro a derecha video");
              }
              if (valor == 'n' && !switchDer )
              {   
              timeLapseDer();
              Serial.println("time lapse derecha");
              }
              if (valor == 'i' && switchDer && !switchIzq)
              {   
              giroMotorIzq();
              Serial.println("giro a izquierda video");
              }
              if (valor == 'l' && !switchIzq)
              {   
              timeLapseIzq();
              Serial.println("time lapse izquierda");
              }
              if (valor == 'i' &&  switchIzq)
              {   
              stop();
              Serial.println("stop video");
              }
        }

                      void giroMotorDer(){
                      digitalWrite(giroMotorDer2, HIGH);
                      }

                      void giroMotorIzq(){
                      digitalWrite(giroMotorIzq2, HIGH);
                      }

                     void stop(){
                     digitalWrite(giroMotorIzq2, LOW);
                     digitalWrite(giroMotorDer2, LOW);
                    }
                   void timeLapseIzq(){
                  digitalWrite(led, HIGH);
                  delay(500);
                  digitalWrite(led, LOW);
                  delay(500);
                  digitalWrite(giroMotorIzq2, HIGH);
                  delay(500);
                  digitalWrite(giroMotorIzq2, LOW);
                  delay(500);
                  }

                  void timeLapseDer(){
                  digitalWrite(led, HIGH);
                  delay(500);
                  digitalWrite(led, LOW);
                  delay(500);
                  digitalWrite(giroMotorDer2, HIGH);
                  delay(500);
                  digitalWrite(giroMotorDer2, LOW);
                  delay(500);
                  }
 

Temas similares

Arriba