Código Fuente:
const int dirPin = 8; const int stepPin = 9; unsigned long pasosvuelta; float grados; unsigned long rpms; unsigned long pasos; unsigned long retardo; String mensaje = ""; //-----------------SETUP------------------------------ void setup() { pinMode(dirPin, OUTPUT); //coloco el Pin de Dirección como salida pinMode(stepPin, OUTPUT); //coloco el Pin de Step como salida Serial.begin(115200); //inicio la comunicación serial a 115200 baud pasosporvuelta(); //llamo a la función para definir los pasos por vuelta. } //-----------------LOOP------------------------------ void loop() { sentido(); //llamo a la función para definir el sentido de giro. giro(); //llamo a la función para definir los grados que debe girar el motor. velocidad(); //llamo a la función para definir la velocidad de giro en RPM. pasos = (grados/360)*pasosvuelta; //calculo la cantidad de pasos que tengo que enviar. Serial.print(pasos); Serial.print(" pasos a "); retardo = 30000000/(rpms*pasosvuelta); //calculo el retardo según las RPM indicadas. Serial.print(retardo); Serial.print(" uSeg\n"); Serial.println("---------------------------------------"); for (int x = 0; x < pasos; x++) { //envio los pasos calculados con el retardo calculado digitalWrite(stepPin, HIGH); delayMicroseconds(retardo); digitalWrite(stepPin, LOW); delayMicroseconds(retardo); } } //-----------------FUNCIONES-------------------------- void pasosporvuelta() { Serial.print("¿Pasos por vuelta? (pasos del motor * micropasos) "); while (Serial.available() == 0 ) {} //queda esperando hasta recibir un mensaje mensaje = Serial.readString(); pasosvuelta = mensaje.toInt(); //convierte en mensaje recibido en un entero if (pasosvuelta == 0) { //si no es un número envía ERROR y vuelve a llamar a la función Serial.print("ERROR\n"); pasosporvuelta(); } else { //si es un número nos envia un mensaje de OK Serial.print(pasosvuelta); Serial.print(" OK\n"); } } void sentido() { Serial.print("¿Sentido de giro? (0 horario / 1 antihorario) "); while (Serial.available() == 0 ) {} mensaje = Serial.readString(); if (mensaje == "0\n") { Serial.print("horario OK\n"); digitalWrite(dirPin, HIGH); } else if (mensaje == "1\n") { Serial.print("antihorario OK\n"); digitalWrite(dirPin, LOW); } else { Serial.print("ERROR\n"); sentido(); } } void giro() { Serial.print("¿Grados? "); while (Serial.available() == 0 ) {} mensaje = Serial.readString(); grados = mensaje.toFloat(); if (pasosvuelta == 0) { Serial.print("ERROR\n"); giro(); } else { Serial.print(grados); Serial.print(" OK\n"); } } void velocidad() { Serial.print("¿Velocidad de giro? (RPM) "); while (Serial.available() == 0 ) {} mensaje = Serial.readString(); rpms = mensaje.toInt(); if (rpms == 0) { Serial.print("ERROR\n"); velocidad(); } else { Serial.print(rpms); Serial.print(" OK\n"); } }