Control de motor bipolar con pulsadores [SOLUCIONADO]

Hola,
Quiero que un motor bipolar conectado a un L298 se ponga en marcha al activar un pulsador y que siga girando hasta que se active el segundo pulsador.

Lo hice de esta manera, pero si suelto el pulsador de "activación" el motor se para.

void reposo (){

digitalRead (subir); //pulsador que activa el motor
digitalRead (fin_carrera); // pulsador que hace que se pare
if (subir == HIGH && fin_carrera == LOW ) {

myStepper.step(stepsPerRevolution); //se activa el motor
}

else if (fin_carrera == HIGH) // si pulsamos el pulsador se para
{
const int stepsPerRevolution = 0;
myStepper.step(stepsPerRevolution);

}
}

Lo dicho...no consigo que siga girando si suelto el pulsador "subir".

Saludos.

Prueba esto:

void reposo (){
     
    estadoSubir=digitalRead (subir);                   //pulsador que activa el motor
    estadoFC=digitalRead (fin_carrera);            // pulsador que hace que se pare
    

     if ( 
    estadoSubir== HIGH && estadoFC == LOW ) {          
                                               
     marcha = HIGH;
     }
     
     else if (estadoFC == HIGH)     // si pulsamos el pulsador se para
     { 
      marcha = LOW;
      
     }      
     If (marcha==HIGH){
          myStepper.step(stepsPerRevolution);    //se activa el motor
     }
     else{ 
          const int stepsPerRevolution = 0;
          myStepper.step(stepsPerRevolution);
     }


     }

p.d: Recuerda declarar las nuevas variables que he creado: marcha, estadoFC y estadoSubir

Gracias por responder,

Lo he probado y sigue haciendo lo mismo :frowning: . El motor se para si suelto el pulsador "subir". Tengo que mantenerlo pulsado, para que cuando lo detecte el bumper "fin de carrera" se pare.

Habrá que seguir investigando.

Postea todo el código

pues debe ser algo que tienes en otro sitio del programa porque ese trozo con lo que te he modificado deberia funcionar. Como dice el amigo Surbyte pon el codigo completo.

Ahi va:

#include <Stepper.h>

const int stepsPerRevolution = 200; // cambie este valor por el numero de pasos de su motor
Stepper myStepper(stepsPerRevolution, 8,9,10,11); // inicializa la libreria 'stepper' de los pines 8 a 11

int activar = 2 ; // definimos el botón donde conectamos el botón de que pone en marcha el taladrin.
int led_activar=5;

int estadoUltimo=0;//
int contador=0;//
int estadoActual=0;//
int rele = 7; //

int subir = 4; // definimos donde conectamos el pulsador subir
int fin_carrera = 6 ; // definimos donde conectaremos el bumper de fin de carrera (reposo)

int pulsador_bajar = 3; //definimos el pin donde conectaremos el pulsador bajar

void setup() {

pinMode (activar,INPUT); //activa el taladro
pinMode (led_activar,OUTPUT);
pinMode (subir,INPUT); // sube a reposar
pinMode (rele,OUTPUT);
pinMode (fin_carrera, INPUT);
pinMode (pulsador_bajar,INPUT); // baja

myStepper.setSpeed(150);// establece la velocidad en 150rpm
Serial.begin(9600);// inicializa el puerto serial
}

void loop() {
encendido(); // función para encender y apargar el taladrin
reposo(); // función para que suba el bloque a la posición de reposo
bajar(); // función para que el taladro baje a la posicion listo para taladrar
}

void encendido (){
estadoActual=digitalRead(activar);
if (estadoActual != estadoUltimo){
if (estadoActual == HIGH) {
contador = contador+1;
}
}
estadoUltimo=estadoActual;
if(contador% 2 == 0) {
digitalWrite (rele,LOW);
digitalWrite (led_activar, LOW);
}
else {
digitalWrite (led_activar, HIGH);
digitalWrite (rele, HIGH);
}

}

void reposo (){
int p1;
int p2;
p1 = digitalRead (subir);
p2 = digitalRead (fin_carrera);
if (p1 == HIGH && p2 == LOW ) { //si hemos pulsado el boton y el taladro no esta arriba
myStepper.step(stepsPerRevolution); //sube
}

else if (p2 == HIGH)
{
const int stepsPerRevolution = 0;
myStepper.step(stepsPerRevolution);
}
}

void bajar () {
digitalRead(pulsador_bajar);
pulsador_bajar=digitalRead(3);
if (pulsador_bajar == 1 && contador_bajar == 0) { //si se pulsa el boton de listo y contador esta a cero
contador_bajar == 1;

int x=0;
for (x=0; x<30; x++){
myStepper.step(-stepsPerRevolution); //el motor gira en sentido contrario al reloj y baja el taladro 30 pulsos

}
}
}

Veo varios errores, comienzo:

Creas la misma variable 2 veces, una como global y otra como local:

Al principio del programa

const int stepsPerRevolution = 200;  // cambie este valor por el numero de pasos de su motor

En la subrutina REPOSO

const int stepsPerRevolution = 0;

Aqui realizas sin sentido

 digitalRead(pulsador_bajar);
                         pulsador_bajar=digitalRead(3);

yo pondria esto:

       estado_pulsador_bajar=digitalRead(pulsador_bajar);

Aqui te sobra un signo "="

contador_bajar == 1;

y varias cosas más..

Te he modificado el programa pero no lo he probado, si quieres pruebalo, de todas formas la subrutina bajar no veo bien que es lo que hace, porque haces un bucle FOR sin ningun tipo de retraso por lo que entrara en el en 30 ciclos de scan o lo que es lo mismo casi es decir que lo haga una vez ya que lo hara tan rápido que ni lo apreciaras. Si aun con este programa no te va, empieza marcando como comentario las subrutinas encendido y bajar, lo pruebas y si no va almenos va acontando el error, ambien te propongo que incluyas un serial.begin(9600) en el setup y pongas etiquetas en los sitios que vayan enviando textos por ejemplo serial.println("enciendo taladro"); asi por el monitor veras por donde va tu programa y te ayudara a encontrar el error.
Por tu programa me da a entender que lo has ido haciendo a trozos y probando por separado cada cosa y luego lo has unido.

#include <Stepper.h>

const int stepsPerRevolution = 200;  // cambie este valor por el numero de pasos de su motor
Stepper myStepper(stepsPerRevolution, 8,9,10,11); // inicializa la libreria 'stepper' de los pines 8 a 11

int activar = 2 ; // definimos el botón donde conectamos el botón de que pone en marcha el taladrin.
int led_activar=5;

int estadoUltimo=0;// 
int contador=0;// 
int estadoActual=0;// 
int rele = 7; //

int subir = 4; // definimos donde conectamos el pulsador subir
int fin_carrera = 6 ; // definimos donde conectaremos el bumper de fin de carrera (reposo)

int pulsador_bajar = 3; //definimos el pin donde conectaremos el pulsador bajar



void setup() {
  
  
  pinMode (activar,INPUT);         //activa el taladro
  pinMode (led_activar,OUTPUT);
  pinMode (subir,INPUT);           // sube a reposar
  pinMode (rele,OUTPUT);           
  pinMode (fin_carrera, INPUT);
  pinMode (pulsador_bajar,INPUT);   // baja
 
  myStepper.setSpeed(150);// establece la velocidad en 150rpm
  Serial.begin(9600);// inicializa el puerto serial
            }
            
     void loop() {
                 encendido();  // función para encender y apargar el taladrin
                 reposo();    // función para que suba el bloque a la posición de reposo
                 bajar();      // función para que el taladro baje a la posicion listo para taladrar
               }
                 
           
           
           
void encendido (){
      estadoActual=digitalRead(activar);
      if (estadoActual != estadoUltimo){
      if (estadoActual == HIGH) {
      contador = ++;
      }
      }
     estadoUltimo=estadoActual;
     if(contador% 2 == 0) {
     digitalWrite (rele,LOW);
     digitalWrite (led_activar, LOW);
     } 
     else {
       digitalWrite (led_activar, HIGH);
       digitalWrite (rele, HIGH);
          }
      
      }
      
void reposo (){
      int p1;
      int p2; 
      p1 = digitalRead (subir);
      p2 = digitalRead (fin_carrera);
       if (p1 == HIGH && p2 == LOW ) {          //si hemos pulsado el boton y el taladro no esta arriba
      const int velocidad= stepsPerRevolution;
      myStepper.step(velocidad);    //sube
      }
     
       else if (p2 == HIGH)
       { 
        velocidad = 0;
        myStepper.step(stepsPerRevolution);
       }      
       }
       
void bajar () {                                   
       int estado_pulsador_bajar;
       estado_pulsador_bajar=digitalRead(pulsador_bajar);
       if (estado_pulsador_bajar == 1 && contador_bajar == 0) { //si se pulsa el boton de listo y contador esta a cero
       contador_bajar = 1;
       
       int x=0;
       for (x=0; x<30; x++){
       myStepper.step(-stepsPerRevolution); //el motor gira en sentido contrario al reloj y baja el taladro 30 pulsos
       
      }
      }
      }

Dystrom:
Veo varios errores, comienzo:

Creas la misma variable 2 veces, una como global y otra como local:

Al principio del programa

const int stepsPerRevolution = 200;  // cambie este valor por el numero de pasos de su motor

En la subrutina REPOSO

const int stepsPerRevolution = 0;

Aqui realizas sin sentido

 digitalRead(pulsador_bajar);

pulsador_bajar=digitalRead(3);




yo pondria esto: 

estado_pulsador_bajar=digitalRead(pulsador_bajar);




Aqui te sobra un signo "="

`contador_bajar == 1;`

y varias cosas más..

Hola,

La razón de repetir la constante localmente (const int stepsPerRevolution = 0;), es para que cuando se active el bumper de fin de carrera, el motor se pare, y la única forma que se me ocurrió en dandoler un valor de 0 pulsos en caso de que esto ocurra y eso me funciona.
El resto lo voy a ir modificando

Dystrom:
Te he modificado el programa pero no lo he probado, si quieres pruebalo, de todas formas la subrutina bajar no veo bien que es lo que hace, porque haces un bucle FOR sin ningun tipo de retraso por lo que entrara en el en 30 ciclos de scan o lo que es lo mismo casi es decir que lo haga una vez ya que lo hara tan rápido que ni lo apreciaras. Si aun con este programa no te va, empieza marcando como comentario las subrutinas encendido y bajar, lo pruebas y si no va almenos va acontando el error, ambien te propongo que incluyas un serial.begin(9600) en el setup y pongas etiquetas en los sitios que vayan enviando textos por ejemplo serial.println("enciendo taladro"); asi por el monitor veras por donde va tu programa y te ayudara a encontrar el error.
Por tu programa me da a entender que lo has ido haciendo a trozos y probando por separado cada cosa y luego lo has unido.

#include <Stepper.h>

const int stepsPerRevolution = 200;  // cambie este valor por el numero de pasos de su motor
Stepper myStepper(stepsPerRevolution, 8,9,10,11); // inicializa la libreria 'stepper' de los pines 8 a 11

int activar = 2 ; // definimos el botón donde conectamos el botón de que pone en marcha el taladrin.
int led_activar=5;

int estadoUltimo=0;//
int contador=0;//
int estadoActual=0;//
int rele = 7; //

int subir = 4; // definimos donde conectamos el pulsador subir
int fin_carrera = 6 ; // definimos donde conectaremos el bumper de fin de carrera (reposo)

int pulsador_bajar = 3; //definimos el pin donde conectaremos el pulsador bajar

void setup() {
 
 
  pinMode (activar,INPUT);        //activa el taladro
  pinMode (led_activar,OUTPUT);
  pinMode (subir,INPUT);          // sube a reposar
  pinMode (rele,OUTPUT);         
  pinMode (fin_carrera, INPUT);
  pinMode (pulsador_bajar,INPUT);  // baja

myStepper.setSpeed(150);// establece la velocidad en 150rpm
  Serial.begin(9600);// inicializa el puerto serial
            }
           
    void loop() {
                encendido();  // función para encender y apargar el taladrin
                reposo();    // función para que suba el bloque a la posición de reposo
                bajar();      // función para que el taladro baje a la posicion listo para taladrar
              }
               
         
         
         
void encendido (){
      estadoActual=digitalRead(activar);
      if (estadoActual != estadoUltimo){
      if (estadoActual == HIGH) {
      contador = ++;
      }
      }
    estadoUltimo=estadoActual;
    if(contador% 2 == 0) {
    digitalWrite (rele,LOW);
    digitalWrite (led_activar, LOW);
    }
    else {
      digitalWrite (led_activar, HIGH);
      digitalWrite (rele, HIGH);
          }
     
      }
     
void reposo (){
      int p1;
      int p2;
      p1 = digitalRead (subir);
      p2 = digitalRead (fin_carrera);
      if (p1 == HIGH && p2 == LOW ) {          //si hemos pulsado el boton y el taladro no esta arriba
      const int velocidad= stepsPerRevolution;
      myStepper.step(velocidad);    //sube
      }
   
      else if (p2 == HIGH)
      {
        velocidad = 0;
        myStepper.step(stepsPerRevolution);
      }     
      }
     
void bajar () {                                 
      int estado_pulsador_bajar;
      estado_pulsador_bajar=digitalRead(pulsador_bajar);
      if (estado_pulsador_bajar == 1 && contador_bajar == 0) { //si se pulsa el boton de listo y contador esta a cero
      contador_bajar = 1;
     
      int x=0;
      for (x=0; x<30; x++){
      myStepper.step(-stepsPerRevolution); //el motor gira en sentido contrario al reloj y baja el taladro 30 pulsos
     
      }
      }
      }

La rutina bajar, lo que hace es mandar un número de pulsos para que el taladro baja a la posición deseada y se pare. Con ese número (30) queda justo donde quiero y también e funciona.
Hay otra subrutina que la he omitido y aún no la he puesto pero que la he probado por separado y lo que hace, es que una vez que está el taladro en la posición deseada (despues de los 30 pulsos), al pulsar otro pulsador, el taladro baja un número concreto del pulsos, hace el taladro y sube de nuevo a la posición donde quedó al mandar los 30 pulsos.
Después tenemos la opción de hacer un nuevo taladro y subirlo a la posición de reposo (que es la que me está fallando).
Esta tarde o mañana probaré tu modificación y veré que ocurre.

Gracias a los dos por responder, os diré algo pronto.

:confused:
He modificado el programa como me habeis corregido y todas las subrutinas me funcionan, menos la dichosa que hace subir el taladro "(void reposo)".
Sigo teniendo que tener pulsado el pulsador para que el taladro suba a la posición de reposo, pero ademas, si pulso el pulsador fin de carrera para que se detenga el taladro y no siga subiendo, esta vez no para, con lo cual la modificación que hicimos de velocidad = 0 no sirve

else if (p2 == HIGH)
{
velocidad = 0;
myStepper.step(stepsPerRevolution);

Sin embargo, si lo modifico por:

else if (p2 == HIGH)
{
const int stepsPerRevolution = 0;
myStepper.step(stepsPerRevolution);
}
}

Entonces si que para, pero sigo teniendo el problema de tener que dejar pulsado el pulsador. De todas formas si no encuentro una solución, lo dejaré de esa manera :slight_smile: .
Os dejo un video para que observeis: taladro - YouTube

Gracias de nuevo

tienes puesta una resistencia pull up o pull down en las entradas?

Estan todas puestas Pull down.

Pues ya lo que haría es lo que te dicho antes, poner etiquetas serial.println ("comentario") encima de cada instrucción que modifique la velocidad del motor, ejecutar el programa con el monitor abierto y ver por donde va pasando el programa, seguro que debe ser alguna tonteria que se nos pasa por alto.

Hola.
Mira a ver si este código hace algo diferente o al menos abre una nueva vía:

#include <Stepper.h>

const int stepsPerRevolution = 200;  // cambie este valor por el numero de pasos de su motor

const int activar = 2 ; // definimos el botón donde conectamos el botón de que pone en marcha el taladrin.
const int pulsador_bajar = 3; //definimos el pin donde conectaremos el pulsador bajar
const int subir = 4; // definimos donde conectamos el pulsador subir
const int led_activar=5;
const int fin_carrera = 6 ; // definimos donde conectaremos el bumper de fin de carrera (reposo)
const int rele = 7; //

int estadoEncendidoUltimo = 0;//
int estadoSubirUltimo = 0;//
bool subiendo = false;
bool arriba = false;

Stepper myStepper(stepsPerRevolution, 8,9,10,11); // inicializa la libreria 'stepper' de los pines 8 a 11

void setup() {
  pinMode (activar,INPUT);         //activa el taladro
  pinMode (led_activar,OUTPUT);
  pinMode (subir,INPUT);           // sube a reposar
  pinMode (rele,OUTPUT);           
  pinMode (fin_carrera, INPUT);
  pinMode (pulsador_bajar,INPUT);   // baja
  myStepper.setSpeed(150);// establece la velocidad en 150rpm
  Serial.begin(9600);// inicializa el puerto serial
}

void loop() {
  encendido(); // función para encender y apargar el taladrin
  reposo();    // función para que suba el bloque a la posición de reposo
  bajar();     // función para que el taladro baje a la posicion listo para taladrar
}

void encendido (){
  int estadoEncendidoActual = digitalRead(activar);
  if (estadoEncendidoActual != estadoEncendidoUltimo){
    if (estadoEncendidoActual ) {
      int activacion = !digitalRead(rele);
      digitalWrite (rele, activacion);
      digitalWrite (led_activar, activacion);
    }
    estadoEncendidoUltimo = estadoEncendidoActual;
  }
}

void reposo (){
  int estadoSubirActual = digitalRead (subir);
  if (estadoSubirActual != estadoSubirUltimo) {
    if ( estadoSubirActual ) {
      subiendo = !subiendo;
    }
    estadoSubirUltimo = estadoSubirActual;
  }
  if ( subiendo ) {
    if (!digitalRead(fin_carrera)) {
      myStepper.step(stepsPerRevolution);    //sube
    }
    else {
      subiendo = false;
      arriba = true;
    }
  }
}

void bajar () {
  if (digitalRead(pulsador_bajar) && arriba) { //si se pulsa el boton de listo y contador esta a cero
    for (int x=0; x<30; x++) {
      myStepper.step(-stepsPerRevolution); //el motor gira en sentido contrario al reloj y baja el taladro 30 pulsos
    }
    arriba = false;
  }
}

Suerte y saludos.

lo has ejecutado? si es asi, funciona? sigo sin ver serial. print por ningun sitio. Antes de cada instruccion de modificaciin de velocidad pont que imprima textos en pantalla tipo velocidad 1, velocidad 2... asi cuando ejecutes el programa veras quien es el que la pone a 0.

Muchas gracias a todos por responder a mis preguntas.

No llevo mucho tiempo programando con arduino y se nota mi falta de experiencia, pero tengo que deciros que al final la solución que aportó "Noter" ha funcionado perfectamente.

Ahora cuando pulso el botón reposo, el motor sigue girando hasta que se activa el bumper de fin de carrera.

Cuando tenga el proyecto montado, acabado y funcionando os pondré un video para que lo veais.

Gracias.

Ha sido un placer ayudarte. Ahora trata de entender cómo funciona el código que propuse, para ir aprendiendo mañas varias de programación. Recuerda modificar el título del hilo en el primer post para agregarle el [SOLUCIONADO] y no te olvides de poner el vídeo prometido por aquí.
Saludos.

Cuenta con el video :slight_smile: .
En cuanto tenga rato y empieze a montar el cableado dentro de la caja y verifique que todo está bién lo pondré.

Saludos