Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Control Condensador variable
- * Antonio Villanueva Segura
- *
- * MOTOR NEMA 17 17HS08-1004S 1.8° 1A 3V5..5v pasos= 360°/1.8(1 paso) = 200 PASOS
- * instalar libreria AF_Motor
- * https://cdn-learn.adafruit.com/downloads/pdf/afmotor-library-reference.pdf
- *
- */
- #include <AFMotor.h>
- #include <EEPROM.h> //Uso de memoria EEPROM
- #define Angulo_MAX 220
- #define PASOS 200
- #define RPM 22
- #define MOTEUR 1 //PUERTO 1 M1
- #define TIPO INTERLEAVE //SINGLE DOUBLE INTERLEAVE MICROSTEP
- // Define el puerto del MOTOR M1 o M2 y sus pasos
- AF_Stepper motor(200, MOTEUR);// (M2 M1) M1=1 (M3 M4) M2=2 360/1.8°= 200 pasos
- bool sentido =true;
- /**************************************************************************************************************/
- void setup() {
- Serial.begin(9600);
- Serial.println("\n A.Villanueva Ctrl. Condensador \n");
- motor.setSpeed(RPM); // 10 rpm
- Serial.print("SELECCIONADO MOTOR N° :");
- Serial.println (MOTEUR);
- Serial.print("VELOCIDAD RPM :");
- Serial.println (RPM);
- delay (2000);
- }
- /*********************BUCLE PRINCIPAL *************************************************************************/
- void loop() { //Bucle principal
- float nuevoAngulo=-1; //Seleccion
- int pasos(0);
- //testMovCondensador( sentido );// sentido = !sentido; //Rutina para efectuar test repetitivo 0 a 180°
- nuevoAngulo = menu();//Muestra menu y lee la nuevo Angulo
- Serial.print ("Lectura menu = ");//Menu RS232
- pasos=AnguloPasos(nuevoAngulo) ;//Convertir angulo a pasos sabiendo que cada paso es 1.8 o 0.9 si es micro
- Serial.print ("Pasos :");Serial.println(pasos);//Muestra los pasos calculados
- //Serial.print ("Angulo Real : ");Serial.println( (pasos) *1.8);
- Serial.print ("Angulo Real : ");Serial.println( (pasos *1.8) / ((TIPO==INTERLEAVE)?2.0:1.0));
- motores(&motor,pasos,nuevoAngulo<0 ? false:true); //Activa el motor , analiza el sentido segun sea + o - el angulo
- delay(1000);//1 segundo retardo
- }
- /**************************************************************************************************************/
- //Test movimiento de 0 a 180°(100 pasos ) del motor PAP EM-258
- void testMovCondensador(bool sentido ){//Mueve 0 a 180° el condensador
- int pasos=AnguloPasos(360);//Test 360°
- motores (&motor, pasos, sentido); //Envia los pasos al motor
- }
- /**************************************************************************************************************/
- //Traduce el Angulo a una secuencia de pasos
- int AnguloPasos(float angulo_new){
- int mult(1);
- if (TIPO==INTERLEAVE){mult=2;}
- 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;
- }
- /**************************************************************************************************************/
- //Menu lectura Serie, devuelve un int valor de Angulo
- float menu(){
- String lectura="";
- Serial.println ("\n --- Menu --- ");
- Serial.println (" a 45 grados");
- Serial.println (" z 90 grados ");
- Serial.println (" e 180 grados ");
- Serial.println (" r 360 grados ");
- Serial.print (" .. o Introduzca Angulo ");
- while (lectura== "" ){lectura=leeCadena();}//Espera una lectura no nula del serie
- return opciones (lectura);
- }
- /**************************************************************************************************************/
- float opciones(String lectura){
- //OpcionesSerial.print
- if ( lectura[0]== 'a' || lectura[0]== 'A' ){ lectura = 45 ;}//AVANZA 45 grados
- if ( lectura[0]== 'z' || lectura[0]== 'Z' ){ lectura = 90;}//AVANZA 90 grados
- if ( lectura[0]== 'e' || lectura[0]== 'E' ){ lectura = 180;}//AVANZA 180 grados
- if ( lectura[0]== 'r' || lectura[0]== 'R' ){ lectura = 360;}//AVANZA 360 grados
- return lectura.toFloat();
- }
- /**************************************************************************************************************/
- //Funcion giro de motor PAP , argumento pasos y el sentido de giro
- /*
- *"SINGLE" significa activación de una sola bobina,
- *"DOUBLE" significa que se activan 2 bobinas a la vez (para un par mayor)
- * "INTERLEAVE" significa que alterna entre SINGLE y DOUBLE para obtener el doble de resolución
- * (pero, por supuesto a la mitad de la velocidad). .
- * "MICROSTEP" las bobinas se modulan por PWM para crear un movimiento suave entre pasos.
- */
- void motores (AF_Stepper *motor,int pasos,bool sentido){
- if (sentido ==true){
- Serial.println ("Giro FORWARD ");
- (*motor).step(pasos, FORWARD, TIPO); //Giro derecha SINGLE DOUBLE INTERLEAVE MICROSTEP
- }else{
- Serial.println ("Giro BACKWARD ");
- (*motor).step(pasos, BACKWARD, TIPO); //Giro Izquierda
- }
- (*motor).release();//Para evitar calentamiento desconectamos tras cada operacion
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement