Control de motor con dos pulsadores

Hola buenas estoy realizando un proyecto para ayudar a una persona, yo lo que quiero que haga es simple

Intentare explicarlo lo mejor que pueda, y acepto correcciones, etc.

Bueno la idea es lo siguiente, yo necesito que al apretar el pulsador 1 el motor gire por un determinado tiempo por ejemplo (7 segundos) hacia la Derecha y luego el motor se pare, ahora no importa la cantidad de veces que se apriete nuevamente el pulsador 1, el motor no tiene que arrancar, no pasar nada.

Ahora cuando apriete el pulsador 2 el motor tiene que girar el mismo tiempo (7 segundos) hacia la Izquierda, luego tiene que haber otro tiempo de espera de 7 segundos y resetear para que comience todo de nuevo.

Entonces seria

boton 1 = gira 7 segundos hacia la derecha y para. ahora no importa la cantidad veces que apriete el boton 1 no debe pasar nada.

Luego boton 2, cuando apriete el boton 2 el motor gira hacia la izquierda 7 segundos y para. luego tiene que haber un espacio de 7 segundos (aunque apriete boton 1 o boton 2 no debe pasar nada, se debe respetar la pausa de 7 segundos.

Imagen del circuito en proteus

Mi codigo ayuda.

const int pulsador1=2;
const int pulsador2=3;
const int giroA=4;
const int giroH=5;
const int onoff=6;
int estado;
unsigned long start = millis()+60000UL;
void setup() {
 // put your setup code here, to run once:
pinMode(giroA, OUTPUT);
pinMode(giroH, OUTPUT);
pinMode(onoff, OUTPUT);
pinMode(pulsador1, INPUT);
pinMode(pulsador2, INPUT);

digitalWrite(onoff, LOW);
digitalWrite(giroA, LOW);
digitalWrite(giroH, LOW);
}

void loop() {
 // put your main code here, to run repeatedly:
estado=digitalRead(pulsador1);
if(estado==HIGH){
digitalWrite(onoff, LOW);
digitalWrite(giroA, HIGH);
digitalWrite(giroH, LOW);
digitalWrite(onoff, HIGH);
delay (1000) ;
while (millis() > start);
}

estado=digitalRead(pulsador2);
if(estado==HIGH){
digitalWrite(onoff, LOW);
digitalWrite(giroA, HIGH);
digitalWrite(giroH, LOW);
digitalWrite(onoff, HIGH);
delay (1000) ;
while (millis() > start);
}
}

Hola. Como me pareció innecesario usar dos botones dejé uno solo. Lo he cambiado por el analógico A2 y lo tienes que conectar entre el pin y masa, sin usar resistencia.
Incluye una rutina para evitar los rebotes del pulsador.

unsigned long currentMillis;
unsigned long previousMillis = 0;
byte pulsador = 0;
byte giro = 0;   
byte Estpulsador = 0;

void setup() {
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(A2,INPUT_PULLUP);
}

void loop() {
currentMillis = millis();  
  if (Estpulsador == 0){ leerboton(); }
   else {
    if (currentMillis - previousMillis > 7000 ){digitalWrite(giro, LOW);} // Si pasaron 7 segundos
    if (currentMillis - previousMillis > 14000 ) { Estpulsador = 0; } // Si pasaron 14 segundos
   }
} 

void leerboton() {
bool pin_status;
 pin_status = digitalRead(A2);
  if (pin_status == LOW && pulsador != 128) { pulsador = 128; }
  if (pin_status == HIGH && pulsador == 128) {
    pulsador = 1;
    Estpulsador = 1;
    if (giro == 4) { giro = 5;} else { giro = 4;}
    digitalWrite(giro, HIGH);
    previousMillis = currentMillis;
  }
}

Me gustaría saber cual será la utilidad de este código. Saludos

Hola Daniel_ARG disculparme que te contradiga en los botones pero si o si tiene que llevar 2 botones, por la forma de realizar el circuito son 2 botones que están alejados entre si y tienen que estar en 2 lugares, mas que nada por eso no puede ser 1 botón. Gracias por tomarte el tiempo en responder y ayudarme :).

¿Para que escribes lo siguiente?

acepto correcciones y cambio de elementos, etc.

Pasaron dos post que no dices de que va tu proyecto, para que sirve en la vida real....
¿Piensas que somos adivinos?

Daniel_Arg, no aclare el resto por que no era necesario pienso yo.

Discúlpame mala mía, este circuito me va a ayudar a colocarlo con otro mas que tengo hecho y elementos mecánicos en una silla de rueda para realizar acciones especiales.

Sigo sin entender ¿Porque usa silla de ruedas tendría un motor que marcha por 7 segundo para un lado y otros 7 segundos para el otro?

Me niego a modificar algo del código que por cierto me llevó un tiempo y que tu podrías emplear un 10% de ese tiempo en explicar todos los detalles de lo que intentas hacer y porque.

Considero al foro como una base de conocimiento al que cualquiera puede consultar. No lo hago por vos exclusivamente sino también por otros que puedan necesitarlo.

Incluso podrías editar el título de tu consulta para que sea descriptiva.

¿Quien dice que el mismo botón no pueda estar en dos lugares distintos?
Pediste que el código hiciera algo y lo que te dí hace eso pero con un solo botón que puede estar en mas de un lugar físico.

Daniel_ARG bueno discúlpame es la primera ves que posteo algo acá y no entendía la pagina lo hice rápido solo para obtener la ayuda nada mas, la silla de ruedas tiene un pequeño brazo mecánico que ayuda a subir los cordones y bordes no superiores a 20 cm.

Lo de los botones, no entendí como quedaría si dejamos 1 solo, como realizaria la parte que si se aprieta muchas veces funcione? luego de que pare. Mi pregunta es, si se accionara o pasara algo, por eso pence con 2 y se me hace mas cómodo para mi con 2 botones.

después no entiendo como cambiar el titulado o referencia del post siy nuevo en esto pero cuando lo termine te pasare fotos del proyecto :slight_smile:

En un protoboard pon tu arduino y en las salidas 4 y 5 pon u par de led's con resistencia y en el pin A2 un pulsador a masa y prueba el código.

Este código anula el pulsador una vez que se oprimió y lo reestablece pasados los 7 segundos que el motor deje de girar. Al restablecer botón, si se pulsa nuevamente cambio al giro contrario.

Intenta comprender como lo he hecho porque seguramente no será el código final que uses y debas modificarlo

Daniel_Arg bueno gracias por tu tiempo igual también me podrías ayudar a modificar mi código tendría que agregarle la linea ""unsigned long currentMillis;""" te pregunto por que no se, esto te ayuda para poder descontar los 7 segundos?

Para la próxima lee las instrucciónes que te pasé por privado.
Enlaces, códigos/errores e imágens se deben postear con etiquetas.
Iintenta subir la imagen a este respositorio y no usar respositorios externos porque pasa 1 tiempo y se pierden el el hilo queda descolgado.
No lo olvides.

Tienes una silla que posiblemente sea para subir una escalera (lo estoy imaginando pero tiene sentido). Tu pensaste en dos botones uno en cada sitio extremo.
Lo que Daniel te sugiere es que el botón este en la silla y por eso basta con 1 solo.

Bueno para el próximo post lo tendré muy en cuenta y entiendo lo del botón, pero necesito que tenga 2 botones y para un lado del giro y otro para el otro lado, lo necesito así por como tengo la estructura y como lo tengo pensado, no es que sea porfiado pero lo necesito así y que me ayuden a resolver el problema de esta manera.

Buen día Andrés. Y que pasa si al principio aprieto el botón nº 2 ? Tiene que girar el motor a la izquierda o debería estra bloqueado ? Es necesario que expliques bien todas las funciones a realizar y las que no, asi alguien puede ayudarte.

Pablo_lucuni

Pido disculpa de nuevo por lo mal que redacte el post, si se aprieta el botón 2 no debería pasar nada tendría que estar bloqueado

esto tendría que hacer lo explico de nuevo

funcionaria así

se aprieta botón 1

se comienza el giro hacia la derecha y para ahora no importa las veces que se apriete el botón 1 no debe pasar nada.

cuando se aprieta el botón 2 debe apretarse el girar 7 seg para el otro lado aunque esta apretándoselo el botón 1 el motor debe girar 7 segundo igual, y luego hacer una pausa de 7 segundos aunque se estén apretando los 2 botones se debe estar haciendo la pausa igual.

luego comienza el ciclo de nuevo.

Bueno yo creo que la lógica era al menos entendible para alguien que ahora lee todo.

Tampoco hacia falta saber que razón existe para usar dos pulsadores que accionan un motor y condicionar la ayuda, por favor!!!

Esta es mi versión de acuerdo a lo que puso el autor y usando sus pines no nuevos.

const byte pulsador1  = 2;
const byte pulsador2  = 3;
const byte giroA      = 4;
const byte giroH      = 5;
const byte onoff      = 6;
bool estado1, estado1Ant = false;
bool estado2, estado2Ant = false;
unsigned long start = millis();
bool flag1 = false, flag1 = false;

void setup() {
  // put your setup code here, to run once:
  pinMode(giroA, OUTPUT);
  pinMode(giroH, OUTPUT);
  pinMode(onoff, OUTPUT);
  pinMode(pulsador1, INPUT);
  pinMode(pulsador2, INPUT);

  digitalWrite(onoff, LOW);
  digitalWrite(giroA, LOW);
  digitalWrite(giroH, LOW);
}

void loop() {

  if (!flag2) {
      estado1 = digitalRead(pulsador1);
      if (estado1 && !estado1Ant){
          flag1 = true;             // pulsador lo enciende
          start = millis();
      }
      estado1Ant = estado1;

      if (flag1 && (millis() - start > 7000UL)) {
          flag1 = false;            // esto detiene motor
      }
  }

  if (!flag1) {
      estado2 = digitalRead(pulsador2);
      if (estado2 && !estado2Ant) {
          flag2 = true;
          start = millis();
      }   
      estado2Ant = estado2;
      if (flag2 && (millis() - start > 7000UL)) {
          flag2 = false;            // esto detiene motor
      }
  }
  
  if (flag1 || flag2)
      giro();
}

void giro() {
  digitalWrite(onoff, LOW);
  digitalWrite(giroA, HIGH);
  digitalWrite(giroH, LOW);
  digitalWrite(onoff, HIGH);
}

Haciendo caso a lo sugerido por @Pablo_Lucini, los pulsadores no pueden iniciar secuencias pero el sistema se rearma cuando ambos cumplen el ciclo.
En todo caso eso podemos ajustarlo.

const int pulsador1=2;
const int pulsador2=3;
const int giroA=4;
const int giroH=5;
//const int onoff=6;
int estado=0;
//unsigned long start = millis()+60000UL;
void setup() {
 // put your setup code here, to run once:
pinMode(giroA, OUTPUT);
pinMode(giroH, OUTPUT);
//pinMode(onoff, OUTPUT);
pinMode(pulsador1, INPUT_PULLUP);
pinMode(pulsador2, INPUT_PULLUP);

//digitalWrite(onoff, LOW);
digitalWrite(giroA, LOW);
digitalWrite(giroH, LOW);
}

void loop() {
 // put your main code here, to run repeatedly:
while (estado==0){
  digitalRead(pulsador1);

if(pulsador1==LOW){
//digitalWrite(onoff, LOW);
digitalWrite(giroA, HIGH);
digitalWrite(giroH, LOW);
//digitalWrite(onoff, HIGH);
delay (7000) ;
digitalWrite(giroA, LOW);
digitalWrite(giroH, LOW);
estado=1;
//while (millis() > start);
break;
}
}

while(estado==1){
  digitalRead(pulsador2);

if(pulsador2==LOW){
//digitalWrite(onoff, LOW);
digitalWrite(giroA, LOW);
digitalWrite(giroH, HIGH);
//digitalWrite(onoff, HIGH);
delay (7000) ;
//while (millis() > start);
digitalWrite(giroA, LOW);
digitalWrite(giroH, LOW);
delay(7000);
estado=0;
break;
}
}
}

Este sería un codigo que posiblemente te sirva. Fijate que estoy suponiendo que es un motor de continua y la inversión de giro se da por inversión de polaridad del motor ( giroA y giroH ). No termino de entender por que usaste onoff si en el esquemático no está conectado a nada. Fijate que puse las entradas de los pulsadores en pullup para evitar las resistencias, directamente conectas cada pulsador del pin de arduino a masa. el flag estado ahora indica que pulsador habilitar.

surbyte:
Tampoco hacia falta saber que razón existe para usar dos pulsadores que accionan un motor y condicionar la ayuda, por favor!!!

El usuario antes de editar el mensaje escribió lo siguiente.

acepto correcciones y cambio de elementos, etc.

Al menos para mi si es necesario saber y comprender que intenta hacer, cosa que no tengamos que andar escribiendo código en base a suposiciones porque tengo las sospechas que esto no pasa de los deseos y las buenas intenciones como es la gran mayoría de las consultas a este foro. Tampoco es que ya tenga desarrollado el PCB, y si así fuera "suponiendo que se trata de dos brazos a motor"

¿Que pasará con dos motores que se mueven por tiempo cuando la carga sea diferente, ya sea por el peso del paciente o el obstáculo a sortear? ¿Que pasa si el mecanismo llega a su tope y el motor intenta seguir girando? ¿Y si el mecanismo necesita finales de carrera?

También escribió:

2 botones que están alejados entre si y tienen que estar en 2 lugares

Ni siquiera sabemos que esos pulsadores serán accionados por el propio mecanismo o el paciente que se traslada en la silla. En cuanto a la distancia entre botones ¿Cual sería esa distancia entre ellos y porque no deben estar al alcance de la mano?

Pablo_Lucini también vio que puso en el código un pin no conectado en el esquema.

No es que le niego la ayuda, de hecho fui el primero en darle un código que hace lo que quería sin rebotes del botón pero NO me gusta hacer algo por capricho de quien lo solicita para que todo termine luego en el tacho de la basura.

Pablo soy Andres el de los 2 pulsadores me podrias facilitar una imagen de coneccion con el tema de los pulsadores por que no te entendi mucho o lo hago mal el proteus por que me sale detecto 5vts y gnd

Se que no es el medio capas por aca pero estoy medio desesperado por que quiero que funcione, te pido disculpa si te molesta que te escriba por aca y no por el foro o el perfil de la publicación.

pd: pude compilar tu código :slight_smile: el del otro chico me sale error pero bueno saque la resistencia y no hace nada cargue el codigo pero no pasa nada

Ahi te mandé una foto de como van los pulsadores. No están indicadas las alimentaciones del arduino y del driver del motor, pero eso lo sabés. Cualquier cosa avisame. Suerte

Me enviaste un privado diciendo que te daba error, te pedí que indiques el error.
En la imagen que capturas que veo capturaste toda la pantalla del IDE cuando solo puedes copiar y pegar el error que estaba aca

bool flag1 = false, flag1 = false;

dime, cual te parece que sea el error.

A ver.. a toda la comunidad Arduino, me dirijo a @Andres_Ragnar no a Uds, o sea, no respondan.
Espero que el se de cuenta porque es obvio de que se trata todo esto.

Cuando leemos hay que hacerlo asi y estoy desesperado, se trata de trabajo escolar. Simple, entonces como dice @ArduMyth lejos de esperar a que te hagan todo, a ver si te esfuerzas un poco, solo un poco.

Repito, el error esta ahi. Y además el ide te dice que error es. Si no sabes ingles copia ypega y llevalo a Google translate.

Usa la herramientas que la tecnología te da. No todo es preguntar.