Giro de Motor DC [ELEVADOR]

Buenas tardes gente del foro, estoy en un proyecto para controlar el giro de un motor dc, para implementarlo en un elevador, mi idea es utilizar botones n/a para activar el motor (asi el elevador suba) e incluir sensores ir, emisor-receptor a los niveles de cada piso, para eso estoy intentando armar el codigo en el ide de arduino.
He empezado por experimentar con puros botones n/a y n/c, para despues implementar el concepto en el edificio a escala y ya con los ir. Uno de los inconvenientes que he encontrado es el enclavamiento del boton, (cuando presiono el boton y lo suelto y el motor sigue en movimiento) aunque crei haberlo solucionado con un else if despues del if que activa el motor, pero tampoco me funciona al 100, ya que solo para el giro cuando va hacia uno de los lados. Espero alguien me pueda corregir y aconsejarme en el codigo.
Gracias por su tiempo.

/*Control de relay*/
int relay = 10;
int relay2 = 11;
int boton = 9;
int boton2 = 3;
int botonp1 =3;
int botonp2 =4;
int cont = 0;


void setup() {                

  pinMode(relay, OUTPUT);  
  pinMode(relay2, OUTPUT);  
  pinMode(boton, INPUT); 
  pinMode(boton2, INPUT);
  pinMode(botonp1, INPUT);
  pinMode(botonp2, INPUT);
}

void loop() {
  
  if (digitalRead (9) == HIGH){
    digitalWrite ( relay, HIGH);
    digitalWrite ( relay2, LOW);
  }
    else if (digitalRead (3) != HIGH){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay, LOW);
  }
   if (digitalRead (7) == HIGH){
    digitalWrite ( relay2, HIGH);
    digitalWrite ( relay, LOW);
   }
  else if (digitalRead (4) != HIGH){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay, LOW);
  }
    
  
}

defines 4 botones, (dos de ellos con el pin numero 3 lo cual es el primer error) y los inicializas (correcto)
pero luego en vez de usarlos igual que haces con realy y relay2 (correcto) usas pines que no has definido (segundo error)

Finalmente y para rematar el desproposito del codigo envias dos digitalWrite ( relay, LOW); en vez de enviar uno al relay y otro al relay2, (tercer error) por eso se queda girando toques el boton que toques, nunca haces digitalWrite ( relay2, LOW);

Ya lo he arreglado! ha quedado perfecto, que descuido, gracias por tu respuesta! aprovechando, he leido algo sobre el antirebote, para los mecanismos mecanicos, pero crees que sera necesario implementar tambien esa parte para le proyecto?

si, deberías tenerlo en cuenta, por que pese a que no notarias el efecto en el movimiento del ascensor (probablemente) si lo notarias en la actuación de los reles, que por cada pulsación realizarían varias conmutaciones reduciendo su vida útil y generando toda clase de problemas

de todas formas yo para manejar varios pulsadores uso la librería button que te simplifica enormemente el trabajo elimina la necesidad de pensar en los rebotes, incluso permite detectar pulsaciones largas, dobles cliks etc etc

Muy bien, donde podria encontrar mas informacion sobre la libreria button?

en el enlace del anterior post esta todo explicado y puedes descargar la librería aqui

Ya he intentado implementarlo en el codigo, pero no entiendo por ejemplo como sustituiria el " else if (digitalRead (4) != HIGH)"? como puedo representar un "is not Pressed"?

#include <Button.h>

/*Control de relay*/
int relay = 10;
int relay2 = 11;
Button button = Boton1(7,PULLUP);
Button button = Boton2(9,PULLUP);
Button button = BotonP1(3,PULLDOWN);
Button button = BotonP2(4,PULLDOWN);



void setup() {                

  pinMode(relay, OUTPUT);  
  pinMode(relay2, OUTPUT);  
  pinMode(Boton1, INPUT); 
  pinMode(Boton2, INPUT);
  pinMode(BotonP1, INPUT);
  pinMode(BotonP2, INPUT);
}

void loop() {
  
  if(Boton1.isPressed()){
    digitalWrite ( relay, HIGH);
    digitalWrite ( relay2, LOW);
  }
    else if (BotonP1.isPressed){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay, LOW);
  }
   if (Boton2.isPressed()){
    digitalWrite ( relay2, HIGH);
    digitalWrite ( relay, LOW);
   }
  else if (BotonP2.isPressed){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay2, LOW);
  }
    
  
}

que es lo que quieres que gire mientras esta pulsado y al soltar pare? o que empiece a girar cuando pulses y pare con P1 y P2?

Lo que quiero es que halla 3 botones, para que me lleve a cada uno de los pisos, esos son Boton 1 y Boton2 (y me falta otro) despues pienso implementar tambien otros 3 botones para que baje, (sentido contrario de motor) la idea es que el sensor infrarojo detecte el elevador y corte el circuito, actuando como boton de paro, que es lo que manejo como BotonP1 y BotonP2 las señales de los infrarojos, para que el elevador pare en el piso deseado

Me urge porque tengo que entregarlo mañana, espero puedas ayudarme, me parece que si necesitare la libreria porque asi me da muchos falsos

Llevo horas inentando resolver este codigo, pero no lo puedo hechar a andar :confused:

/Control de relay/
int relay = 10;
int relay2 = 11;
int BotonDer1 = 9;
int BotonDer2 = 8;
int BotonDer3 = 6;
int BotonIzq1 = 7;
int BotonIzq2 = 3;
int BotonIzq3 = 12;
int botonp1 =2;
int botonp2 =4;

void setup() {

pinMode(relay, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(BotonDer1,INPUT);
pinMode(BotonDer2,INPUT);
pinMode(BotonDer3,INPUT);
pinMode(BotonIzq1,INPUT);
pinMode(BotonIzq2,INPUT);
pinMode(BotonIzq3,INPUT);

pinMode(botonp1, INPUT);
pinMode(botonp2, INPUT);
}

void loop() {
//PUSHBOTTON ARRANQUE DERECHO 1
if (digitalRead (9) == HIGH){
digitalWrite ( relay, HIGH);
digitalWrite ( relay2, LOW);
}
else if (digitalRead (2) != HIGH){
digitalWrite ( relay, LOW);
digitalWrite ( relay, LOW);
}
//PUSHBOTTON ARRANQUE DERECHO 2
if (digitalRead (8) == HIGH){
digitalWrite ( relay, HIGH);
digitalWrite ( relay2, LOW);
}
else if (digitalRead (4) != HIGH){
digitalWrite ( relay, LOW);
digitalWrite ( relay, LOW);
}

//PUSHBOTTON ARRANQUE DERECHO 3
if (digitalRead (6) == HIGH){
digitalWrite ( relay, HIGH);
digitalWrite ( relay2, LOW);
}
else if (digitalRead (5) != HIGH){
digitalWrite ( relay, LOW);
digitalWrite ( relay, LOW);
}

//PUSHBOTTON ARRANQUE IZQUIERDO 1
if (digitalRead (7) == HIGH){
digitalWrite ( relay2, HIGH);
digitalWrite ( relay, LOW);
}
else if (digitalRead (2) != HIGH){
digitalWrite ( relay, LOW);
digitalWrite ( relay2, LOW);
}

//PUSHBOTTON ARRANQUE IZQUIERDO 2
if (digitalRead (3) == HIGH){
digitalWrite ( relay2, HIGH);
digitalWrite ( relay, LOW);
}
else if (digitalRead (13) != HIGH){
digitalWrite ( relay, LOW);
digitalWrite ( relay2, LOW);
}

//PUSHBOTTON ARRANQUE IZQUIERDO 3
if (digitalRead (12) == HIGH){
digitalWrite ( relay2, HIGH);
digitalWrite ( relay, LOW);
}
else if (digitalRead (5) != HIGH){
digitalWrite ( relay, LOW);
digitalWrite ( relay2, LOW);
}

}

Me ha faltado declarar el pin 5 como botonp3 , (boton de paro, sensor3), ya lo he corregido, pero sigue sin funcionar.
Hasta ahora solo consigo que el motor gire hacia ambos sentidos, 3 botones para izquierdo y 3 botones para derecho, pero el paro de todos los botones es con el primer sensor "botonp1"
cuando cada boton deberia avanzar y parar en su sensor correspondiente.
Aclaro tambien que aun me falta incluir otro sensor ir, que incluire en el pin 13.

Asi luce el circuito

Tienes que leer las normas de foro para saber cómo postear códigos e imágenes

La imagen no se ve, pero si la conexión es la misma para todos los PUSHBOTTON deberías hacer siempre digitalRead xx == HIGH y veo que los paros los haces con != HIGH

Además todos los arranques a derechas son iguales así que los podrías unificar en un if

Y todos los los giros izquierda y paros lo mismo

pero si unificara todos los arranques por ejemplo en un if, no tendria su mando, mi idea es que cada boton lleve a cierto pizo, asi por ejemplo suponiendo que esta en el piso1 (planta baja) presiono el BotonDer3 y me lleva hasta el piso 3 que es donde lo detiene el corte de señarl de 3er sensor, y asi ocupa una instruccion sobre donde parar en cada uno de los botones, entonces como unificarlos?
y en lo del != HIGH que no deberia ser asi, porque lo que necesito es que si no esta HIGH osea si se presiono debido que es n/c (emisor y receptor infrarojo) ??

Gracias por tu respuesta, empiezo a ver avanzes, gracias a ti amigo, espero terminar pronto y disculpen si me he pasado algunas normas del foro, ando muy apresurado :S

Vale pero no veo la imagen así que no se como esta conectado

Deberías poner el pulsador entre el pin y gnd y activar PinMode(xx, INPUT_PULLUP)

Espero ahora si puedas visualizar las fotos

De verdad esperas que aprecie como esta conectado nada en esa foto?

Lee las normas del foto y postea una imagen del diseño de conexiones con las etiquetas correctas para que siga ayudándote

/*Control de relay*/
int relay = 10;
int relay2 = 11;
int BotonDer1 = 9;
int BotonDer2 = 8;
int BotonDer3 = 6;
int BotonIzq1 = 7;
int BotonIzq2 = 3;
int BotonIzq3 = 12;
int botonp1 =2;
int botonp2 =4;
int botonp3 =5;



void setup() {                

  pinMode(relay, OUTPUT);  
  pinMode(relay2, OUTPUT);  
  pinMode(BotonDer1,INPUT); 
  pinMode(BotonDer2,INPUT); 
  pinMode(BotonDer3,INPUT); 
  pinMode(BotonIzq1,INPUT); 
  pinMode(BotonIzq2,INPUT); 
  pinMode(BotonIzq3,INPUT); 
  
  pinMode(botonp1, INPUT);
  pinMode(botonp2, INPUT);
  pinMode(botonp3, INPUT);
}

void loop() {
  //PUSHBOTTON ARRANQUE DERECHO 1
  if (digitalRead (9) == HIGH){
    digitalWrite ( relay, HIGH);
    digitalWrite ( relay2, LOW);
  }
    else if (digitalRead (2) != HIGH){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay, LOW);
  }
//PUSHBOTTON ARRANQUE DERECHO 2
 if (digitalRead (8) == HIGH){
    digitalWrite ( relay, HIGH);
    digitalWrite ( relay2, LOW);
  }
    else if (digitalRead (4) != HIGH){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay, LOW);
  }

//PUSHBOTTON ARRANQUE DERECHO 3
 if (digitalRead (6) == HIGH){
    digitalWrite ( relay, HIGH);
    digitalWrite ( relay2, LOW);
  }
    else if (digitalRead (5) != HIGH){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay, LOW);
  }
  
  //PUSHBOTTON ARRANQUE IZQUIERDO 1
   if (digitalRead (7) == HIGH){
    digitalWrite ( relay2, HIGH);
    digitalWrite ( relay, LOW);
   }
  else if (digitalRead (2) != HIGH){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay2, LOW);
  }

    //PUSHBOTTON ARRANQUE IZQUIERDO 2
   if (digitalRead (3) == HIGH){
    digitalWrite ( relay2, HIGH);
    digitalWrite ( relay, LOW);
   }
  else if (digitalRead (13) != HIGH){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay2, LOW);
  }

    //PUSHBOTTON ARRANQUE IZQUIERDO 3
   if (digitalRead (12) == HIGH){
    digitalWrite ( relay2, HIGH);
    digitalWrite ( relay, LOW);
   }
  else if (digitalRead (5) != HIGH){
      digitalWrite ( relay, LOW);
      digitalWrite ( relay2, LOW);
  }
    
  
}

Disculpa las molestias, he subido tres imagenes a google drive, para que se vean con mejor calidad, tambien dibuje un pequeño diagrama de como hize las conexiones, omiti los otros 3 pushboton que son para el giro inverso, solo es para demostrar como hize las conexiones.

si te hace falta algo mas pidemelo, espero me puedas ayudar con este codigo. muchas gracias por tu tiempo.

Si has podido ver las imagenes?