/* ----------------------------------------------------------------
http://www.prometec.net/motor-28byj-48
Prog_4_2
Moviendo un motor paso a paso 28BYJ-48 con Arduino
--------------------------------------------------------------------
*/
#define IN1 8
#define IN2 10
#define IN3 9
#define IN4 11
// El modo 0 tiene 4 estados
// Recomendado por el fabricante
// Máximo par, buena velocidad y alto consumo.
// PASO A B C D
// 1 1 1 0 0
// 2 0 1 1 0
// 3 0 0 1 1
// 4 1 0 0 1
// El modo 1 tiene 4 estados
// Se le llama wave drive
// Un par menor que el anterior (porque solo se activa una bobina en lugar de dos)
y consumo bajo
// PASO A B C D
// 1 1 0 0 0
// 2 0 1 0 0
// 3 0 0 1 0
// 4 0 0 0 1
// El modo 2 tiene 8 estados con medios pasos
// Movimiento es más suave y lento que con los métodos anteriores, y el consumo y
el par es también intermedio.
// PASO A B C D
// 1 1 0 0 0
// 2 1 1 0 0
// 3 0 1 0 0
// 4 0 1 1 0
// 5 0 0 1 0
// 6 0 0 1 1
// 7 0 0 0 1
// 8 1 0 0 1
char Working='s';
int vueltas=1;
int RETARDO=10;
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() {
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Working='n';
}
void Activa(int n) {
digitalWrite( IN1, Paso[n][ 0] );
digitalWrite( IN2, Paso[n][ 1] );
digitalWrite( IN3, Paso[n][ 2] );
digitalWrite( IN4, Paso[n][ 3] );
// Serial.println("n="+String(n)+": "+String(Paso[n][0])+","+String(Paso[n][1])
+","+String(Paso[n][2])+","+String(Paso[n][3]));
}
void Gira_Izquierda(int veces) {
for (int i=0;i<veces;i++) {
Activa(1);
delay(RETARDO);
Activa(3);
delay(RETARDO);
Activa(5);
delay(RETARDO);
Activa(7);
delay(RETARDO);
}
}
void Gira_Derecha(int veces) {
for (int i=0;i<veces;i++) {
Activa(7);
delay(RETARDO);
Activa(5);
delay(RETARDO);
Activa(3);
delay(RETARDO);
Activa(1);
delay(RETARDO);
}
}
void loop() {
// R: Giro continuo a la derecha
// D: N vueltas a la derecha
// L: Giro continuo a la izquierda
// I: N vueltas a la izquierda
// R: Giro continuo a la derecha
if (Working == 'r') {
//Serial.println("Right");
Gira_Derecha(vueltas);
};
// D: N vueltas a la derecha
if (Working == 'd') {
//Serial.println("Right");
Gira_Derecha(vueltas);
Working='n';
};
// L: Giro continuo a la izquierda
if (Working == 'l') {
Gira_Izquierda(vueltas);
Working='l';
};
// I: N vueltas a la izquierda
if (Working == 'i') {
Gira_Izquierda(vueltas);
Working='n';
};
if (Working == '+') {
vueltas=vueltas+1;
Serial.println(vueltas);
Working='n';
}
if (Working == '-') {
vueltas=vueltas-1;
Serial.println(vueltas);
Working='n';
}
if (Working == '1') {
RETARDO = RETARDO - 1;
Serial.println(RETARDO);
Working='n';
}
if (Working == '2') {
RETARDO = RETARDO + 1;
Serial.println(RETARDO);
Working='n';
}
// P: Imprime valor de N (numero de vueltas)
if (Working == 'p') {
Serial.println(vueltas);
Working='n';
}
if (Working == 's') {
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
};
if (Serial.available() > 0) {
int temp = Serial.read();
if (temp != 10) {
Serial.println(temp);
Working = temp;
switch (Working) {
case 's': Serial.println("Stop"); break;
case 'l': Serial.println("Left"); break;
case 'r': Serial.println("Right"); break;
};
};
//Serial.println(Working);
};
}