Foro de elhacker.net

Informática => Electrónica => Mensaje iniciado por: jgarridc en 7 Abril 2016, 10:30 am



Título: Arduino, proteus, motor y dos finales de carrera...
Publicado por: jgarridc en 7 Abril 2016, 10:30 am
Hola buenas a tod@s, el tema es que he montado en proteus un arduino con un motor y dos finales de carrera, al meter desde el terminal virtual unos comandos el programa hará una cosa u otra y según como estén los finales de carrera, pues lo mismo. El problema me viene a una vez que el programa ha terminado, si pulso los finales de carrera o envío un comando por el terminal virtual ya no me hace caso.
Lo que pretendo es que esté en un buble infinito y el arduino siga ejecutando el programa, hasta que yo decida pararlo o lo desconecte de la corriente...

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'
  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);
             
if (valor == 'd' && switchIzq && !switchDer)
     digitalWrite(giroMotorDerecha, HIGH);
         

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


Título: Re: Arduino, proteus, motor y dos finales de carrera...
Publicado por: engel lex en 7 Abril 2016, 15:16 pm
lo que está en void loop() debería repetirse eternamente, así funciona... no será que le estás exigiendo demasiada corriente al arduino y se apaga?

puedes pasar la imagen de lo que tienes armado en proteus?


Título: Re: Arduino, proteus, motor y dos finales de carrera...
Publicado por: jgarridc en 7 Abril 2016, 15:18 pm
Es todo sobre proteus, de momento no he montado nada físico....pero en la simulación pasa como he descrito...

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

Arduino: https://www.dropbox.com/s/uwg3ad5f7i3ultr/prueba%20finales%20de%20carrera.ino?dl=0


Título: Re: Arduino, proteus, motor y dos finales de carrera...
Publicado por: engel lex en 7 Abril 2016, 15:39 pm
puedes pasar la imagen de lo que tienes armado en proteus?


Título: Re: Arduino, proteus, motor y dos finales de carrera...
Publicado por: jgarridc en 7 Abril 2016, 15:50 pm
(http://s16.postimg.org/3sh2gp0lx/proteus.jpg)


Título: Re: Arduino, proteus, motor y dos finales de carrera...
Publicado por: engel lex en 7 Abril 2016, 16:53 pm
no veo nada que pueda causar el error, puede ser inherente a la simulación


Título: Re: Arduino, proteus, motor y dos finales de carrera...
Publicado por: jgarridc en 7 Abril 2016, 17:21 pm
En cuanto pueda lo monto en la protoboard y lo compruebo físicamente, mucha gracias.


Título: Re: Arduino, proteus, motor y dos finales de carrera...
Publicado por: Minusfour_cierralo_o_baneamefull en 10 Abril 2016, 01:28 am
El proteus es un poco castaña, prueba algo sencillo para ver si te funciona el puerto serial.
Enciende un led.

Si el puerto serie no te funciona se quedará como tu dices, llega un momento que no hace nada.


Te faltan los corchetes. El primer if va entre llaves con el resto de if para que puedan ver la variable valor. Pruebalo a ver.

Código:
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'
  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);
         }       
         if (valor == 'd' && switchIzq && !switchDer){
         digitalWrite(giroMotorDerecha, HIGH);
         }   

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