//PRÁCTICA #47

/*
	Programa que realiza un giro completo del motor 28BYJ-48 en conjunto con el controlador
	basado en ULN2003, detiene 5 segundos y luego comienza nuevamente. La secuencia es la de
	paso completo simple (wave drive) energizando de a una bobina por vez utilizando una
	matriz para su definicion. 
	Alimentar Arduino con fuente de alimentacion externa de 6 a 12 Vdc.

Secuencia: paso completo (wave drive)
*/

int IN1 = 8;			// pin digital 8 de Arduino a IN1 de modulo controlador
int IN2 = 9;			// pin digital 9 de Arduino a IN2 de modulo controlador
int IN3 = 10;			// pin digital 10 de Arduino a IN3 de modulo controlador
int IN4 = 11;			// pin digital 11 de Arduino a IN4 de modulo controlador
int demora = 20;   		// demora entre pasos, no debe ser menor a 10 ms.
// paso completo simple
int paso [4][4] =		// matriz (array bidimensional) con la secuencia de pasos
{
  {1, 0, 0, 0},
  {0, 1, 0, 0},
  {0, 0, 1, 0},
  {0, 0, 0, 1}
};

void setup() {
  pinMode(IN1, OUTPUT);		// todos los pines como salida
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}

void loop() {

//El for repite los 4 pasos 512 veces
  for (int i = 0; i < 512; i++)	// 512*4 = 2048 pasos, t_vuelta=20*2048=40960ms=40s
  {
    //Los 4 pasos en un solo for
    for (int i = 0; i < 4; i++)		// bucle recorre la matriz de a una fila por vez
    {					// para obtener los valores logicos a aplicar
      digitalWrite(IN1, paso[i][0]);	// a IN1, IN2, IN3 e IN4
      digitalWrite(IN2, paso[i][1]);
      digitalWrite(IN3, paso[i][2]);
      digitalWrite(IN4, paso[i][3]);
      delay(demora);
    }
  }

  digitalWrite(IN1, LOW);	// detiene por 5 seg.
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delay(5000);

}

/*
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

UN CICLO REQUIERE DE 4 PASOS
UN GIRO COMPLETO DE ROTOR REQUIERE DE 8 CICLOS
UN GIRO COMPLETO DEL EJE EXTERIOR REQUIERE DE 6A VUELTAS (REVOLUCIONES -REDUCCIÓN) DEL ROTOR
4 * 8 * 64 = 2048 PASOS PARA UNA REVOLUCIÓN
*/