// https://wokwi.com/projects/382230750316407809
// nota: el motor paso a paso del simulador es bipolar!!
const int motor_A = 23;
const int motor_B = 22;
const int motor_C = 19;
const int motor_D = 18;
#define NUMSEC 4 // 4 u 8 # lineas de secuencia de movimiento
int tabla_pasos[NUMSEC][4]={ // A B C D
// {HIGH,LOW, LOW, LOW},
{HIGH,HIGH, LOW, LOW},
// {LOW, HIGH, LOW, LOW},
{LOW, HIGH, HIGH,LOW},
// {LOW, LOW, HIGH,LOW},
{LOW, LOW, HIGH,HIGH},
// {LOW, LOW, LOW, HIGH},
{HIGH,LOW, LOW, HIGH}
};
#define NPASOS_VUELTA_INTERNA 32 // 32 paso completo, 64 semipaso
#define RELACION_VUELTAS_ENGRANAJE 64 // VUELTAS INTERNAS PARA HACER 1 VUELTA EXTERNA
int npasos=0; // llega a NPASOS_VUELTA_INTERNA y cuenta vuelta interna ++
int nvueltas_internas=0; // llega a RELACION_VUELTAS_ENGRANAJE y cuenta vuelta externa ++
int nvueltas_externas=0; // lleva la cuenta de vueltas del eje externo
// funcion que proporciona el movimiento del siguiente paso
void sgte_paso(){
static int idsec=0; // va recorriendo la siguiente tabla
// escribimos los valores nuevos de la tabla en los pines ABCD
digitalWrite(motor_A, tabla_pasos[idsec][0]);
digitalWrite(motor_B, tabla_pasos[idsec][1]);
digitalWrite(motor_C, tabla_pasos[idsec][2]);
digitalWrite(motor_D, tabla_pasos[idsec][3]);
if( (++idsec)==NUMSEC) idsec=0;
return;
}
void setup()
{
// pines de salida del motor
pinMode(motor_A, OUTPUT);
pinMode(motor_B, OUTPUT);
pinMode(motor_C, OUTPUT);
pinMode(motor_D, OUTPUT);
// initialize the serial port
Serial.begin(115200);
delay(100);
Serial.println("----------------");
Serial.println("Comienzo programa control motor paso a paso");
Serial.printf("Pasos de secuencia de movimiento -> %d\n", NUMSEC);
Serial.printf("Npasos 32 paso completo, 64 semipasode -> %d\n", NPASOS_VUELTA_INTERNA);
Serial.printf("Relacion engranaje - %d vueltas internas para dar 1 vuelta externa \n \n", RELACION_VUELTAS_ENGRANAJE);
delay(1000); // antes de comenzar el bucle del programa
}
unsigned long t1=0;
void loop()
{
delay(10); // retardo en dar el siguiente paso -> no bajar de 2 ms (da una vuelta en T * 32 pasos * 64 engranaje)
npasos++; //si llega a NPASOS_VUELTA_INTERNA -> cuenta nvueltas interna ++
if(npasos == NPASOS_VUELTA_INTERNA){
npasos=0;
nvueltas_internas++;
if(nvueltas_internas==RELACION_VUELTAS_ENGRANAJE){ // llega a RELACION_VUELTAS_ENGRANAJE y cuenta vuelta externa ++
nvueltas_internas=0;
nvueltas_externas++; // lleva la cuenta de vueltas del eje externo
}
}
sgte_paso(); // mueve el motor
// cada segundo imprime mensaje de información
if(millis()>t1+1000){ // 1*32 en paso completo para una vuelta, 2*32=64 si se va de medio paso
t1=millis();
Serial.printf("Vueltas externas %d internas %d npasos: %d \n",
nvueltas_internas, nvueltas_externas, npasos);
}
}