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

06/04/2016 #1


Simulación arduino en proteus, problema con señal de salida.
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/ofmymx0bm0...a1.pdsprj?dl=0

Arduino: https://www.dropbox.com/s/uwg3ad5f7i...rrera.ino?dl=0
06/04/2016 #2

Avatar de Scooter

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
06/04/2016 #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...
06/04/2016 #4

Avatar de Scooter

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.
06/04/2016 #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.
06/04/2016 #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);
                  }
                 
}
---------- Actualizado después de 25 minutos ----------

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

Avatar de Scooter

Ahora tu código no va en la realidad. Porque se queda activado un final de carrera y ahí se acaba todo.
07/04/2016 #8


El final de carrera lo pulso para simularlo y luego lo dejo otra vez levantado, o sea, en LOW....en teoría ya no se queda activado...
07/04/2016 #9

Avatar de Scooter

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

Enviado desde mi fnac 5.7 mediante Tapatalk
07/04/2016 #10


Los finales de carrera los controlo yo de forma manual para simular que el motor ha llegado a su sitio...
07/04/2016 #11

Avatar de Scooter

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.


Enviado desde mi fnac 5.7 mediante Tapatalk
12/04/2016 #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);
                  }
13/04/2016 #13

Avatar de Scooter

Me colé. Está respuesta era para otro hilo.
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.