Advertisement
AntonioVillanueva

Control NEMA11 con A4988 gestion micropasos

Mar 3rd, 2024
1,188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*        Control MOTOR NEMA 11 con A4988 y Arduino
  2.  *                Antonio Villanueva Segura
  3.  *                          A4988
  4.  *                    /ENABLE    VMOT +8V
  5.  *    (PIN 3 ARDUINO ) MS1       GND GND
  6.  *    (PIN 4 ARDUINO ) MS2       2B   AZUL (NEMA 11)
  7.  *    (PIN 5 ARDUINO ) MS3       2A   ROJO (NEMA 11)
  8.  *     cable a SLEEP  RESET     1A   NEGRO (NEMA 11)
  9.  *     cable a RESET  SLEEP     1B   VERDE (NEMA 11)
  10.  *    (PIN 2 ARDUINO )STEP      VDD +5V_ARDUINO
  11.  *    (PIN 5 ARDUINO) DIR       GND GND GND_ARDUINO
  12.  */
  13. /**************************************************************************************************************/
  14. //Definiciones de PINs en el ARDUINO uno
  15.  
  16. #define STEP 2 /* Pasos */
  17. /*     RESOLUCION uPASO         FULL 1/2   1/4   1/8  1/16  */
  18. #define MS1 3 /* control pasos  0    1      0     1     1   */
  19. #define MS2 4 /* control pasos  0    0      1     1     1   */
  20. #define MS3 5 /* control pasos  0    0      0     0     1   */
  21.  
  22. #define DIR 6 /* Sentido de giro */
  23. #define EN 8 /* Habilita A4988 */
  24. /**************************************************************************************************************/
  25. //Variables globales
  26. float angulo(-1); //Seleccion
  27. int pasos(0);
  28. bool _ms1 (false);//Variables control uPasos sirven para recalcular los grados
  29. bool _ms2 (false);//Variables control uPasos sirven para recalcular los grados
  30. bool _ms3 (false);//Variables control uPasos sirven para recalcular los grados
  31. /**************************************************************************************************************/
  32. void setup()//Configuracion
  33. {
  34.   Serial.begin(9600);//Velocidad puerto serie
  35.  
  36.   pinMode(EN, OUTPUT);//PIN ENABLE como salida
  37.   pinMode(DIR, OUTPUT);//DIR como salida
  38.   pinMode(STEP, OUTPUT);//STEP como salida
  39.  
  40.   pinMode(MS1, OUTPUT);//control pasos
  41.   pinMode(MS2, OUTPUT);//control pasos  
  42.   pinMode(MS3, OUTPUT);//control pasos
  43.  
  44.   digitalWrite(MS1, LOW); //Configura control paso FULL
  45.   digitalWrite(MS2, LOW); //Configura control paso FULL
  46.   digitalWrite(MS3, LOW); //Configura control paso FULL
  47.    
  48.   digitalWrite(EN, HIGH); //Ponemos a nivel bajo ENABLE , habilita A4988
  49. }
  50. /**************************************************************************************************************/
  51. void sentidoGiro(boolean sentido){//Sentido de giro
  52.     digitalWrite(DIR, sentido);
  53. }
  54. /**************************************************************************************************************/
  55. void cambiaMicroPaso(bool ms1,bool ms2,bool ms3){
  56.   _ms1=ms1;//Actualiza las variables de uPasos para recalcular angulo
  57.   _ms2=ms2;//Actualiza las variables de uPasos para recalcular angulo
  58.   _ms3=ms3;//Actualiza las variables de uPasos para recalcular angulo
  59.   digitalWrite(MS1, ms1); //Configura control paso
  60.   digitalWrite(MS2, ms2); //Configura control paso  
  61.   digitalWrite(MS3, ms3); //Configura control paso
  62. }
  63. /**************************************************************************************************************/
  64. void seleccionMicroPaso (int upaso){ //Seleccion del uPaso
  65.  
  66.   switch (upaso){
  67.     case 0://FULL
  68.       cambiaMicroPaso(LOW,LOW,LOW);
  69.       Serial.println("\nFULL (1.8°)");
  70.       break;
  71.  
  72.     case 1:// 1/2
  73.       cambiaMicroPaso(HIGH,LOW,LOW);
  74.       Serial.println("\nuPaso 1/2 (0.9°)");      
  75.       break;
  76.  
  77.     case 2:// 1/4
  78.       cambiaMicroPaso(LOW,HIGH,LOW);
  79.       Serial.println("\nuPaso 1/4 (0.45°)");      
  80.       break;
  81.  
  82.     case 3:// 1/8
  83.       cambiaMicroPaso(HIGH,HIGH,LOW);
  84.       Serial.println("\nuPaso 1/8 (0.225°)");      
  85.       break;
  86.          
  87.     case 4:// 1/16
  88.       cambiaMicroPaso(HIGH,HIGH,HIGH);
  89.       Serial.println("\nuPaso 1/16 (0.1125°)");      
  90.       break;                      
  91.    
  92.   }
  93.  
  94. }
  95. /**************************************************************************************************************/
  96. void unPaso(){//Un paso
  97.   digitalWrite(EN, LOW); //LOW ENABLE a4988
  98.  
  99.   digitalWrite(STEP, HIGH);//Crea el paso
  100.   delay(1);
  101.   digitalWrite(STEP, LOW);
  102.   delay(1);  
  103. }
  104. /**************************************************************************************************************/
  105. //Traduce el Angulo a una secuencia de pasos
  106. int AnguloPasos(float angulo_new){//Paso entero
  107.   int mult= compensauPasos();//Compensa el numero de pasos segun la config. de upasos ms1,ms2,ms3
  108.   return (abs (angulo_new) / 1.8)*mult;
  109. }
  110. /**************************************************************************************************************/
  111. //Lee una cadena de texto del puerto serie
  112. String leeCadena(){
  113.   String cadena="";
  114.   if (Serial.available()) {cadena = Serial.readStringUntil('\n');}
  115.   return cadena;
  116. }
  117. /**************************************************************************************************************/
  118. bool opcionesuPaso (String lectura){//Seleccion entrada RS232 para cambiar los micropasos , adaptado al teclado Frances
  119.   if ( lectura[0]== 'a' || lectura[0]== 'A' ){seleccionMicroPaso (0);return true;}//FULL
  120.   if ( lectura[0]== 'z' || lectura[0]== 'Z' ){seleccionMicroPaso (1);return true;}// 1/2  
  121.   if ( lectura[0]== 'e' || lectura[0]== 'E' ){seleccionMicroPaso (2);return true;}// 1/4
  122.   if ( lectura[0]== 'r' || lectura[0]== 'R' ){seleccionMicroPaso (3);return true;}// 1/8
  123.   if ( lectura[0]== 't' || lectura[0]== 'T' ){seleccionMicroPaso (4);return true;}// 1/16  
  124.   return false;
  125. }
  126. /**************************************************************************************************************/
  127. //Menu lectura Serie, devuelve un int valor de Angulo
  128. float menu(){
  129.   Serial.print ("Angulo :");
  130.   String lectura="";
  131.   while (lectura== "" ){lectura=leeCadena();}//Espera un valor numerico o opcion de uPaso
  132.   if (opcionesuPaso (lectura)){lectura="";}//Si es una seleccion de uPaso lectura a 0°
  133.   Serial.println (lectura);//Muestra seleccion uPaso o el numero de pasos
  134.  
  135.   return lectura.toFloat();
  136. }
  137. /**************************************************************************************************************/
  138. /**************************************************************************************************************/
  139. int compensauPasos(){//Dependiendo del tipo de paso FULL 1/2 1/4 1/8 1/19 debe aumentar para conseguir el grado
  140. /*      FULL 1/2   1/4   1/8  1/16    */
  141. /*       A    Z     E     R     T     */
  142. /*  ms1  0    1     0     1     1     */
  143. /*  ms2  0    0     1     1     1     */
  144. /*  ms3  0    0     0     0     1     */
  145.   if (  (_ms1) &  !(_ms2) &  !(_ms3)){return 2;}  //  1/2  compensacion multiplica x2 el angulo
  146.   if ( !(_ms1) &   (_ms2) &  !(_ms3)){return 4;}  // 1/4  compensacion multiplica x4 el angulo
  147.   if (  (_ms1) &   (_ms2) &  !(_ms3)){return 8;}  // 1/8  compensacion multiplica x8 el angulo  
  148.   if (  (_ms1) &   (_ms2) &   (_ms3)){return 16;} // 1/16  compensacion multiplica x16 el angulo          
  149.   return 1;//FULL por defecto es 1 FULL , si no es ninguna de las opciones anteriores
  150. }
  151. /**************************************************************************************************************/
  152. void loop()//Bucle principal ARDUINO
  153. {
  154.  
  155.   angulo = menu();//Muestra mensaje y espera un Angulo
  156.   pasos=AnguloPasos(angulo);//Traduce el angulo a numero de pasos
  157.   sentidoGiro (angulo >0? true :false);//Selecciona sentido angulo + o -
  158.  
  159.   while ( pasos-- ){unPaso();}//Ejecuta el numero de pasos
  160.   digitalWrite(EN, HIGH); //Ponemos a nivel ALTO  , deshabilita A4988 evita consumo en paro  
  161.  
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement