Étape 5: autoguidage
Même lorsque nous faisons de notre mieux pour compter chaque impulsion il y a peut-être des reprises que nous pouvons manquer un peu et lentement perdre de la précision au fil du temps. Pour cela que nous pouvons utiliser une routine de radioralliement minimiser ! L’idée est d’envoyer l’actionneur à un prédéterminé position (complètement étendus ou complètement rétractée) et positionner les chefs d’accusation à une valeur connue. Habituellement, c’est plus facile à complètement rétracter l’actionneur et les comtes la valeur 0. Dans le code ci-dessous, qu'il se remettra au maximum compte valeur lorsqu’il est entièrement étendu et réinitialisé à 0 lorsque complètement rétracté.
Du pour faire, vous avez besoin d’un moyen de dire quand le moteur est à ses limites. Ici nous allons utiliser la télédétection actuels de la MegaMoto à regarder quand le courant passe à 0. Quand cela arrive, nous pouvons voir que l’actionneur a Appuyez sur le commutateur de limite et cessé de déplacement. Nous avons un petit compteur en cours d’exécution parce que parfois, le courant peut signaler un faux 0. En faisant en sorte que le courant est de 0 pour un laps de temps, nous savons que le moteur a atteint une limite vraiment et qu’il n’obtient pas des lectures erronées.
Voir code ci-joint et commentaires pour plus d’informations :
#define amp0 A5 #define PWMA0 6 #define PWMB0 5 #define enable0 13 //pins for first MegaMoto #define switch0 7 //Up button to add counts #define switch1 8 //Down button to subtract counts #define hall0 2 //interrupt pins for hall effect sensors int enable = 0; //enable pin for megaMoto int lowampLimit = 0;//Low limit to detect when actuator stops int amps = 0; //current readings int timedelay[] = {750, 50}; //first, regular delay for feedback int hitLimits = 0; int hitLimitsmax = 10;//value for knowing when retracted int count[] = {0};//Actuator int maxCounts = 1150;//number of counts when fully extended int sw[] = {1, 1}; //switch up, switch down int prev[] = {0, 0};//previous switch state int currentPos = 0;//current position int threshold = 1; int destination = 0; bool forwards = false; bool backwards = false;// motor states bool extended = false; bool retracted = false;//actuator positions bool firstRun = true;//first run of the motor once the button is pushed void setup() { pinMode(amp0, INPUT); digitalWrite(amp0, LOW);//set Current sensors pinMode(PWMA0, OUTPUT); pinMode(PWMB0, OUTPUT);//set PWM outputs pinMode(enable0, OUTPUT); digitalWrite(enable0, LOW);//set enable and turn board OFF pinMode(switch0, INPUT); pinMode(switch1, INPUT); digitalWrite(switch0, HIGH); digitalWrite(switch1, HIGH);//set up/down switch, enable enternal relays pinMode(hall0, INPUT); digitalWrite(hall0, LOW);//set hall, set low to start for rising edge attachInterrupt(0, speed0, RISING); //enable the hall effect interupts retracted = true;//start retracted extended = false; Serial.begin(9600); }//end setup void loop() { ReadInputs();//check input button, calculate speeds if (sw[0] == 0 && sw[1] == 1 && backwards == false) destination = currentPos - 115;//dont change destination while moving else if (sw[0] == 1 && sw[1] == 0 && forwards == false) destination = currentPos + 115;//dont change destination while moving Serial.print("count[0] "); Serial.println(count[0]); Serial.print("currentPos "); Serial.println(currentPos); Serial.print("destination "); Serial.println(destination); if ((destination >= (currentPos - threshold)) && (destination <= (currentPos + threshold))) stopMoving();//stop if you're close enough else if (destination > currentPos) goForwards();//move if you need to else if (destination < currentPos) goBackwards();//move if you need to for (int i = 0; i <= 1; i++) prev[i] = sw[i]; //store switch values as previous values }//end loop void speed0() { if (forwards == true) count[0]++; //if moving forwards, add counts else if (backwards == true) count[0]--; //if moving back, subtract counts }//end speed0 void ReadInputs() { amps = analogRead(amp0);//read current sw[0] = digitalRead(switch0), sw[1] = digitalRead(switch1);//check switches currentPos = count[0];//set where you are }//end read inputs void goForwards() { forwards = true; backwards = false;//set travel direction getFeedback();//check current draw digitalWrite(enable0, HIGH);//enable board analogWrite(PWMA0, 255); analogWrite(PWMB0, 0);//apply speeds }//end goForwards void goBackwards() { forwards = false; backwards = true;//set travel direction getFeedback();//check current draw digitalWrite(enable0, HIGH);//enable board analogWrite(PWMA0, 0); analogWrite(PWMB0, 255);//apply speeds }//end goBackwards void stopMoving() { forwards = false; backwards = false;//set travel direction analogWrite(PWMA0, 0); analogWrite(PWMB0, 0);//set speeds to 0 delay(10); digitalWrite(enable0, LOW);//disable board }//end stopMoving void getFeedback() { amps = analogRead(amp0); Serial.print(" Amp readings - "), Serial.println(amps); if (amps <= lowampLimit && hitLimits < hitLimitsmax) hitLimits = hitLimits + 1; else hitLimits = 0; if (hitLimits == hitLimitsmax && backwards == true) { Serial.println("RETRACTED"); retracted = true; count[0] = 0; //reset counter when homed destination = 0; } if (hitLimits == hitLimitsmax && forwards == true) { Serial.println("EXTENDED"); extended = true; count[0] = maxCounts; //reset counter when extended destination = maxCounts; } }//end getFeedback