#define IN1 11
#define IN2 9
#define IN3 10
#define IN4 8
int velocidad = 15; //ms
//int paso1[4][4] = {{1, 0, 0, 1},{0, 0, 1, 1},{0, 1, 1, 0},{1, 1, 0, 0}};1
int paso1[4][4] = {{1, 0, 0, 0}, {0, 1, 0 ,0},{0,0, 1, 0},{0, 0, 0, 1}};
int paso2[4][4] = {{0, 0, 0, 1}, {0, 0, 1 ,0},{0,1, 0, 0},{1, 0, 0, 0}};
int A = 2; //variable A a pin digital 2 (DT en modulo)
int B = 3; //variable B a pin digital 4 (CLK en modulo)
int ANTERIOR = 0; // almacena valor anterior de la variable POSICION
volatile int POSICION = 0; // variable POSICION con valor inicial de 0 y definida como global
void setup() {
pinMode(A, INPUT); // A como entrada
pinMode(B, INPUT); // B como entrada
Serial.begin(9600); // incializacion de comunicacion serie a 9600 bps
attachInterrupt(digitalPinToInterrupt(A), encoder, LOW); // interrupcion sobre pin A
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
if (POSICION != ANTERIOR) {
Serial.println(POSICION);
for (int j = 0; j <3 ; j++) {
if (POSICION > ANTERIOR) {
MovimientoAntihorario();
delay(velocidad);
} else if (POSICION < ANTERIOR) {
MovimientoHorario();
delay(velocidad);
}
}
ANTERIOR = POSICION;
}
}
void encoder() {
static unsigned long ultimaInterrupcion = 0;
unsigned long tiempoInterrupcion = millis();
if (tiempoInterrupcion - ultimaInterrupcion > 15) {
if (digitalRead(B) == HIGH) {
POSICION++ ;
}
else {
POSICION-- ;
}
ultimaInterrupcion = tiempoInterrupcion;
}
}
void MovimientoAntihorario() {
for (int step1 = 0; step1 < 4; step1++) {
digitalWrite(IN1, paso1[step1][0]);
digitalWrite(IN2, paso1[step1][1]);
digitalWrite(IN3, paso1[step1][2]);
digitalWrite(IN4, paso1[step1][3]);
delay(velocidad);
}
}
void MovimientoHorario() {
for (int step1 = 3; step1 >= 0; step1--) { // Pasos en orden inverso
digitalWrite(IN1, paso1[step1][0]);
digitalWrite(IN2, paso1[step1][1]);
digitalWrite(IN3, paso1[step1][2]);
digitalWrite(IN4, paso1[step1][3]);
delay(velocidad);
}
}