Hola saludos, el tema es que estoy intentando controlar un motor DC y no consigo llegar a buen puerto.
El circuito consta de arduino uno, motor y dos pulsadores y un terminal virtual.
Al encender el arduino si los dos switch estan arriba (LOW) e introduzco la letra R por el terminal el motor se mueve a la derecha (aunque he de meter la R varias veces, no lo entiendo). Con el switch abajo(HIGH) el motor se para y si meto la letra I el motor se desplaza hacia la izquierda, suelto el switch (simulando final de carrera) y cuando pulso el switch izquierdo el motor se para. Pero con el switch izquierdo pulsado si introduzco la letra D para que el motor se desplace hacia la derecha, en este caso no me responde, a no ser que introduzca continuamente la letra D.
El código:
int giroMotorDerecha = 13;
int giroMotorIzquierda = 12;
int sensorDerecha = 11;
int sensorIzquierda = 10;
char valor;
void setup()
{
pinMode(giroMotorDerecha, OUTPUT);
pinMode(giroMotorIzquierda, OUTPUT);
pinMode(sensorDerecha, INPUT);
pinMode(sensorIzquierda, INPUT);
Serial.begin(9600); // inicializa comunicación serie
}
void loop()
{
reset(100);
paroMotorDerecha(100);
moverMotorIzquierda(100);
paroMotorIzquierda(100);
moverMotorDerecha(100);
}
void reset(int pasos)
{
valor = Serial.read();
if (((valor == 'R') && ((digitalRead(sensorDerecha) == LOW) && (digitalRead(sensorIzquierda) == LOW))))
{
digitalWrite(giroMotorDerecha, HIGH);
delay(100);
}
}// fin void reset
void paroMotorDerecha(int pasos)// inicio paroMotorDerecha
{
if (digitalRead(sensorDerecha) == HIGH)
{
digitalWrite(giroMotorDerecha, LOW);
delay(100);
}
}//fin void paroMotorDerecha
void paroMotorIzquierda(int pasos)// inicio paroMotorIzquierda
{
if (digitalRead(sensorIzquierda) == HIGH)
{
digitalWrite(giroMotorIzquierda, LOW);
delay(100);
}
}// fin void paroMotorIzquierda
void moverMotorIzquierda(int pasos) //inidio moverMotorDerecha
{
valor = Serial.read();
if (((valor == 'I') && ((digitalRead(sensorDerecha) == HIGH)&& (digitalRead(sensorIzquierda) == LOW))))
{
digitalWrite(giroMotorIzquierda, HIGH);
delay(100);
}
}// fin void moverMotorIzquierda
void moverMotorDerecha(int pasos)//inicio void moverMotorDerecha
{
valor = Serial.read();
if (((valor == 'D') && ((digitalRead(sensorIzquierda) == HIGH)&& (digitalRead(sensorDerecha) == LOW))))
{
digitalWrite(giroMotorDerecha, HIGH);
delay(100);
}
}// fin void moverMotorDerecha
Corregido, lo siento....si si al introducir la letra R por el terminal virtual y no haber ningún pulsador metiendo HIGH en el arduino el motor se desplaza a la derecha... el problema lo tengo cuando el pulsador izquierdo está en HIGH y al introducir la letra D el motor vaya a la derecha, pero sólo lo hace cada vez que introduzco la letra D, una fracción de tiempo y se para....
Porque en tu código has puesto tantos delays que detienen la marcha del códigoi hasta que se cumplen.
Si tienes un programa con comandos no puedes usar delays.
Mira el ejemplo BlinkWithoutDelay.ino y si no lo entiendes busca en Google: Arduino millis()
Si me he dado cuenta, he quitado todos los delay... pero sigo igual, al llegar a la posición en la que el sensor izquierdo está activado, al introducir la letra D por el terminal virtual, no me responde arduino.
int giroMotorDerecha = 13;
int giroMotorIzquierda = 12;
int sensorDerecha = 11;
int sensorIzquierda = 10;
char valor;
void setup()
{
pinMode(giroMotorDerecha, OUTPUT);
pinMode(giroMotorIzquierda, OUTPUT);
pinMode(sensorDerecha, INPUT);
pinMode(sensorIzquierda, INPUT);
Serial.begin(9600); // inicializa comunicación serie
}
void loop()
{
reset();
paroMotorDerecha();
moverMotorIzquierda ();
paroMotorIzquierda();
moverMotorDerecha ();
paroMotorDerecha();
}
void reset()
{
valor = Serial.read();
while (((valor == 'R') && ((digitalRead(sensorDerecha) == LOW) && (digitalRead(sensorIzquierda) == LOW))))
{
digitalWrite(giroMotorDerecha, HIGH);
}
}// fin void reset
void paroMotorDerecha()// inicio paroMotorDerecha
{
if (digitalRead(sensorDerecha) == HIGH)
{
digitalWrite(giroMotorDerecha, LOW);
}
}//fin void paroMotorDerecha
void moverMotorIzquierda()
{
valor = Serial.read();
if (((valor == 'I') && (digitalRead(sensorDerecha) == HIGH)))
{
digitalWrite(giroMotorIzquierda, HIGH);
}
}// fin void moverMotorIzquierda
void paroMotorIzquierda()// inicio paroMotorIzquierda
{
if (digitalRead(sensorIzquierda) == HIGH)
{
digitalWrite(giroMotorIzquierda, LOW);
}
}// fin void paroMotorIzquierda
void moverMotorDerecha()//inicio void moverMotorDerecha
{
valor = Serial.read();
if (((valor == 'D') && (digitalRead(sensorIzquierda) == HIGH)))
{
digitalWrite(giroMotorDerecha, HIGH);
}
}// fin void moverMotorDerecha
Hola, muchas gracias por la ayuda, pero sigo en las mismas....te comento, Con la Opción R del puerto serie y los dos switch en LOW lo que quiero es que el motor se mueva a la derecha hasta que el switch de la derecha esté HIGH, no hay problema, cambio el giro del motor derecha de LOW a HIGH y solucionado.
Entonces una vez que el switch de la derecha está activado, al meter por el puerto serie la I el giro se hace hacia la izquierda, hasta aquí bien. Pero cuando simulo el switch de la izquierda el simulador de proteus sigue girando el motor hacia la izquierda y no se para. Ya no sé si es algún problema del SW de proteus.
hola, gracias por la ayuda, ya he conseguido casi que funcione, con tu código....menuda cara de tonto se me ha quedado, jaja, yo lo estaba haciendo difícil no, lo siguiente...
Ahora sólo tengo un error en la simulación, y es que cuando he probado todo el circuito y sus distintas posiciones, cuando vuelve a girar el motor a la derecha y pulso el switch de la derecha para parar el motor, éste funciona a saltos. He colocado un voltímetro en la patilla 13 que es la que alimenta al L293D y verifico que me está entregando una tensión de 5 voltios a impulsos, probablemente por algún fallo HW.
Hola saludos, ¿pudiste mirar el problema?, me estoy volviendo loco con el pulso de tensión que me sale de la patilla del arduino hacia el l293d, no entiendo el motivo por el que sale tensión cuando mediante Sw se le está diciendo que no saque nada...
Hola, ya he conseguido que me haga todos los movimientos sin problema, ahora he de averiguar como poder hacer que sea infinito, ya que una vez hecho todos los movimientos he de hacer un reste al arduino para poder empezar de nuevo con el buble. Te dejo el 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);
if (valor == 'd' && switchIzq && !switchDer)
digitalWrite(giroMotorDerecha, HIGH);
if (valor == 'i' && switchDer && !switchIzq)
digitalWrite(giroMotorIzquierda, HIGH);
}
ahora he de averiguar como poder hacer que sea infinito, ya que una vez hecho todos los movimientos he de hacer un reste al arduino para poder empezar de nuevo con el buble
Intenta escribir en un castellano neutro.
SI yo respondo en argentino no me entiende nadie.
No se que es bublle, ni que quieres restarle.
jajajaj, disculpa pero estaba cansado y se me fueron los dedos, las palabras esas no existen...
Lo que quería decir es que el programa una vez que se ha ejecutado no puedo reiniciarlo, una vez que todas las sentencias IF se han cumplido el programa termina y si pulso los switch y mando las órdenes por el terminal virtual el motor ya no se mueve más, me gustaría que el programa estuviera ejecuntándose siempre y que el motor no dejara de moverse nunca, cada vez que entre algún comando por el terminal virtual y vaya pulsando los switch...
En mi simulación sigue funcionando, porque a ti no te funciona mas.
Mira como funciona: cuando tu le envias D debe girar a la derecha. Como en el buffer UART hay datos se ejecuta la lectura del puerto serie y valor se carga con ´D´ y entonces el if correspondiente a D se ejectua en cada ciclo hasta que presiones otra cosa, porque valor no se va alterar hasta entonces.
vaya yo hablando del programa que te posteé y ahora veo que tu agregaste esto:
Hola, sí esas líneas las estaba usando pero no las eliminé, disculpa...
Pues te comento lo que pasa:
1- Si tengo switchDer y switchIzq en LOW y meto R = motor derecha hasta switchDer HIGH que el motor para.
2- switchDer HIGH y I, el motor gira a izquierda hasta que pongo el switchIzq en HIGH, que el motor para.
3- Con el switchIzq HIGH si meto D el motor va ha derechas, hasta que pongo el switchder en HIGH, motor para.
Pero una vez realiza esta secuencia, si quiero volver a empezar de nuevo me toca desconectar la electricidad en la simulación de arduino y volver a empezar.
A ver si nos entendemos.
2 y 3 deben parar porque tu detuviste las secuencias con los switches Izq y Der en HIGH, como quieres que siga si eso le has pedido que haga?
Ademas en la practica si un motor gira a la derecha y alcanza el limite de carrera, no puede ni DEBE seguir.
si presionas Reset es para detener el motor, que quieres que haga luego? pues quedarse detenido.
En 2. si el motor llega al extremo izquierdo lo que tu estas haciendo mal es que el motor al llegar al limite izquierdo debe producirse un cambio en el switch izquierdo.
Lo mismo cuando gira a derecha y el switch derecho (limite de carrera) debe cambiar tambien deteniendo el giro.
Eso habilita que tu pueas moverte en sentido opuesto.