Kontrollera placeringen av ett ställdon med en Analog Sensor (2 / 3 steg)
Steg 2: programmering
Tanken med programmet är att ta en läsning av potentiometern (eller andra analog sensor), ta en läsning av manöverdon position och jämföra dem. Om de är olika, utöka/dra tillbaka manöverdonet för att matcha dem. Vi kommer att använda funktionen map(), för att förenkla jämförelsen.
Funktionen map() tar ett värdeintervall, och omvandlar dem till olika områden.
Till exempel: Säga ger din sensor insatsen av 0-1023. Men din manöverdonet ger feedback från 400-600. Du vill använda funktionen map() på potentiometer feedback, för att släppa intervallet från 0-1023 till 400-600. Detta gör det möjligt att ha en enklare jämförelse till sensorn. Det andra alternativet är att öka utbudet av manöverdonet, från 400-600 upp till 0-1023. Funktionen skulle se ut: karta (variabel, 400,600,0,1023);
Om du tappar en signal, förlorar du precision. Om sensorn ger värden från 0-1000, och du släppa den till 400-600, ändrar du från en 1000 punkt utbud till ett 200 poäng. Som kommer att förvärra precision med en faktor 5. Sensorn kommer att behöva ändra 5 gånger, från 200, 201, 202, 203, 204, 205 innan det ändras från 440 till 441. Om du har ett exakt program, detta kan orsaka problem, men i de flesta fall bör det vara OK.
Här är koden med kommentarer förklara varje del, koden är också fäst:
/ * Exempelkod att styra placeringen av ett ställdon med potentiometer respons med hjälp av en MegaMoto.
Huvudloop för detta program kontrollerar potentiometern och flyttar manöverdonet därmed.
Skrivet av progressiva automatiseringar
Denna exempelkod är offentlig.
*/
CONST int feedback = A0; potentiometer från manöverdonet
CONST int pot = A1; potten från spjäll
CONST int aktiverar = 8.
CONST int PWMA = 11;
CONST int PWMB = 3;
int actMax = 760;
int actMin = 250; //positions av ställdon
int potMin = 0;
int potMax = 1023;
int precision = 2; //how nära att få det slutliga värdet
int checkingInterval = 50, //how ofta ståndpunkt är markerade (millisekunder)
int rawcurrentPosition = 0;
int aktuellaposition = 0;
int rawdestination = 0;
int destination = 0;
int skillnaden = 0; //values för att veta läge
void setup()
{
pinMode (feedback, INPUT); //feedback från manöverdonet
pinMode (potten, indata); //feedback från potentiometer
pinMode (aktiverar, OUTPUT);
pinMode (PWMA, OUTPUT);
pinMode (PWMB, OUTPUT); //three stift för MegaMoto
digitalWrite(enable,HIGH);
Serial.BEGIN(9600);
}
void loop()
{
destination = getDestination();
aktuellaposition = analogRead (feedback); //check där du är
Serial.Print ("Position");
Serial.println(analogRead(feedback));
skillnaden = destination - aktuellaposition; //find ut hur långt du är från destinationen
om (aktuellaposition > destination) pullActuatorUntilStop(destination); / / välja vilken åtgärd som ska vidtas
annars om (aktuellaposition < destination) pushActuatorUntilStop(destination);
annars om (skillnaden < precision & & skillnaden >-precision) stopActuator();
} //end ogiltig loop
int getDestination()
{
rawdestination = analogRead (kruka); //read potentiometern att få destinationen
destination = karta (rawdestination, potMin, potMax, actMin, actMax); //convert potentiometer feedback att matcha manöverdonet
Return(destination);
} //end getDestination
void pushActuatorUntilStop(int destination)
{
destination = getDestination();
int temp = analogRead(feedback);
skillnaden = destination - temp, //check skillnad att se om Fortsätt att flytta, eller stoppa
medan (skillnaden > precision || skillnaden <-precision)
{
destination = getDestination();
Temp = analogRead(feedback); fortsätta kolla skillnaden
skillnaden = destination - temp;
pushActuator();
} //end medan
Delay(25);
stopActuator();
} //end pushActuatorUntilStop
void pullActuatorUntilStop(int destination)
{
destination = getDestination();
int temp = analogRead(feedback); Kolla skillnaden att se om Fortsätt att flytta, eller stoppa
skillnaden = destination - temp;
medan (skillnaden > precision || skillnaden <-precision)
{
destination = getDestination();
Temp = analogRead(feedback); fortsätta kolla skillnaden
skillnaden = destination - temp;
pullActuator();
} //end medan
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