Stap 2: programmeren
Het idee achter het programma is neem een lezing van de potentiometer (of andere analoge sensoren), neem een lezing van het standpunt van actuatoren en vergelijk ze. Als ze verschillend zijn, uit te breiden/intrekken de bedieningssleutel zodat deze overeenkomen met hen. We zullen de functie map() gebruiken om te vereenvoudigen van de vergelijking.
De map() functie heeft een bereik van waarden, en zet deze om in een ander bereik.
Bijvoorbeeld: Zeggen dat uw sensor geeft een input van 0-1023. Maar uw actuator geeft feedback van 400-600. U zou de functie map() van de potentiometer feedback, het bereik van 0-1023 dalen tot 400-600. Hierdoor heeft een gemakkelijkere vergelijking met uw sensor. De andere optie is om het bereik van de bedieningssleutel, van 400-600 tot 0-1023 stimuleren. De functie zou uitzien: kaart (variabele, 400,600,0,1023);
Als u een signaal neerzet, verliest u precisie. Als de sensor waarden van 0-1000 geeft, en je zet het neer op 400-600, wijzigt u uit een 1000 punt naar een bereik van 200 punten. Dat zal de precisie slechter maken met een factor 5. De sensor moet wijzigen 5 keer, 200, 201, 202, 203, 204, 205 voordat het verandert van 440 441. Hebt u een nauwkeurige applicatie, dit kan een probleem, maar voor de meeste gevallen, het moet goed zijn.
Hier is de code met commentaren verklaren van elk onderdeel, de code is ook aangesloten:
/* Sample code to control the position of an actuator with potentiometer feedback using a MegaMoto. The main loop of this program checks the potentiometer, and moves the actuator accordingly. Written by Progressive Automations This example code is in the public domain. */ const int feedback = A0; //potentiometer from actuator const int pot = A1; //pot from throttle const int enable = 8; const int PWMA = 11; const int PWMB = 3; int actMax = 760; int actMin = 250;//positions of actuator int potMin = 0; int potMax = 1023; int precision = 2;//how close to final value to get int checkingInterval = 50;//how often position is checked (milliseconds) int rawcurrentPosition = 0; int currentPosition = 0; int rawdestination = 0; int destination = 0; int difference = 0;//values for knowing location void setup() { pinMode(feedback, INPUT);//feedback from actuator pinMode(pot, INPUT);//feedback from potentiometer pinMode(enable, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(PWMB, OUTPUT);//three pins for MegaMoto digitalWrite(enable,HIGH); Serial.begin(9600); } void loop() { destination = getDestination(); currentPosition = analogRead(feedback);//check where you are Serial.print("Position "); Serial.println(analogRead(feedback)); difference = destination - currentPosition;//find out how far you are from the destination if (currentPosition > destination) pullActuatorUntilStop(destination);// choose what action to take else if (currentPosition < destination) pushActuatorUntilStop(destination); else if (difference < precision && difference > -precision) stopActuator(); }//end void loop int getDestination() { rawdestination = analogRead(pot);//read the potentiometer to get the destination destination = map(rawdestination, potMin,potMax,actMin,actMax);//convert the potentiometer feedback to match the actuator return(destination); }//end getDestination void pushActuatorUntilStop(int destination) { destination = getDestination(); int temp = analogRead(feedback); difference = destination - temp;//check difference to see if continue moving, or stop while (difference > precision || difference < -precision) { destination = getDestination(); temp = analogRead(feedback); //continue checking difference difference = destination - temp; pushActuator(); }//end while delay(25); stopActuator(); }//end pushActuatorUntilStop void pullActuatorUntilStop(int destination) { destination = getDestination(); int temp = analogRead(feedback); //check difference to see if continue moving, or stop difference = destination - temp; while (difference > precision || difference < -precision) { destination = getDestination(); temp = analogRead(feedback); //continue checking difference difference = destination - temp; pullActuator(); }//end while delay(25); stopActuator(); }//end pullActuatorUntilStop void stopActuator() { analogWrite(PWMA,0); analogWrite(PWMB,0); }//end stopActuator void pushActuator() { analogWrite(PWMB,255); analogWrite(PWMA,0); }//end pushActuator void pullActuator() { analogWrite(PWMB,0); analogWrite(PWMA,255); }//end pullActuator