Control de giro de motor con un boton

hola a todos compañeros

He tratado de fusionado 2 ejemplos de las libreria de RDB:BUTTON Y RBD:MOTOR , para controlar un motor con un boton , el codigo trabajaria asi presiono el boton se enciende el motor,el ejemplo hace que el motor gire a la izq y luego a la derecha , pero le quiero hacer funcionar al presionar
el boton

despues quisiera ir integrando las demas libreria RBD

libreria RBD

#include <RBD_Timer.h>  // https://github.com/alextaujenis/RBD_Timer
#include <RBD_Button.h> // https://github.com/alextaujenis/RBD_Button
#include <RBD_Motor.h>

// input pullup enabled by default
RBD::Button button(2);

// motor shield
RBD::Motor motor(9, 11, 8); // pwm pin, forward pin, reverse pin

void setup() {
  motor.rampUp(500);


}

void loop() {
  spin_direction();
}

void spin_direction() {
  while (button.onPressed()) {
    spin_direction();

    motor.update();
    if (motor.onTargetSpeed()) {
      if (motor.isOn()) {
        motor.rampDown(500);
      }
      else {
        motor.toggleDirection();
        motor.rampUp(500);
      }
    }
  }
}

Hola, ¿forzosamente tienes que usar esas librerias? porque para mi es mas fácil sin usarlas, si lo que tu quieres es solamente encender el motor y cambiar el giro con un solo botón es fácil usando un puente h y unas cuantas lineas de código, creo que esto es lo que necesitas:

const int pulsador=2;      //señal del boton
int derecha=8;             //salida al puente h para giro a la derecha (puedes usar cualquier otro pin)
int izquierda=9;          //giro izq
boolean estado_pul=true;   //para guardar el estado del  pulsador (lo inicializo en 1 porque lo tienes pull-up)
boolean estado_ant_pul=true;
int direccion=0;        //con esta variable vamos a controlar el motor     
   

void setup() {
 pinMode(pulsador,INPUT_PULLUP);
 pinMode(derecha,OUTPUT);
 pinMode(izquierda,OUTPUT);
 digitalWrite(derecha,LOW);     //comienza con el motor apagado
 digitalWrite(izquierda,LOW);
}

void loop() {
 estado_pul=digitalRead(pulsador);
   if (estado_pul != estado_ant_pul){     //se ha presionado el boton
      if (estado_pul==false)
       direccion++;                      //la variable direccion suma 1
       estado_ant_pul=estado_pul;        
       delay(100);                       //pequeño delay para evitar rebote
     }
     if (direccion > 2)                  
        direccion=0;                    //con esto, volvemos a empezar el ciclo

  /*AQUI VAMOS A CONTROLAR EL GIRO DEL MOTOR ANTES DE PRESIONAR EL BOTON EL MOTOR ESTA APAGADO, AL PRESIONAR UNA VEZ
    EL MOTOR GIRA A  LA DERECHA, AL PRESIONAR UNA VEZ MAS, EL MOTOR GIRA IZQUIERDA, Y AL PRESIONAR DE NUEVO EL MOTOR
    REGRESA A APAGADO*/
    switch (direccion){            

    case 0:                           //Todo apagado
    digitalWrite(derecha,LOW);     
    digitalWrite(izquierda,LOW);
    break;

    case 1:                          //giro a la derecha
    digitalWrite(derecha,HIGH);     
    digitalWrite(izquierda,LOW);
    break;
    
    case 2:                          //giro a la izquierda
    digitalWrite(derecha,LOW);     
    digitalWrite(izquierda,HIGH);
    break;

 }
  
}

ya lo compile y no me dio errores si es lo que necesitas pruebalo, si no avisa y pon la mayor información posible, incluyendo diagrama de conexiones que estas usando OJO: este código lo hice suponiendo que es un motor común de DC ya que no mencionas que sea uno a pasos SUERTE

RIG AGRADEZCO TU RESPUESTA,

pero en realidad el código sugerido no hace lo que quiero, me explico mejor el boton es para cuando al presionarlo encienda al motor y gire en ambos sentido solo gire a la izq espera cierto tiempo y despues gire a la derecha y se repita el proceso . es como el vaiven de una lavadora de ropa algo similar

uso las libreria por que no se si me complica mas las cosa o las facilita si puede mirar todas las librerias creo que se puede integrar y hacer muchas cosas en el post inicial deje un link

otra cosa es que el proyecto que tengo en mente esta en todas las librerias que mencione es cuestion de ir por parte hasta lograr el codigo completo.

saludos...

ahh muy bien , es que no entendí lo que querías hacer. Mira a mi punto de vista , trato de usar librerias lo menos posible (por que siento que aprendo mas ). Esas tres librerias que quieres usar se pueden evitar, la RBD_BUTTON solo es para saber el estado de un botón y evitar rebotes (no es indispensable es fácilmente reemplazable con codigo), la RBD_MOTOR es para controlar el giro y la velocidad del motor (esta es útil porque ahorras código) y la ultima del timer, es solo eso un timer que se puede reemplazar con la función millis.

const int pulsador=2;      //señal del boton
int derecha=9;             //salida al puente h para giro a la derecha (puedes usar cualquier otro pin)
int izquierda=8;          //giro izq
boolean estado_pul=true;   //para guardar el estado del  pulsador (lo inicializo en 1 porque lo tienes pull-up)
boolean estado_ant_pul=true;
boolean on_off=false;        //Para encender o apagar el motor     

unsigned long millisAnterior = 0;     //variables para el timer   
const long intervalo = 2500;         //tiempo de duracion de cada ciclo de direccion

void setup() {
  pinMode(pulsador,INPUT_PULLUP);
 pinMode(derecha,OUTPUT);
 pinMode(izquierda,OUTPUT);
 digitalWrite(derecha,LOW);     //comienza con el motor apagado
 digitalWrite(izquierda,LOW);
}

 void loop() {
   estado_pul=digitalRead(pulsador);      //SI SE PULSA EL BOTON SE ENCIENDE EL MOTOR, SI SE PULSA DE NUEVO SE APAGA
   if (estado_pul != estado_ant_pul){     //se ha presionado el boton
      if (estado_pul==false)
         on_off = !on_off;
       estado_ant_pul=estado_pul;        
       delay(100);                       //pequeño retardo para evitar rebote
     }
     
     while (on_off==true){         //mientras la variable on_off esta en alto el motor funciona cambiando de direccion cada tiempo establecido en la variable intervalo
     unsigned long millisActual=millis();
           
           if (digitalRead(derecha)==LOW && digitalRead(izquierda)==LOW){ //si el motor esta apadado 
            digitalWrite(derecha,HIGH);     //comienza a girar a la derecha
            digitalWrite(izquierda,LOW); }
             
        
      if(millisActual - millisAnterior >= intervalo){
          millisAnterior=millisActual;
              if (digitalRead(derecha)==LOW && digitalRead(izquierda)==HIGH){
              digitalWrite(derecha,LOW);         //primero apaga para evitar el cambio abrupto de direccion      
              digitalWrite(izquierda,LOW);
              delay(250);                      //para dar tiempo de detenerse el motor antes de cambiar de direccion
              digitalWrite(derecha,HIGH);     //Luego comienza a girar a la derecha
              digitalWrite(izquierda,LOW);
              }
            else if (digitalRead (derecha)==HIGH && digitalRead(izquierda)==LOW){  //si estaba girando a la derecha invierte el giro a la izq
              digitalWrite(derecha,LOW);
              digitalWrite(izquierda,LOW);
              delay(250);
              digitalWrite(derecha,LOW);
              digitalWrite(izquierda,HIGH);
            }
            }
            return;
            }
                   
     digitalWrite(derecha,LOW);       //Motor apagado
     digitalWrite(izquierda,LOW);
            }

Aquí modifique el sketch, hace lo que tu quieres, esto solo es para darte ideas de como lo puedes hacer, tu usa lo que te sirva y adaptalo a tus necesidades, repito para esto de hacer girar el motor no es necesario las librerias, si va a ser un código mas complejo pueden ayudar pero igual no son indispensables

en la variable intervalo pones el tiempo que gira el motor en cada dirección, el delay lo uso para darle tiempo al motor detenerse antes de girar en sentido opuesto, puedes modificarlo a tus necesidades. Salu2