Advertisement
AntonioVillanueva

Mueve un condensador multivuelta con un PAP simula capacidad y vueltas

Mar 10th, 2022 (edited)
1,157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. /* Mueve un motor PAP de 0 a VUELTAS_MAX 3 aqui en el ejemplo pero
  3.  *  puede variarse , muestra el contaje de vueltas por el puerto serie
  4.  *  y una prediccion de la capacidad de la capacidad del condensador basado
  5.  *  en CAPACIDAD_MAX 220 , guarda los datos en MEMORIA EEPROM
  6.  *  
  7.  *  Antonio Villanueva Segura
  8.  *  
  9.  * EM 258 200 pasos en 360° 360/200= 1.8° cada paso Nominal Voltage 7
  10.  * https://cdn-learn.adafruit.com/downloads/pdf/afmotor-library-reference.pdf
  11.  * http://www.motors.wrobots.com/EM-258_17PM-K212-PIT.php
  12.  */
  13. #include <AFMotor.h>
  14. #include <EEPROM.h>   //Uso de memoria EEPROM
  15.  
  16. int vuelta_mem = 0;   //Direccion EEPROM para las vueltas
  17. int sentido_mem = 2;  //Direccion EEPROM para el sentido de giro
  18. int capacidad_mem = 4;//Direccion EEPROM para la capacidad uf
  19.  
  20.  
  21. #define VUELTAS_MAX 3
  22. #define CAPACIDAD_MAX 220.0
  23. #define PASOS_MOTOR 200
  24.  
  25. #define CAP_PASO  ( CAPACIDAD_MAX / (PASOS_MOTOR * (VUELTAS_MAX + 1) ) )
  26.  
  27. // to motor port #2 (M3 and M4)
  28. AF_Stepper motor(200, 1);// M1 200 pasos
  29.  
  30. bool sentido=false;//Sentido de giro
  31. int pasos=1;//Pasos que realiza el PAP
  32. int vueltas=0;//Cuenta vueltas
  33. float capacidad=0.0 ;//Capacidad condensador
  34.  
  35. void setup() {
  36.   Serial.begin(9600);
  37.  
  38.   pinMode(A5, INPUT);  //A5 como entrada
  39.   pinMode(A5, INPUT_PULLUP);
  40.  
  41.   Serial.println("Icaro TEST PAP!");
  42.  
  43.   motor.setSpeed(30);  // Velocidad RPM  
  44.  
  45.   //clearMemory () ;//Clear EEPROM y HOMING  UTILIZAR PARA RESETEAR MEMORIA Y POSICION
  46.  
  47.   recuperaMemoria();//Lee datos de la memoria si existen ?
  48.   Serial.println ("Intento recuperar datos de EEPROM");
  49.   informacionSerie(vueltas, sentido , capacidad);//imprime datos EEPROM , luego mira si son correctos
  50.     delay(1000);
  51.  
  52.   if ( vueltas < 0 ||(vueltas > VUELTAS_MAX) || capacidad > CAPACIDAD_MAX || capacidad <0 ){ //Analiza si los datos recuperados son correctos
  53.     vueltas=0;
  54.     sentido=false;
  55.     capacidad=0.0;
  56.     Serial.println ("No hay datos en memoria , busqueda HOME");
  57.     delay (1000);
  58.     HOME();
  59.  
  60.   }
  61. }
  62.  
  63. void HOME (){ //Efectua HOME busca final de carrera a 0
  64.       while (digitalRead(A5)!=0){
  65.         Serial.println ("HOMING");
  66.         motores (&motor,pasos,sentido);
  67.         } //Home Busca el sensor a 0
  68. }
  69.  
  70. //Funcion giro de motor PAP , argumento pasos y el sentido de giro
  71. void motores (AF_Stepper *motor,int pasos,bool sentido){
  72.     if (sentido ==true){
  73.       (*motor).step(pasos, FORWARD, SINGLE); //Giro derecha
  74.       capacidad = CAP_PASO + capacidad;
  75.   }else{
  76.      (*motor).step(pasos, BACKWARD, SINGLE); //Giro Izquierda
  77.      capacidad =  capacidad -CAP_PASO;
  78.   }
  79.  
  80. }
  81.  
  82. //Print informacion DEBUG vuelta actual , sentido , capacidad ...
  83. void informacionSerie(int vueltas, bool sentido ,  float capacidad){
  84.  
  85.  Serial.print("Vuelta = ");//Debug
  86.  Serial.print (vueltas);//Debug
  87.  
  88.  Serial.print(" , sentido = ");//Debug
  89.  Serial.print (sentido);//Debug
  90.  
  91.  Serial.print(" , capacidad = ");//Debug
  92.  Serial.print(capacidad,2);//Debug
  93.  Serial.println(" uF");//Debug
  94. }
  95.  
  96. void clearMemory(){//Limpia la Memoria EEPROM y efectua HOME
  97.   for (int i = 0 ; i < EEPROM.length() ; i++) {
  98.     EEPROM.write(i, 0);
  99.   }
  100.   HOME() ;//Efectua HOME tras limpiar datos de memoria
  101. }
  102.  
  103. //Guarda en EEPROM los datos de las vueltas el sentido y la capacidad
  104. void guardarEnMemoria( int vueltas, bool sentido , float capacidad){
  105.   EEPROM.put( vuelta_mem, vueltas );  //Grabamos el valor
  106.   EEPROM.put( sentido_mem, sentido );  //Grabamos el valor
  107.   EEPROM.put( capacidad_mem, capacidad );  //Grabamos el valor
  108. }
  109.  
  110. //Lee datos de la memoria EEPROM
  111. void recuperaMemoria( ){
  112.   EEPROM.get( vuelta_mem, vueltas );  //Grabamos el valor
  113.   EEPROM.get( sentido_mem, sentido );  //Grabamos el valor
  114.   EEPROM.get( capacidad_mem, capacidad );  //Grabamos el valor
  115. }
  116.  
  117. void loop() {//Main LOOP
  118.  
  119.   if (digitalRead(A5)==0  ){ //Sensor una vuelta completa
  120.    
  121.     if ( sentido && vueltas < ( VUELTAS_MAX +1 ) ){vueltas++;} //Depende del sentido cuenta o descuenta vueltas
  122.     else {vueltas--;}
  123.    
  124.     while (digitalRead(A5)==0){motores (&motor,pasos,sentido);};//Tiene que salir de la posicion 0 del sensor
  125.    
  126.     }
  127.  
  128.  informacionSerie(vueltas, sentido , capacidad); //Informacion serie RS232 ...
  129.  
  130.   //Ha llegado al limite de vueltas debe de cambiar de sentido y la forma de contar
  131.   if ( vueltas>VUELTAS_MAX && sentido  ){ sentido = !sentido;} //Cambio de sentido en el limite
  132.   if ( vueltas<=0  && ! sentido  ){ sentido = !sentido;capacidad=0.0;} //Cambio de sentido en el limite
  133.  
  134.   motores (&motor,pasos,sentido); //PAP
  135.  
  136.   guardarEnMemoria(vueltas, sentido , capacidad);//Guarda en memoria EEPROM los datos actuales
  137.    
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement