Hola a tod@s, no se exactamente si poner este post en software o en hardware.
Estoy comenzando a trabajar en un proyecto con un motor paso a paso, para controlar a distancia un conmutador mecánico de 4 posiciones.
El eje del motor por medio de una polea y una correa moverá el eje del conmutador, y girando el motor "x pasos", podré seleccionar la posición deseada del conmutador.
Para evitar montar final de carrera para detectar la posición 0, la idea es grabar en EEPROM la posición donde está el motor, para que cuando apague y encienda Arduino, siempre sepa en que posición está.
La posición 0 inicial se colocará a mano.
El problema que me encuentro, es que cada vez que arranca Arduino, el primer paso del motor, lo hace al revés, es decir, si le mando un giro derecha, el primer paso lo hace a izquierda y ya el siguiente lo hace correcto.
Siendo así, el problema es que pierdo dos pasos, el erróneo y el necesario para volver el motor a su posición correcta.
¿Sabéis a que puede deberse este error, y como corregirlo?
Os dejo el código inicial con en que estoy comenzando a trabajar por si veis algún error por mi parte.
Gracias de antemano
/*
18/12/2020
Mando remoto para manejar un selector de antena mecanico de 4 posiciones
mediante un motor paso a paso SM-42BYG011-25 y un driver L298N
*/
const int sw_right = 12; // Pulsador giro derecha al pin 12
const int sw_left = 13; //Pulsador gito izquierda al pin 13
int pos_actual = 0; //Posicion actual del conmutador
int pos_target = 0; // Posicion a alcanzar
int paso = 0; // Numero de pasos a dar
int pos_1 = 0; //Posicion en pasos antena 1
int pos_2 = 20; //Posicion en pasos antena 2
int pos_3 = 40; //Posicion en pasos antena 3
int pos_4 = 64; //Posicion en pasos antena 4
int leo_sw_right = 0; //Valor del pulsador giro derecha
int leo_sw_left = 0; //Valor del pulsador giro left
#include <Stepper.h> //Importamos la librería para controlar motores paso a paso
#define STEPS 48 //Ponemos el número de pasos que necesita para dar una vuelta. 48 en nuestro caso
// Ponemos nombre al motor, el número de pasos y los pins de control
Stepper stepper(STEPS, 8, 9, 10, 11);
void setup()
{
Serial.begin(9600); // inicializa comunicacion por monitor serie a 9600 bps
pinMode(sw_right, INPUT);
pinMode(sw_left, INPUT);
stepper.setSpeed(100); // Velocidad del motor en RPM
}
void loop()
{
leo_sw_right = digitalRead(sw_right); //Leo el pulsador para detectar si está pulsado
if(leo_sw_right == HIGH)
{
//Muevo en un sentido
stepper.step(1);
pos_actual = pos_actual + 1;
delay(250);
}
leo_sw_left = digitalRead(sw_left); //Leo el pulsador para detectar si está pulsado
if(leo_sw_left == HIGH)
{
//Muevo en sentido contrario
stepper.step(-1);
pos_actual = pos_actual - 1;
delay(250);
}
Serial.print("pos_actual= ");
Serial.print(pos_actual);
Serial.print(" ");
Serial.print("pos_target= ");
Serial.print(pos_target);
Serial.println(" ");
}