//*************************************************************//
//*************************************************************//
//**** *****//
//**** MOTOR PASO A PASO CON ARDUINO *****//
//**** *****//
//**** By: SERGIO ANDRES CASTAÑO GIRALDO *****//
//**** https://controlautomaticoeducacion.com/ *****//
//**** RIO DE JANEIRO - BRASIL - 2018 *****//
//**** *****//
//*************************************************************//
//*************************************************************//
//Declaración de los PULSADORES___pines del arduino que se van a usar para los botones de seleccion
byte PHorario = 2; //Pulsador sentido horario
byte PAntiHorario = 3; //Pulsador sentido anti horario
byte PPasos = 4; //Pulsador numero de pasos
byte PVel = 5; //Pulsador velocidad
//Declaración de los PINES del Driver_pines de salida a utilizar que van conectador al driver para el motor
byte IN1=8; // 28BYJ48 In1
byte IN2=9; // 28BYJ48 In2
byte IN3=10; // 28BYJ48 In3
byte IN4=11; // 28BYJ48 In4
int horario=1; //variable para decirle al motor en que sentido va a trabajar
//*** Crear Matriz con los Pasos del Motor ***//
int paso=4; //Variable que indica el numero de pasos de las matrices
int Cpaso=0; //Contador de pasos
int vel[5]={5,10,30,100,500}; //Vector de velocidad___configuracion de las distintas velocidades-la de 5 es la mas rapida
int Cvel=0; //Contador de Velocidad---va contando la posicion dentro del vector anterior
int conf=1; //Variable que configura la secuencia de pasos
//secuencia del motor a 1 paso
const int UnPaso[4] = { B1000,
B0100,
B0010,
B0001 };
//secuencia 2 pasos
const int DosPasos[4] = { B1100,
B0110,
B0011,
B1001 };
// Secuencia a medio paso
byte const MedioPaso[8] = { B1000,
B1100,
B0100,
B0110,
B0010,
B0011,
B0001,
B1001 };
//Función que coloca en el puerto de salida los bits comenzando
// desde el pin ini hasta el pin fin
void puerto(int bits,int ini,int fin){
for(int i=ini;i<=fin;i++)
{
digitalWrite(i,bitRead(bits,i-ini));
}
}
void setup() {
//Configura los 4 Pines de Pulsadores como ENTRADAS
for(int i=2;i<=5;i++){
pinMode(i,INPUT);
}
//Configura los 4 Pines digitales como SALIDAS
for(int i=IN1;i<=IN4;i++){
pinMode(i,OUTPUT);
}
}
void loop() {
//******************************************************************************//
//*********** Pregunta por los Pulsadores *********************************//
//******************************************************************************//
// Giro en Sentido Horario
if(digitalRead(PHorario)) // Pregunta si pulsador horario fue presionado
{
delay(100); //Anti-Rebote
horario=1;
Cpaso=-1;
}
// Giro en Sentido Anti-Horario
if(digitalRead(PAntiHorario)) // Pregunta si pulsador horario fue presionado
{
delay(100); //Anti-Rebote
horario=0;
Cpaso=paso;
}
// Cambio de la secuencia de pasos
if(digitalRead(PPasos)) // Pregunta si pulsador horario fue presionado
{
delay(100); //Anti-Rebote
while(digitalRead(PPasos)); //Espera hasta soltar el boton
delay(100); //Anti-Rebote
conf++;
//Si ya paso por las 3 configuraciones reinicie
if(conf>3)
conf=1;
if(horario==1)
Cpaso=-1;
else
Cpaso=paso;
puerto(B0000,IN1,IN4);
}
// Velocidad del Motor
if(digitalRead(PVel)) // Pregunta si pulsador horario fue presionado
{
delay(100); //Anti-Rebote
while(digitalRead(PVel)); //Espera hasta soltar el boton
delay(100); //Anti-Rebote
Cvel++;
//Si ya paso por las 5 velocidades reinicie
if(Cvel>4)
Cvel=0;
}
//******************************************************************************//
//*********** Logica de los contadores *********************************//
//******************************************************************************//
if(horario==1)
{
Cpaso++; //Incremente la variable cont
if(Cpaso>=paso)
Cpaso=0; //Se pone Contador de pasos en cero
}
else{
Cpaso--; //Decremente la variable cont
if(Cpaso<0)
Cpaso=paso-1; //Se pone Contador igual al paso
}
//******************************************************************************//
//*********** Secuencia de Movimiento del Motor ***************************//
//******************************************************************************//
switch(conf){
case 1:
puerto(UnPaso[Cpaso],IN1,IN4); //Envíe al puerto la información de la tabla
paso=4;
break;
case 2:
puerto(DosPasos[Cpaso],IN1,IN4); //Envíe al puerto la información de la tabla
paso=4;
break;
case 3:
puerto(MedioPaso[Cpaso],IN1,IN4); //Envíe al puerto la información de la tabla
paso=8;
break;
}
delay(vel[Cvel]); //Retardo de 100 milisegundos
}