Advertisement
AntonioVillanueva

Control motor PAP con arduino

Feb 25th, 2024 (edited)
818
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * Control Condensador variable
  3.  * Antonio Villanueva Segura
  4.  *
  5.  * MOTOR NEMA 17 17HS08-1004S 1.8° 1A 3V5..5v  pasos= 360°/1.8(1 paso) = 200 PASOS
  6.  *  instalar libreria AF_Motor
  7.  * https://cdn-learn.adafruit.com/downloads/pdf/afmotor-library-reference.pdf
  8.  *
  9.  */
  10. #include <AFMotor.h>
  11. #include <EEPROM.h>   //Uso de memoria EEPROM
  12.  
  13. #define Angulo_MAX 220
  14. #define PASOS 200
  15. #define RPM 22
  16. #define MOTEUR 1 //PUERTO 1 M1
  17. #define TIPO INTERLEAVE //SINGLE DOUBLE INTERLEAVE MICROSTEP
  18.  
  19. // Define el puerto del MOTOR M1 o M2 y sus pasos
  20. AF_Stepper motor(200, MOTEUR);// (M2 M1) M1=1 (M3 M4) M2=2   360/1.8°= 200 pasos
  21.  
  22. bool sentido =true;
  23.  
  24. /**************************************************************************************************************/
  25. void setup() {
  26.   Serial.begin(9600);
  27.   Serial.println("\n A.Villanueva Ctrl. Condensador \n");
  28.   motor.setSpeed(RPM);  // 10 rpm
  29.   Serial.print("SELECCIONADO MOTOR N° :");
  30.   Serial.println (MOTEUR);
  31.   Serial.print("VELOCIDAD RPM :");
  32.   Serial.println (RPM);
  33.   delay (2000);
  34.  
  35. }
  36. /*********************BUCLE PRINCIPAL *************************************************************************/
  37. void loop() { //Bucle principal
  38.   float nuevoAngulo=-1; //Seleccion
  39.   int pasos(0);
  40.   //testMovCondensador( sentido );//  sentido = !sentido; //Rutina para efectuar test repetitivo 0 a 180°
  41.   nuevoAngulo = menu();//Muestra menu y lee la nuevo Angulo
  42.  
  43.   Serial.print ("Lectura menu = ");//Menu RS232
  44.   pasos=AnguloPasos(nuevoAngulo) ;//Convertir angulo a pasos sabiendo que cada paso es 1.8 o 0.9 si es micro
  45.   Serial.print ("Pasos :");Serial.println(pasos);//Muestra los pasos calculados
  46.   //Serial.print ("Angulo Real : ");Serial.println( (pasos) *1.8);
  47.   Serial.print ("Angulo Real : ");Serial.println( (pasos *1.8) / ((TIPO==INTERLEAVE)?2.0:1.0));
  48.  
  49.   motores(&motor,pasos,nuevoAngulo<0 ? false:true); //Activa el motor , analiza el sentido segun sea + o - el angulo
  50.   delay(1000);//1 segundo retardo
  51. }
  52. /**************************************************************************************************************/
  53. //Test movimiento de 0 a 180°(100 pasos ) del motor PAP EM-258
  54. void testMovCondensador(bool sentido ){//Mueve 0 a 180° el condensador
  55.   int pasos=AnguloPasos(360);//Test 360°
  56.   motores (&motor, pasos, sentido); //Envia los pasos al motor
  57. }
  58.  
  59. /**************************************************************************************************************/
  60. //Traduce el Angulo a una secuencia de pasos
  61. int AnguloPasos(float angulo_new){
  62.  
  63.   int mult(1);
  64.   if (TIPO==INTERLEAVE){mult=2;}
  65.   return (abs (angulo_new) / 1.8)*mult;
  66. }
  67.  
  68. /**************************************************************************************************************/
  69. //Lee una cadena de texto del puerto serie
  70. String leeCadena(){
  71.   String cadena="";
  72.   if (Serial.available()) {cadena = Serial.readStringUntil('\n');}
  73.   return cadena;
  74. }
  75. /**************************************************************************************************************/
  76. //Menu lectura Serie, devuelve un int valor de Angulo
  77. float menu(){
  78.   String lectura="";
  79.  
  80.   Serial.println ("\n --- Menu ---  ");
  81.   Serial.println (" a 45 grados");
  82.   Serial.println (" z 90 grados ");
  83.   Serial.println (" e 180 grados ");  
  84.   Serial.println (" r 360 grados ");
  85.  
  86.   Serial.print (" ..  o Introduzca Angulo ");
  87.  
  88.   while (lectura== "" ){lectura=leeCadena();}//Espera una lectura no nula del serie
  89.  
  90.   return opciones (lectura);
  91. }
  92.  
  93. /**************************************************************************************************************/
  94. float opciones(String lectura){
  95.   //OpcionesSerial.print
  96.    
  97.   if ( lectura[0]== 'a' || lectura[0]== 'A' ){ lectura = 45 ;}//AVANZA 45 grados
  98.   if ( lectura[0]== 'z' || lectura[0]== 'Z' ){ lectura = 90;}//AVANZA 90 grados  
  99.   if ( lectura[0]== 'e' || lectura[0]== 'E' ){ lectura = 180;}//AVANZA 180 grados
  100.   if ( lectura[0]== 'r' || lectura[0]== 'R' ){ lectura = 360;}//AVANZA 360 grados
  101.  
  102.   return lectura.toFloat();
  103.    
  104. }
  105. /**************************************************************************************************************/
  106. //Funcion giro de motor PAP , argumento pasos y el sentido de giro
  107. /*
  108.  *"SINGLE" significa activación de una sola bobina,
  109.  *"DOUBLE" significa que se activan 2 bobinas a la vez (para un par mayor)
  110.  * "INTERLEAVE" significa que alterna entre SINGLE y DOUBLE para obtener el doble de resolución
  111.  *  (pero, por supuesto a la mitad de la velocidad). .
  112.  * "MICROSTEP" las bobinas se modulan por PWM  para crear un movimiento suave entre pasos.
  113.  */
  114.  
  115. void motores (AF_Stepper *motor,int pasos,bool sentido){
  116.  
  117.   if (sentido ==true){
  118.       Serial.println ("Giro FORWARD ");
  119.       (*motor).step(pasos, FORWARD, TIPO); //Giro derecha SINGLE DOUBLE INTERLEAVE MICROSTEP
  120.   }else{
  121.      Serial.println ("Giro BACKWARD ");
  122.      (*motor).step(pasos, BACKWARD, TIPO); //Giro Izquierda
  123.   }
  124.  
  125.   (*motor).release();//Para evitar calentamiento desconectamos tras cada operacion
  126. }
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement