Este enfoque es un poco diferente. Aquí es posible hacer funcionar el motor una cantidad infinita en ambos sentidos. El potenciómetro controla la velocidad de marcha del motor y en qué dirección. Cuando el pote está centrado, el motor no se mueve.
#define DRIVER_STEP_PIN 10
#define DRIVER_DIR_PIN 9
#define DRIVER_EN_PIN 8
#define POT_PIN A0
#define DEADZONE 50
#define MIN_DRIVER_PULSE_PERIOD_US 1000 //max speed
#define MAX_DRIVER_PULSE_PERIOD_US 3000 //min speed
enum
Driver_pulse_state_enum {PULSE_IDLE, PULSE_HIGH, PULSE_LOW};
unsigned
long
time_now = 0;
uint16_t driver_pulse_hold_time_us = MIN_DRIVER_PULSE_PERIOD_US/2;
uint8_t driver_pulse_state = PULSE_IDLE;
int
normalized_analog_value = 0;
uint8_t idle_flag = 1;
void
setup() {
pinMode(DRIVER_STEP_PIN, OUTPUT);
pinMode(DRIVER_DIR_PIN, OUTPUT);
pinMode(DRIVER_EN_PIN, OUTPUT);
digitalWrite(DRIVER_EN_PIN, HIGH);
}
void
loop() {
normalized_analog_value = analogRead(POT_PIN) - 512;
if
(
abs
(normalized_analog_value)-DEADZONE < 0){
idle_flag = 1;
}
else
{
idle_flag = 0;
}
driver_pulse_hold_time_us = map(
abs
(normalized_analog_value), DEADZONE, 512, MAX_DRIVER_PULSE_PERIOD_US, MIN_DRIVER_PULSE_PERIOD_US)/2;
if
(!idle_flag && driver_pulse_state == PULSE_IDLE){
write_pulse_high();
}
if
((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_LOW)){
write_pulse_high();
}
if
((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_HIGH)){
write_pulse_low();
}
}
void
write_pulse_high(
void
){
driver_pulse_state = PULSE_HIGH;
if
(normalized_analog_value > 0){
digitalWrite(DRIVER_DIR_PIN, HIGH);
}
else
if
(normalized_analog_value < 0){
digitalWrite(DRIVER_DIR_PIN, LOW);
}
digitalWrite(DRIVER_STEP_PIN, HIGH);
time_now = micros();
}
void
write_pulse_low(
void
){
digitalWrite(DRIVER_STEP_PIN, LOW);
time_now = micros();
if
(!idle_flag){
driver_pulse_state = PULSE_LOW;
}
else
{
driver_pulse_state = PULSE_IDLE;
}
}
Conclusiones
El filtrado de paso bajo de la señal analógica es casi crucial en este tipo de configuración, especialmente para el código de control de posición. Esto puede hacerse en hardware o en firmware (por ejemplo, utilizando un filtro de media móvil exponencial). Todavía no tenemos ninguna forma de aceleración en nuestro control de movimiento, por lo que los cambios de velocidad demasiado altos provocarán la pérdida de pasos.
El propósito de estos ejemplos de código es servir de inspiración para otros que están haciendo un proyecto que involucra el control de motores paso a paso. Hay muchas maneras de hacer esto, y probablemente sería mejor usar librerías de control de paso a paso y/o shields o módulos para un movimiento y control más seguro, más robusto y suave.