desktop

Arrancar y parar motor PaP, con pulsador, sensor IR, Accelstepper.

Hola amigos foreros, auqnue tengo nociones de electricidad/electronica, el tema de la programación me cuesta sobre todo cuando nos vamos pidiendo exigencias.
la cuestión es que necesito controlar un motor paso a paso, para que haga la siguiente función/s:
Al encender Arduino, necesito que el motor se ponga el marcha y regrese a una posición ("TO HOME"), parándose cuando detecta la presencia un SENSOR inductivo.
(esta parte, aunque con la libreria Accelstepper voy haciendo prueba/error, parece que lo hace correcto), al menos que me digais lo contrario, o que puedo enfocarlo de otra manera, mejor y mas optimizada.
en el void loop, lo que pretendo es que, una vez finalizado el bucle del While del setup, necesito, que al accionar el pulsador (el cual en su estado inicial está en alto), el motor se vuelva a poner en marcha, y se pare cuando el sensor IR, estan enfrentados (fotodiodo/fototransistor).

No hagais mucho caso de la programación del void loop, porque voy trastocando continuamente, y al momento de insertarlo así lo tenia, pero evidentemente no me funcionaba.
Código:
/*Version 1.0 primera prueba 12-06-2020
* sensor infrarrojos y posicionamiento del motor paso a paso  por Enrique Villasur.
*/
#include <LiquidCrystal.h>
#include <AccelStepper.h>
AccelStepper motorcabezal(1,13,12);  // 1 = interfaz Easy Driver
                                                 // UNO Pin 13 conectado al pin STEP del Easy Driver (pasos).
                                                 // UNO Pin 12 conectado al pin DIR del Easy Driver (dirección).

const int pasos = 13;
const int direccion = 12;
int infrarrojos = 32;
//int voltaje = 36;
int selec =0;
int lectura = 0;
int lectura2 = 0;
int estado = 0;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //(Rs,En,D4,D5,D6,D7).

const int enable = 11;
int pulsador = 10;

#define SENSORA 30 //Sensor Inductivo.


void setup() {
      //pinMode(pasos, INPUT);
      //pinMode(direccion, INPUT);
      Serial.begin(9600);
      pinMode(enable, OUTPUT);
      digitalWrite(enable, LOW);
      pinMode (pulsador, INPUT);
      pinMode(infrarrojos, INPUT);
     // pinMode(voltaje, OUTPUT);
      lcd.begin(16,2);              // Inicializar el LCD
      lcd.setCursor(0,0);
      lcd.print(" infrarrojos_1");   
      lcd.setCursor(0,1);           // Cursor a linea 2, posicion 1
      lcd.print("PRUEBA IRD");
    
      delay (3000);
  
      //motorcabezal.setSpeed(200.0);         //velocidad queremos que permanezca constante.
      motorcabezal.setMaxSpeed(600.0);      // velocidad maxima permitida
      motorcabezal.setAcceleration(200.0);  //relación entre aceleración/desaceleración.
    
    
      lcd.clear();
      lcd.setCursor(0,0);         
      lcd.print("POS_TO_HOME");

      pinMode(SENSORA, INPUT); //determino la CONSTANTE "SENSOR1", como entrada.
      //pinMode(SENSORB, INPUT); //determino la CONSTANTE "SENSOR2", como entrada.

      while(digitalRead(SENSORA)==0)
      {
      motorcabezal.distanceToGo()== 0;
      motorcabezal.moveTo(motorcabezal.currentPosition());
      motorcabezal.setSpeed (600);
      motorcabezal.run();
      digitalWrite(enable, HIGH);
      }
      while(digitalRead(SENSORA)==1)
      {
       motorcabezal.distanceToGo()==0;
       motorcabezal.moveTo(-motorcabezal.currentPosition());
       motorcabezal.setSpeed (-650);
       motorcabezal.run();
       digitalWrite(enable, LOW);
    
      }
        
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("HOME");
     //motorcabezal.stop();
    
      delay(1000);
      }
    

//      }

void loop() {

    estado = digitalRead (pulsador);
    //lectura = digitalRead (voltaje);

     /*if  (estado==HIGH) {
          lcd.clear();
          lcd.setCursor (0,0);
          lcd.print ("AJUSTAR POSICION");
         // motorcabezal.move(2000);
         // motorcabezal.setSpeed(400);
          delay (1000);
     }
*/
       if (lectura==0){
        lectura=digitalRead (infrarrojos);
        lcd.clear();
        lcd.setCursor (0,0);
        motorcabezal.move(2000);
        motorcabezal.setSpeed(600);
        lcd.print ("AJUSTANDO");
        delay (1000);
    
      if (lectura2==1){
        lcd.clear();
        lcd.setCursor (0,0);
        motorcabezal.stop();
        lcd.print ("AJUSTADO");
        delay (1000);
    
      /*
        
      if ((estado == HIGH)&&(lectura==0)){
          lcd.clear(); 
          lcd.setCursor (0,0);
          lcd.print ("AJUSTANDO");
          //motorcabezal.stop();
          motorcabezal.setSpeed(400);
          motorcabezal.runSpeed();
          delay (1000);
    
      if ((estado==HIGH)&&(lectura==1)){
          motorcabezal.stop();
          lcd.clear();
          lcd.setCursor (0,1);
          lcd.print ("AJUSTADO");
          //digitalWrite (voltaje, LOW);
        */
      }
    }
     motorcabezal.runSpeed();
     }
 
Asi a bote pronto...

//pinMode(pasos, INPUT);
//pinMode(direccion, INPUT);

Son las salidas para controlar el motor, no deben ser INPUT, yo creo que deberían ser OUTPUT.
 
hola danimallen5, gracias por contestar.
pero, estos pinos no van directamente a los motores, estos consumen alrededor de dos (2) Amp, a 12V, estan controlados por los drivers DRV8825, pero podrias tener razón.
Aparte yo creo que, donde debería hacer la secuencia del (Void Loop), no lo tengo bien definido.
de cualquier manera GRACIAS.
 
Claro que no van al motor directos, envían las señales al driver, y son salidas OUTPUT seguro
Vale sip, tienes razón, SON SALIDAS.
Al final generé esas variables, por ponerlas, aunque yo creo (tampoco me hagos mucho caso), que eso lo controla la libreria AccelStepper , que ahí si que stan estan los pines.
Pero repito, no se si alguno me podrá echar una mano, a como plantear el Void Loop, ya que no consigo hacer lo que pretendo.
uchas gracias, por tu interes danimallen5.
IMG_20200619_110404.jpg

Esto, seria una parte, que quiero insertar en otro proyecto, pero aquí sigo dando vueltas.... jajajajajjajajaj.IMG_20200619_110503.jpg

Este seria el proyecto, general.
 
Última edición:
Puedes explicar que es exactamente lo que quieres que haga? la secuencia, por ejemplo:
Quiero pulsar un botón, que se ponga en marcha el motor hasta que pase esto o lo otro..
Así es más fácil revisar el void loop..
 
Hola, nuevamente danimallen5, que tio, siempre al pie del cañon (lo cual agradezco).
para empezar comentarte, que como ves en el proyecto general, trabajo con dos motores paso a paso.
pero para este mini proyecto trabajo solo con uno (seria el motor que lleva las poleas blancas), que es el que hará la secuencia que a continuación te comentaré.
Lo que pretendo, es que en concreto ese motor, al encender el proyecto general, directamente vaya hacia la posicion "TO HOME", que es la parte del "Setup" que veras en el codigo con los "WHILE", el motor llegará hasta un "SENSOR", este es un sensor inductivo, al que llegará y se parará.
Comentarte que esta primera parte la realiza correctamente, sería a partir de aqui lo que quiero añadir.
Ahora una vez situado el motor en la posicion "TO HOME", lo que pretendo es:
Al accionar un pulsador, ese mismo motor, se vuelva a poner en marcha, y se pare cuando se enfrenten el sensor IR, compuesto por un fotodiodo (trasmisor) y un fototransitor (receptor).
Lo cual quiere decir, que inicialmente el sensor IR, no estan enfrentados (fotodiodo y fototransistor).
Bueno danimallen5 no sé si me he explicado bien, cualquier pregunta te la aclararé gustosamente.
 
Atrás
Arriba