Advertisement
AntonioVillanueva

Control Condensador mariposa arduino

Mar 13th, 2022 (edited)
1,381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * Control de un condensador mariposa 180°
  3.  * Antonio Villanueva Segura
  4.  *
  5.  *  *Modelo motor EM-258 200 pasos en 360° 360/200= 1.8° cada paso Nominal Voltage 7
  6.  * https://cdn-learn.adafruit.com/downloads/pdf/afmotor-library-reference.pdf
  7.  * http://www.motors.wrobots.com/EM-258_17PM-K212-PIT.php
  8.  *
  9.  */
  10. #include <AFMotor.h>
  11. #include <EEPROM.h>   //Uso de memoria EEPROM
  12.  
  13. #define CAPACIDAD_MAX 220
  14. #define PASOS 200
  15. #define RPM 30
  16.  
  17. // Define el puerto del MOTOR M1 y sus pasos
  18. AF_Stepper motor(200, 1);// M1 200 pasos
  19.  
  20. float capacidad =0 ;//Datos capacidad
  21. float capacidad_mem = 0;//Direccion EEPROM para la capacidad uf,100.000 ciclos de escritura por cada posición de memoria
  22. bool sentido =true;
  23.  
  24. /**************************************************************************************************************/
  25. void setup() {
  26.   Serial.begin(9600);
  27.   Serial.println("\n A.Villanueva Ctrl. Condensador aire 180° \n");
  28.   motor.setSpeed(RPM);  // 10 rpm  
  29.   //borrarDatos(); //Pide si se quiere borrar datos de capacidad
  30.   capacidad=recuperaMemoria(); //Lee datos de la capacidad desde la EEPROM
  31.  
  32.   Serial.println ("Recuperada capacidad de la memoria = ");
  33.   Serial.println (capacidad);
  34.   delay (2000);
  35.  
  36. }
  37. /**************************************************************************************************************/
  38. void loop() { //Bucle principal
  39.   float nuevaCapacidad=-1; //Seleccion
  40.   //testMovCondensador( sentido );//  sentido = !sentido; //Rutina para efectuar test repetitivo 0 a 180°
  41.  
  42.   nuevaCapacidad = menu();//Muestra menu y lee la nueva capacidad
  43.  
  44.   Serial.print ("Lectura menu = ");
  45.   Serial.println (nuevaCapacidad);
  46.   nuevaCapacidad=normalizaCapacidad (nuevaCapacidad);
  47.  
  48.   if (nuevaCapacidad != capacidad){ //Si tenemos una nueva capacidad , traducimos la capacidad en pasos
  49.     capacidadPasos(nuevaCapacidad) ;
  50.   }
  51.  
  52.   delay(1000);//1 segundo retardi
  53. }
  54. /**************************************************************************************************************/
  55. //Test movimiento de 0 a 180°(100 pasos ) del motor PAP EM-258
  56. void testMovCondensador(bool sentido ){//Mueve 0 a 180° el condensador
  57.   int pasos=100; //0 a 180°
  58.   motores (&motor, pasos, sentido); //Envia los pasos al motor
  59. }
  60.  
  61. /**************************************************************************************************************/
  62. //Normaliza el valor de la capacidad para ser multiplo de 2.2 un paso , p.e 4u6f  se normalizara a 4u4f
  63. float normalizaCapacidad (float capacidad){
  64.   float cap=0;
  65.   while ( ((capacidad)- (cap +2.2) )>=0.0 ){ cap += 2.2;}
  66.   Serial.print ("Valor normalizado = ");Serial.println (cap);
  67.  
  68.   return cap;
  69. }
  70.  
  71. /**************************************************************************************************************/
  72. //Traduce la capacidad a una secuencia de pasos
  73. void capacidadPasos(float cap_new){
  74.   //100 pasos equivalen a 180° y a una capacidad asociada de 220 pf , 220/100 =1paso =2p2f
  75.  
  76.   float capacidadDesplazamiento= cap_new - capacidad   ;//Cuanto se desplaza y en que direccion ?
  77.  
  78.   bool sentido = ( capacidadDesplazamiento < 0 ) ? true : false; //Sentido de desplazamiento
  79.  
  80.  if (! limitesCap(capacidadDesplazamiento, sentido)){return; } //Nueva capacidad fuera de limites
  81.   float pasos = abs((capacidadDesplazamiento) / 2.2 ); //Multiplos de 2.2 , cada paso es 2u2F
  82.  
  83.   if (abs (pasos)  > 0){ //Si hay pasos actuo sobre el motor
  84.     motores (&motor, abs (pasos), sentido); //Envia los pasos al motor
  85.     capacidad=cap_new;//Actualiza la capacidad actual en memoria RAM
  86.     guardaMemoria( capacidad);//Guarda en memoria EEPROM la capacidad por si hay problema 100.000 ciclos de escritura por cada posición de memoria
  87.   }
  88.  
  89. }
  90. /**************************************************************************************************************/
  91. void borrarDatos (){//Borra datos EEPROM
  92.   String lectura="";
  93.  
  94.     Serial.println ("Quieres borrar datos ? ");
  95.   while (lectura== ""  ){lectura=leeCadena();}//Espera una lectura no nula
  96.   if (lectura[0]=='S' or lectura[0]=='s' ){
  97.     Serial.println ("Datos Borrados , ahora estamos en capacidad 0pf ");
  98.     //clearMemory();
  99.     guardaMemoria(0);//Guarda 0pf
  100.   }
  101. }
  102. /**************************************************************************************************************/
  103. //Lee una cadena de texto del puerto serie
  104. String leeCadena(){
  105.   String cadena="";
  106.   if (Serial.available()) {cadena = Serial.readStringUntil('\n');}
  107.   return cadena;
  108. }
  109. /**************************************************************************************************************/
  110. //Menu lectura Serie, devuelve un int valor de capacidad
  111. float menu(){
  112.   String lectura="";
  113.  
  114.   Serial.println ("\n --- Menu ---  ");
  115.   Serial.println (" C clear EEPROM");
  116.   Serial.println (" R clear capacidad RAM = 0");
  117.   Serial.println (" A Avanza     5 pasos  10 pf");
  118.   Serial.println (" Q Retrocede  5 pasos -10 pf");
  119.   Serial.println (" Z avanza     10 pasos 22 pf");  
  120.   Serial.println (" S Retrocede  10 pasos -22 pf");
  121.   Serial.print   (" Capacidad actual = ");
  122.   Serial.println(capacidad);
  123.  
  124.   Serial.print (" o Introduzca capacidad de 0 a ");
  125.   Serial.println (CAPACIDAD_MAX);
  126.  
  127.   while (lectura== "" ){lectura=leeCadena();}//Espera una lectura no nula del serie
  128.  
  129.   return opciones (lectura);
  130. }
  131. /**************************************************************************************************************/
  132. //Analiza si la nueva capacidad  esta dentro de los margenes del condensador
  133. bool  limitesCap(float new_cap,bool sentido ){
  134.   if (! sentido && (abs ( new_cap) < CAPACIDAD_MAX)){return true;} //Dentro de limite superior CAPACIDAD_MAXIMA
  135.   if (sentido && (abs (new_cap)) >= 0){return true;}//Limite inferior 0
  136.  
  137.   return false;//Fuera de limites
  138. }
  139. /**************************************************************************************************************/
  140. float opciones(String lectura){
  141.   //Opciones
  142.  
  143.   if ( lectura[0]== 'C' || lectura[0]== 'c' ){clearMemory();}//Clear EEPROM
  144.   if ( lectura[0]== 'R' || lectura[0]== 'r' ){capacidad=0; }//Clear RAM este punto es 0pf
  145.   if ( lectura[0]== 'A' || lectura[0]== 'a' ){ lectura = ( capacidad + 10) ; }//AVANZA 5 pasos
  146.   if ( lectura[0]== 'Q' || lectura[0]== 'q' ){ lectura = ( capacidad - 10 >= 0 ? capacidad - 10 :capacidad ) ;}//RETROCEDE 5 pasos  
  147.   if ( lectura[0]== 'Z' || lectura[0]== 'z' ){ lectura = ( capacidad + 22) ;}//AVANZA 10 pasos
  148.   if ( lectura[0]== 'S' || lectura[0]== 's' ){ lectura = ( capacidad - 22 >= 0? capacidad - 22 :capacidad ) ;}//RETROCEDE 10 pasos
  149.  
  150.  
  151.   //Se trata de una capacidad analiza si esta en los limites
  152.   //Analiza el uso de un valor capacitivo directamente
  153.   //Analiza que la capcidad leida sea correcta si es erroneo devuelve -1
  154.  
  155.   if ( lectura.toFloat() >220 or lectura.toFloat() <0){
  156.     Serial.println("ERROR ! Seleccion fuera de limites !");
  157.     return capacidad;
  158.   }
  159.  
  160.   return lectura.toFloat();
  161.    
  162. }
  163. /**************************************************************************************************************/
  164. //Guarda en EEPROM la capacidad
  165. void guardaMemoria( float capacidad){
  166.   Serial.print("EEPROM save =");
  167.   Serial.println (capacidad);
  168.   EEPROM.put( capacidad_mem, capacidad );  //Grabamos el valor
  169. }
  170. /**************************************************************************************************************/
  171. //Lee datos de la capacidad en la memoria EEPROM
  172. float recuperaMemoria( ){
  173.   return EEPROM.get( capacidad_mem, capacidad );//Recupera valor capacidad actual
  174. }
  175. /**************************************************************************************************************/
  176. void clearMemory(){//Limpia la Memoria EEPROM
  177.   Serial.println ("\n Clear EEPROM y RAM capacidad a 0 ! ");
  178.   capacidad=0;//Limpia RAM
  179.   for (int i = 0 ; i < EEPROM.length() ; i++) {
  180.     EEPROM.write(i, 0);
  181.   }
  182. }
  183. /**************************************************************************************************************/
  184. //Funcion giro de motor PAP , argumento pasos y el sentido de giro
  185. void motores (AF_Stepper *motor,int pasos,bool sentido){
  186.     if (sentido ==true){
  187.       (*motor).step(pasos, FORWARD, SINGLE); //Giro derecha
  188.   }else{
  189.      (*motor).step(pasos, BACKWARD, SINGLE); //Giro Izquierda
  190.   }
  191.  
  192. }
  193. /**************************************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement