Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Control MOTOR NEMA 11 con A4988 y Arduino
- * Antonio Villanueva Segura
- * A4988
- * /ENABLE VMOT +8V
- * (PIN 3 ARDUINO ) MS1 GND GND
- * (PIN 4 ARDUINO ) MS2 2B AZUL (NEMA 11)
- * (PIN 5 ARDUINO ) MS3 2A ROJO (NEMA 11)
- * cable a SLEEP RESET 1A NEGRO (NEMA 11)
- * cable a RESET SLEEP 1B VERDE (NEMA 11)
- * (PIN 2 ARDUINO )STEP VDD +5V_ARDUINO
- * (PIN 5 ARDUINO) DIR GND GND GND_ARDUINO
- */
- /**************************************************************************************************************/
- //Definiciones de PINs en el ARDUINO uno
- #define STEP 2 /* Pasos */
- /* RESOLUCION uPASO FULL 1/2 1/4 1/8 1/16 */
- #define MS1 3 /* control pasos 0 1 0 1 1 */
- #define MS2 4 /* control pasos 0 0 1 1 1 */
- #define MS3 5 /* control pasos 0 0 0 0 1 */
- #define DIR 6 /* Sentido de giro */
- #define EN 8 /* Habilita A4988 */
- /**************************************************************************************************************/
- //Variables globales
- float angulo(-1); //Seleccion
- int pasos(0);
- bool _ms1 (false);//Variables control uPasos sirven para recalcular los grados
- bool _ms2 (false);//Variables control uPasos sirven para recalcular los grados
- bool _ms3 (false);//Variables control uPasos sirven para recalcular los grados
- /**************************************************************************************************************/
- void setup()//Configuracion
- {
- Serial.begin(9600);//Velocidad puerto serie
- pinMode(EN, OUTPUT);//PIN ENABLE como salida
- pinMode(DIR, OUTPUT);//DIR como salida
- pinMode(STEP, OUTPUT);//STEP como salida
- pinMode(MS1, OUTPUT);//control pasos
- pinMode(MS2, OUTPUT);//control pasos
- pinMode(MS3, OUTPUT);//control pasos
- digitalWrite(MS1, LOW); //Configura control paso FULL
- digitalWrite(MS2, LOW); //Configura control paso FULL
- digitalWrite(MS3, LOW); //Configura control paso FULL
- digitalWrite(EN, HIGH); //Ponemos a nivel bajo ENABLE , habilita A4988
- }
- /**************************************************************************************************************/
- void sentidoGiro(boolean sentido){//Sentido de giro
- digitalWrite(DIR, sentido);
- }
- /**************************************************************************************************************/
- void cambiaMicroPaso(bool ms1,bool ms2,bool ms3){
- _ms1=ms1;//Actualiza las variables de uPasos para recalcular angulo
- _ms2=ms2;//Actualiza las variables de uPasos para recalcular angulo
- _ms3=ms3;//Actualiza las variables de uPasos para recalcular angulo
- digitalWrite(MS1, ms1); //Configura control paso
- digitalWrite(MS2, ms2); //Configura control paso
- digitalWrite(MS3, ms3); //Configura control paso
- }
- /**************************************************************************************************************/
- void seleccionMicroPaso (int upaso){ //Seleccion del uPaso
- switch (upaso){
- case 0://FULL
- cambiaMicroPaso(LOW,LOW,LOW);
- Serial.println("\nFULL (1.8°)");
- break;
- case 1:// 1/2
- cambiaMicroPaso(HIGH,LOW,LOW);
- Serial.println("\nuPaso 1/2 (0.9°)");
- break;
- case 2:// 1/4
- cambiaMicroPaso(LOW,HIGH,LOW);
- Serial.println("\nuPaso 1/4 (0.45°)");
- break;
- case 3:// 1/8
- cambiaMicroPaso(HIGH,HIGH,LOW);
- Serial.println("\nuPaso 1/8 (0.225°)");
- break;
- case 4:// 1/16
- cambiaMicroPaso(HIGH,HIGH,HIGH);
- Serial.println("\nuPaso 1/16 (0.1125°)");
- break;
- }
- }
- /**************************************************************************************************************/
- void unPaso(){//Un paso
- digitalWrite(EN, LOW); //LOW ENABLE a4988
- digitalWrite(STEP, HIGH);//Crea el paso
- delay(1);
- digitalWrite(STEP, LOW);
- delay(1);
- }
- /**************************************************************************************************************/
- //Traduce el Angulo a una secuencia de pasos
- int AnguloPasos(float angulo_new){//Paso entero
- int mult= compensauPasos();//Compensa el numero de pasos segun la config. de upasos ms1,ms2,ms3
- return (abs (angulo_new) / 1.8)*mult;
- }
- /**************************************************************************************************************/
- //Lee una cadena de texto del puerto serie
- String leeCadena(){
- String cadena="";
- if (Serial.available()) {cadena = Serial.readStringUntil('\n');}
- return cadena;
- }
- /**************************************************************************************************************/
- bool opcionesuPaso (String lectura){//Seleccion entrada RS232 para cambiar los micropasos , adaptado al teclado Frances
- if ( lectura[0]== 'a' || lectura[0]== 'A' ){seleccionMicroPaso (0);return true;}//FULL
- if ( lectura[0]== 'z' || lectura[0]== 'Z' ){seleccionMicroPaso (1);return true;}// 1/2
- if ( lectura[0]== 'e' || lectura[0]== 'E' ){seleccionMicroPaso (2);return true;}// 1/4
- if ( lectura[0]== 'r' || lectura[0]== 'R' ){seleccionMicroPaso (3);return true;}// 1/8
- if ( lectura[0]== 't' || lectura[0]== 'T' ){seleccionMicroPaso (4);return true;}// 1/16
- return false;
- }
- /**************************************************************************************************************/
- //Menu lectura Serie, devuelve un int valor de Angulo
- float menu(){
- Serial.print ("Angulo :");
- String lectura="";
- while (lectura== "" ){lectura=leeCadena();}//Espera un valor numerico o opcion de uPaso
- if (opcionesuPaso (lectura)){lectura="";}//Si es una seleccion de uPaso lectura a 0°
- Serial.println (lectura);//Muestra seleccion uPaso o el numero de pasos
- return lectura.toFloat();
- }
- /**************************************************************************************************************/
- /**************************************************************************************************************/
- int compensauPasos(){//Dependiendo del tipo de paso FULL 1/2 1/4 1/8 1/19 debe aumentar para conseguir el grado
- /* FULL 1/2 1/4 1/8 1/16 */
- /* A Z E R T */
- /* ms1 0 1 0 1 1 */
- /* ms2 0 0 1 1 1 */
- /* ms3 0 0 0 0 1 */
- if ( (_ms1) & !(_ms2) & !(_ms3)){return 2;} // 1/2 compensacion multiplica x2 el angulo
- if ( !(_ms1) & (_ms2) & !(_ms3)){return 4;} // 1/4 compensacion multiplica x4 el angulo
- if ( (_ms1) & (_ms2) & !(_ms3)){return 8;} // 1/8 compensacion multiplica x8 el angulo
- if ( (_ms1) & (_ms2) & (_ms3)){return 16;} // 1/16 compensacion multiplica x16 el angulo
- return 1;//FULL por defecto es 1 FULL , si no es ninguna de las opciones anteriores
- }
- /**************************************************************************************************************/
- void loop()//Bucle principal ARDUINO
- {
- angulo = menu();//Muestra mensaje y espera un Angulo
- pasos=AnguloPasos(angulo);//Traduce el angulo a numero de pasos
- sentidoGiro (angulo >0? true :false);//Selecciona sentido angulo + o -
- while ( pasos-- ){unPaso();}//Ejecuta el numero de pasos
- digitalWrite(EN, HIGH); //Ponemos a nivel ALTO , deshabilita A4988 evita consumo en paro
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement