El Programa:
#include <TM1637.h>
#include <math.h>
/
* 40 * 1600 = 64000 Pulsos por vuelta
* 64000 / 360 = 177.777
* Usaremos el valor redondeado para enviar cantidad de pulsos despues de los calculos
* Driver configurado a 1600 pulsos por vuelta y reductora de 40:1
*
/
// P I N E S
// Salidas displays
const int Pin_D1_clk = 4;
const int Pin_D1_dio = 5;
const int Pin_D2_clk = 6;
const int Pin_D2_dio = 7;
// Entrada Botonera
const int Pin_Boton_Mas_Divisiones = 9;
const int Pin_Boton_Menos_Divisiones = 8;
const int Pin_Boton_Avanzar = 10;
const int Pin_Boton_Retroceder = 11;
// Salida a motor
const int Pin_Paso_Motor =12;
const int Pin_Dir_Motor =13;
int8_t Divisiones[] = {16,0,0,2};
int8_t Grado[] = {16,0,0,0};
// Variables
int Visualizar_Grados =500;
int Espera_Chica = 10;
int Espera_Display = 200;
int Tiempo_Paso =120;
int Bt_Menos_Divisiones =0;
int Bt_Mas_Divisiones =0;
int Bt_Avanzar =0;
int Bt_Retroceder =0;
// Para los bucles for
int Division_Actual = 2;
float Grado_Zero = 0;
float Grado_Actual = 0;
float Grado_Destino = 0;
float Grado_Destino_Redondeado = 0;
double Posicion_Actual;
double Posicion_Inicial;
double Posicion_Final;
double Divisiones_Elegidas = 2;
double Grados_Por_Division=180;
float Relacion = 177.7777777770 ;
float Resto;
TM1637 Display_Divisiones(Pin_D1_clk,Pin_D1_dio);
TM1637 Display_Grado(Pin_D2_clk,Pin_D2_dio);
void setup() {
Serial.begin(9600);
// Salidas a maquina
pinMode(Pin_Paso_Motor, OUTPUT);
pinMode(Pin_Dir_Motor, OUTPUT);
// Entradas
pinMode(Pin_Boton_Mas_Divisiones, INPUT_PULLUP);
pinMode(Pin_Boton_Menos_Divisiones, INPUT_PULLUP);
pinMode(Pin_Boton_Avanzar, INPUT_PULLUP);
pinMode(Pin_Boton_Retroceder, INPUT_PULLUP);
Display_Divisiones.init();
Display_Divisiones.set(1);
Display_Grado.init();
Display_Grado.set(1);
Display_Divisiones.display(Divisiones);
Display_Grado.display(Grado);
}
void loop()
{
delay(Espera_Display);
Leer_EstadoBotones();
if( Bt_Mas_Divisiones == 1)
{
Serial.println (" Bt_Mas_Divisiones Pulsado ");
if (Division_Actual < 360 )
{
Division_Actual = Division_Actual + 1;
Divisiones_Elegidas = Division_Actual ;
Serial.print("Divisiones_Elegidas:"); Serial.println (Divisiones_Elegidas);
CalculaDigitosDivisiones(Division_Actual);
Grados_Por_Division = 360 / Divisiones_Elegidas;
CalculaDigitosGrados(Grados_Por_Division);
delay(Visualizar_Grados);
CalculaDigitosGrados(Grado_Actual);
}
else
{
Division_Actual = 2;
Divisiones_Elegidas = Division_Actual ;
Serial.print("Divisiones_Elegidas:"); Serial.println (Divisiones_Elegidas);
CalculaDigitosDivisiones(Division_Actual);
Grados_Por_Division = 360 / Divisiones_Elegidas;
CalculaDigitosGrados(Grados_Por_Division);
delay(Visualizar_Grados);
CalculaDigitosGrados(Grado_Actual);
}
}
/************************************************************************/
if( Bt_Menos_Divisiones == 1)
{
Serial.println (" Bt_Menos_Divisiones Pulsado ");
if (Division_Actual > 2 )
{
Division_Actual = Division_Actual - 1;
Divisiones_Elegidas = Division_Actual ;
Serial.print(“Divisiones_Elegidas:”); Serial.println (Divisiones_Elegidas);
CalculaDigitosDivisiones(Division_Actual);
Grados_Por_Division = 360 / Divisiones_Elegidas;
CalculaDigitosGrados(Grados_Por_Division);
delay(Visualizar_Grados);
CalculaDigitosGrados(Grado_Actual);
}
else
{
Division_Actual = 360;
Divisiones_Elegidas = Division_Actual ;
Serial.print(“Divisiones_Elegidas:”); Serial.println (Divisiones_Elegidas);
CalculaDigitosDivisiones(Division_Actual);Grados_Por_Division = 360 / Divisiones_Elegidas;
CalculaDigitosGrados(Grados_Por_Division);
delay(Visualizar_Grados);
CalculaDigitosGrados(Grado_Actual);
}
}
/************************************************************************/
if( Bt_Avanzar == 1)
{
Serial.print (" Boton MAS pulsado con Grado_Actual = ");
Serial.println(Grado_Actual,6);
Grado_Destino = Grado_Actual + ((360 / Divisiones_Elegidas ));
Serial.print(Grado_Actual,6); Serial.print (" y Grado_Destino = "); Serial.println (Grado_Destino,6);
if( Grado_Destino <= 360.0005)
{ Posicion_Inicial = (Grado_Actual* Relacion);
Serial.print (" Posicion_Inicial "); Serial.println (Posicion_Inicial);
Posicion_Final = (Grado_Destino * Relacion);
Serial.print (" Posicion_Final "); Serial.println ( Posicion_Final );
Grado_Destino_Redondeado = round(Grado_Destino);
CalculaDigitosGrados(Grado_Destino_Redondeado);
Avanza(Posicion_Inicial,Posicion_Final);
Grado_Actual= Grado_Destino ;
Serial.print (" Posicion_Inicial "); Serial.print (Posicion_Inicial);Serial.print (" Posicion_Final "); Serial.println (Posicion_Final);
if( Grado_Destino_Redondeado == 360)
{
Serial.print (" GradoDestinoRedondeado = ");
Serial.println (Grado_Destino_Redondeado,6);
Grado_Actual = 0; CalculaDigitosGrados( 0);
}
}
else
{
Serial.print (" else Grado_Destino <= 360.00 ");
Serial.print (" Grado_Destino = "); Serial.println (Grado_Destino);
}
}
/************************************************************************/
if( Bt_Retroceder == 1)
{
Serial.print (" Boton menos pulsado con Grado_Actual = ");
Serial.print ( Grado_Actual);
Serial.println (" <b>*************************</b> ");
if( Grado_Actual <= 0.0005 )
{
Serial.print (" Grado_Actual si es = 0 y... Grado_Actual = ");
Grado_Actual = 360; CalculaDigitosGrados( 0);
Serial.println ( Grado_Actual);
Serial.println ("** ");
}
else
{Serial.print (" Grado_Actual NO es == 0 Es --> ");
Serial.println (Grado_Actual,8);
}
Grado_Destino = Grado_Actual - (360 / Divisiones_Elegidas );
Serial.print (" Grado_Actual = ");Serial.print(Grado_Actual); Serial.print (" y Grado_Destino = "); Serial.println (Grado_Destino,6);
if( abs(Grado_Destino) >= 0)
{
Serial.print (" dentro de if( Grado_Destino >= 0) ");
Posicion_Inicial = (Grado_Actual* Relacion);
Serial.print (" Posicion_Inicial "); Serial.println (Posicion_Inicial);
Posicion_Final = (Grado_Destino * Relacion);
Serial.print (" Posicion_Final "); Serial.println ( Posicion_Final );
Grado_Destino_Redondeado = round(Grado_Destino);
CalculaDigitosGrados(Grado_Destino_Redondeado);
Atrasa(Posicion_Inicial,Posicion_Final);
Grado_Actual= Grado_Destino ;
Serial.print (" Posicion_Inicial "); Serial.print (Posicion_Inicial);Serial.print (" Posicion_Final "); Serial.println (Posicion_Final);
Serial.println ("");
}
if( Grado_Destino_Redondeado == 360)
{
Serial.print (" Grado_Destino_Redondeado == 360 ");
Serial.print (" Pone Grado_Actual = 0 ");
Grado_Actual = 0; CalculaDigitosGrados( 0);
}
}
}
void Leer_EstadoBotones()
{
//Serial.println("Leyendo estado botones ");
Bt_Mas_Divisiones = !digitalRead(Pin_Boton_Mas_Divisiones);
Bt_Menos_Divisiones = !digitalRead(Pin_Boton_Menos_Divisiones);
Bt_Avanzar = !digitalRead(Pin_Boton_Avanzar);
Bt_Retroceder = !digitalRead(Pin_Boton_Retroceder);
}
void CalculaDigitosGrados(int Num)
{
Serial.print (" Dentro de calcula grados , Grado_Destino = "); Serial.println (Num);
Grado[3] = (int8_t)(Num %10) ;
Grado[2] = (int8_t)((Num % 100) / 10) ;
Grado[1] = (int8_t)((Num % 1000) / 100) ;
Grado[0] = (int8_t)(16) ;
Display_Grado.display(Grado);
}
void CalculaDigitosDivisiones( int Num)
{
Serial.print (" Dentro de calcula divisiones , Divisiones = "); Serial.println (Num);
Divisiones[3] = (int8_t)(Num %10);
Divisiones[2] = (int8_t)((Num % 100) / 10);
Divisiones[1] = (int8_t)((Num % 1000) / 100);
Divisiones[0] = (int8_t)(16);
Display_Divisiones.display(Divisiones);
}
void Avanza(long Inicial,long Final)
{
Serial.print (" Dentro de Avanza “); Serial.print (” Inicial: “); Serial.print (Inicial); Serial.print (” Final: "); Serial.println (Final);
for (long i=Inicial; i < Final; i++)
{
// Serial.print("Avanzando ");
//Serial.println(i);
digitalWrite(Pin_Dir_Motor, 1); digitalWrite(Pin_Paso_Motor,1); delayMicroseconds(Tiempo_Paso);
digitalWrite(Pin_Paso_Motor, 0);
}
}
void Atrasa(long Inicial,long Final)
{
Serial.print (" Dentro de Atrasa “); Serial.print (” Inicial: “); Serial.print (Inicial); Serial.print (” Final: "); Serial.println (Final);
for (long i=Final; i < Inicial; i++)
{
// Serial.print("Avanzando ");
//Serial.println(i);
digitalWrite(Pin_Dir_Motor, 0); digitalWrite(Pin_Paso_Motor,1); delayMicroseconds(Tiempo_Paso);
digitalWrite(Pin_Paso_Motor, 0);
}
}