Me presento y algunas dudas

Hola, ante todo me presento. Me llamo Isidro, tengo 16 años y soy de Cádiz. Hace unos meses me compré una placa Arduino Duemilanove. He hecho varios proyectos simples, como que se encienda un led cuando no haya luz, una alarma láser, etc.

Mi duda la planteo ahora, quiero manejar 4 motores DC, de 3V cada uno. Ya me he montado mi circuito con 2 L293D. Los motores los quiero controlar manualmente, me explico: quiero que al pulsar una tecla, por ejemplo 'A', el motor 1 se mueva en una dirección, y que al soltar la tecla 'A' se detenga. Consigo controlar los motores con el monitor serial, pero no me gusta tener que estar pulsando un rato la 'A', luego darle a 'ENTER' y si quiero que se pare darle a otra tecla.

He creado este código, funcionar me funciona, pero no como yo quiero ::slight_smile:

int enable11Pin = 2;
int enable12Pin = 3;
int enable21Pin = 4;
int enable22Pin = 5;
int motor11Pin = 6;
int motor12Pin = 7;
int motor21Pin = 8;
int motor22Pin = 9;
int motor31Pin = 10;
int motor32Pin = 11;
int motor41Pin = 12;
int motor42Pin = 13;

void setup() {
  pinMode(enable11Pin, OUTPUT);
  pinMode(enable12Pin, OUTPUT);
  pinMode(enable21Pin, OUTPUT);
  pinMode(enable22Pin, OUTPUT);
  pinMode(motor11Pin, OUTPUT);
  pinMode(motor12Pin, OUTPUT);
  pinMode(motor21Pin, OUTPUT);
  pinMode(motor22Pin, OUTPUT);
  pinMode(motor31Pin, OUTPUT);
  pinMode(motor32Pin, OUTPUT);
  pinMode(motor41Pin, OUTPUT);
  pinMode(motor42Pin, OUTPUT);
  
  Serial.begin(9600);
  Serial.println("Arduino Motor Control");
  Serial.println("Pulsa 'A' o 'D' para el motor 1");
  Serial.println("Pulsa 'W' o 'S' para el motor 2");
  Serial.println("Pulsa 'Z' o 'X' para el motor 3");
  Serial.println("Pulsa 'Q' o 'E' para el motor 4");
  Serial.println();
  
}

void loop() {
  digitalWrite(enable11Pin, OUTPUT);
  digitalWrite(enable12Pin, OUTPUT);
  digitalWrite(enable21Pin, OUTPUT);
  digitalWrite(enable22Pin, OUTPUT);
    //las letras las pongo en codigo ASCII  
    if(Serial.read() == 97) {digitalWrite(motor11Pin, HIGH);
    digitalWrite(motor12Pin, LOW);} 
    if(Serial.read() == 100) {digitalWrite(motor11Pin, LOW);
    digitalWrite(motor12Pin, HIGH);}
    if(Serial.read() == 99) {digitalWrite(motor11Pin, LOW);
    digitalWrite(motor12Pin, LOW);}
    
    
    if(Serial.read() == 119) {digitalWrite(motor21Pin, HIGH);
    digitalWrite(motor22Pin, LOW);}
    if(Serial.read() == 115) {digitalWrite(motor21Pin, LOW);
    digitalWrite(motor22Pin, HIGH);}
    if(Serial.read() == 118) {digitalWrite(motor21Pin, LOW);
    digitalWrite(motor22Pin, LOW);}
    
    
    if(Serial.read() == 122) {digitalWrite(motor31Pin, HIGH);
    digitalWrite(motor32Pin, LOW);}
    if(Serial.read() == 120) {digitalWrite(motor31Pin, LOW);
    digitalWrite(motor32Pin, HIGH);}
    if(Serial.read() == 98) {digitalWrite(motor31Pin, LOW);
    digitalWrite(motor32Pin, LOW);}
    
        
    if(Serial.read() == 113) {digitalWrite(motor41Pin, HIGH);
    digitalWrite(motor42Pin, LOW);}
    if(Serial.read() == 101) {digitalWrite(motor41Pin, LOW);
    digitalWrite(motor42Pin, HIGH);}
    if(Serial.read() == 110) {digitalWrite(motor41Pin, LOW);
    digitalWrite(motor42Pin, LOW);}
    
}

Gracias

Bienvenido al foro

Para empezar te recomendaría usar un terminal de verdad, el que viene con el IDE de Arduino es una imitación.
Un terminal real, cuando aprietas una tecla la envía al momento

Yo te recomiendo putty que ni necesita instalación ni nada, no ocupa casi espacio y te sirve para otros muchos protocolos de comunicación.

http://wiki.kungfulabs.com/arduino/ardubus/comunicaciones
Deja toda la configuración como ves en la imagen final

Un saludo

Muchas gracias chiva, pero aún sigue sin funcionar como quiero. Lo que quiero es que se mueva el motor sólo cuando pulse una tecla, y cuando la suelte se pare. No se si se podrá hacer sólo en Arduino o necesita algún programita en Processing o algo. El caso es que de Processing no se absolutamente nada.

Gracias de antemano

Tienes que tener en cuenta que windows (o el s.o. que uses) mete un retardo al mandar dos letras seguidas, por lo que no se consigue una fluidez deseable.

En Processing tendrías el mismo problema, tienes que usar algún lenguaje que tenga eventos para pulsaciones de tecla, creo que C# los tenía.

Cuando dices que sigue sin funcionar como quieres, ¿como está funcionando? ¿se ha modificado algo el comportamiento al usar putty?

Un saludo

Ahora mismo, al pulsar una tecla, por ejemplo la A (97 en ASCII), se mueve el motor en un sentido, aunque suelte la tecla. Si pulso la D (100 en ASCII), ese mismo motor gira en el sentido contrario, pero nunca paran. Si quiero que paren, le he asignado la C (99 en ASCII) para que paren. Lo que quiero es que no haga falta darle a una tecla para que se paren, si no que al dejar de pulsar A o D se pare.

Al usar putty, lo que ha cambiado es que no le tengo que dar al ENTER para mandar la orden.

Gracias

Prueba esto, debería ir algo mejor:

int enable11Pin = 2;
int enable12Pin = 3;
int enable21Pin = 4;
int enable22Pin = 5;
int motor11Pin = 6;
int motor12Pin = 7;
int motor21Pin = 8;
int motor22Pin = 9;
int motor31Pin = 10;
int motor32Pin = 11;
int motor41Pin = 12;
int motor42Pin = 13;

void setup() {
  pinMode(enable11Pin, OUTPUT);
  pinMode(enable12Pin, OUTPUT);
  pinMode(enable21Pin, OUTPUT);
  pinMode(enable22Pin, OUTPUT);
  pinMode(motor11Pin, OUTPUT);
  pinMode(motor12Pin, OUTPUT);
  pinMode(motor21Pin, OUTPUT);
  pinMode(motor22Pin, OUTPUT);
  pinMode(motor31Pin, OUTPUT);
  pinMode(motor32Pin, OUTPUT);
  pinMode(motor41Pin, OUTPUT);
  pinMode(motor42Pin, OUTPUT);
  
  Serial.begin(9600);
  Serial.println("Arduino Motor Control");
  Serial.println("Pulsa 'A' o 'D' para el motor 1");
  Serial.println("Pulsa 'W' o 'S' para el motor 2");
  Serial.println("Pulsa 'Z' o 'X' para el motor 3");
  Serial.println("Pulsa 'Q' o 'E' para el motor 4");
  Serial.println();
  
}

void loop() {
  digitalWrite(enable11Pin, OUTPUT);
  digitalWrite(enable12Pin, OUTPUT);
  digitalWrite(enable21Pin, OUTPUT);
  digitalWrite(enable22Pin, OUTPUT);
  if (Serial.available() > 0){
    //las letras las pongo en codigo ASCII  
    if(Serial.read() == 97) {digitalWrite(motor11Pin, HIGH);
    digitalWrite(motor12Pin, LOW);}
    if(Serial.read() == 100) {digitalWrite(motor11Pin, LOW);
    digitalWrite(motor12Pin, HIGH);}
    if(Serial.read() == 99) {digitalWrite(motor11Pin, LOW);
    digitalWrite(motor12Pin, LOW);}
    
    
    if(Serial.read() == 119) {digitalWrite(motor21Pin, HIGH);
    digitalWrite(motor22Pin, LOW);}
    if(Serial.read() == 115) {digitalWrite(motor21Pin, LOW);
    digitalWrite(motor22Pin, HIGH);}
    if(Serial.read() == 118) {digitalWrite(motor21Pin, LOW);
    digitalWrite(motor22Pin, LOW);}
    
    
    if(Serial.read() == 122) {digitalWrite(motor31Pin, HIGH);
    digitalWrite(motor32Pin, LOW);}
    if(Serial.read() == 120) {digitalWrite(motor31Pin, LOW);
    digitalWrite(motor32Pin, HIGH);}
    if(Serial.read() == 98) {digitalWrite(motor31Pin, LOW);
    digitalWrite(motor32Pin, LOW);}
    
        
    if(Serial.read() == 113) {digitalWrite(motor41Pin, HIGH);
    digitalWrite(motor42Pin, LOW);}
    if(Serial.read() == 101) {digitalWrite(motor41Pin, LOW);
    digitalWrite(motor42Pin, HIGH);}
    if(Serial.read() == 110) {digitalWrite(motor41Pin, LOW);
    digitalWrite(motor42Pin, LOW);}
    sleep(1000)
  }
  else {//Acciones para parar los motores}
}

A pesar de que no soy ningun experto en este tema, se me ocurre la siguiente idea:

¿No sería mejor usar 4 pulsadores controlados directamente por arduino?

Es decir, en lugar de leer el serial, leería el estado de 4 pines a los que estarían conectados los 4 pulsadores que accionan los motores...

Un Saludo, Pakoff.

Gracias chiva, aunque no se por qué solo funcionan 2 motores. Intentaré investigarlo.

Pakoff, más o menos así es como lo tenía antes de comprarme el Arduino. Los motores que estoy intentando controlar son de K'nex, un sistema de construcción de barillas y conectores. Los motores traen unos commutadores que permitían cambiar el giro de los motores, pero no se pueden programar ;D .

Pronto subiré un video del engendro ;D . Estoy diseñando una atracción de feria, pero totalmente automática.

Saludos y gracias

Ya he subido el video:

Usé una LDR como sensor de posición. Al llegar a la parte superior, la LDR lo detecta y activa la secuencia de parado y caída.

Saludos

Woooooowwww!!!

Muy bonito el proyecto.

Enhorabuena!!

Pakoff.

Muchas gracias.

He probado el codigo de chiva, pero sólo funciona un motor, y de vez en cuando 2. Los motores 3 y 4 no se mueven. He combrobado las conexiones y parecen estar bien, ya que si programo que se muevan los motores 3 y 4 permanentemente, estos se mueven.

Saludos