Google+ post by jose becerra on 2018-09-03 14:22:23 UTC

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);
  }

}