Go Down

Topic: Giro de Motor DC [ELEVADOR] (Read 2131 times) previous topic - next topic

omarigg

Dec 03, 2015, 03:14 am Last Edit: Dec 03, 2015, 02:58 pm by omarigg
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.




Code: [Select]

/*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);
  }
   
 
}


GO_zalo

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);


omarigg

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?

GO_zalo

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

omarigg

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

GO_zalo

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

omarigg

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"?

omarigg

#7
Dec 03, 2015, 04:57 am Last Edit: Dec 03, 2015, 03:00 pm by omarigg
Code: [Select]

#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);
  }
   
 
}


GO_zalo

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?

omarigg

#9
Dec 03, 2015, 06:04 am Last Edit: Dec 03, 2015, 06:09 am by omarigg
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

omarigg

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



/*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);
  }
   
 
}
       

omarigg

#11
Dec 03, 2015, 11:05 am Last Edit: Dec 03, 2015, 11:17 am by omarigg
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.

omarigg


GO_zalo

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

omarigg

#14
Dec 03, 2015, 12:37 pm Last Edit: Dec 03, 2015, 12:43 pm by omarigg
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

Go Up