/*
Paso a Paso unipolar 28BYJ-48 con Driver ULN2003.
En este programa se usa la secuencia de paso completo simple.
Se energiza de a una sola bobina por vez.
Hay que ver la tabla de este tipo de secuencia para aplicar en la programación.
Se verifica el correcto funcionamiento del motor paso a paso y sus diferentes
modos de operación y la necesidad del uso de un módulo controlador.
*/
int IN1 = 8;
int IN2 = 9;
int IN3 = 10;
int IN4 = 11;
// Se debe respetar el tiempo mínimo. Se elije no trabajar al límite.
int demora = 20; // demora entre pasos, no debe ser menor a 10 ms (fabricante)
// Elegir que matriz se desea usar
// // paso completo simple
// int paso[4][4] = {
// {1, 0, 0, 0},
// {0, 1, 0, 0},
// {0, 0, 1, 0},
// {0, 0, 0, 1}
// };
// // paso completo con dos bobinas (con máximo torque)
// // Visualmente es lo mismo
// int paso[4][4] = {
// {1, 1, 0, 0},
// {0, 1, 1, 0},
// {0, 0, 1, 1},
// {1, 0, 0, 1}
// };
// secuencia de medio paso
// Se logra una máxima precisión con un torque intermedio
int paso[8][4] = {
{1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1},
};
void setup() {
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
for (int i = 0; i < 512; i++) // 512*4 = 2048 pasos para un giro completo, o 512*8 = 4096 para caso de medio paso
{
// for (int i = 0; i < 4; i++) // Pase secuencia de paso completo simple y con dos bobinas
for (int i = 0; i < 8; i++) // Para secuencia de medio paso
// for(int i = 7; i >= 0, i--) // Para secuencia de medio paso en sentido de giro inverso al previo
{
digitalWrite(IN1, paso[i][0]);
digitalWrite(IN2, paso[i][1]);
digitalWrite(IN3, paso[i][2]);
digitalWrite(IN4, paso[i][3]);
// // En este orden si se quiere el sentido de giro inverso
// // Se recorre la matriz en el sentido inverso
// digitalWrite(IN4, paso[i][3]);
// digitalWrite(IN3, paso[i][2]);
// digitalWrite(IN2, paso[i][1]);
// digitalWrite(IN1, paso[i][0]);
delay(demora);
}
}
// Se detiene el motor por 5 segundos antes de que se ejecute todo nuevamente
// (antes de dar otra vuelta del rotor). Se envía un nivel bajo a todas las entradas
// para desenergizar las bobinas por 5 segundos.
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(5000);
}