miércoles, 27 de noviembre de 2019

Cómo Probar Motores Paso a Paso con Arduino y sin Ariduino (con 555)


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