RC kontroll och Arduino: A färdiga arbeten (6 / 10 steg)
Steg 6: Andra Program: Servo utgång
Nu börjar roligt! Med hjälp av programmet som jag beskrivit tidigare, kan lägga vissa servo ut med servo standardbiblioteket. Jag har också beslutat att använda en matris för indata i stället för åtta separata variabler. Om du har en Uno, som jag kommer att använda senare, all du har till gör är ändra pin plats variabler.
Detta kommer att skissa vilja läsa alla 8 kanaler av en RC mottagare och indatavärden via seriell monitor.
Programmerat för Arduino MEGA 2560
Medföljande bibliotek
#include < Servo.h >
Definiera variabler:
CONST int chA = 22. Konstant variabler avser pin platser
CONST int Chohung bank = 27.
CONST int chC = 30.
CONST int chD = 35.
CONST int chE = 38.
CONST int chF = 43;
CONST int chG = 46.
CONST int chH = 51.
Signal att villkora begränsar
CONST int lo = 920;
CONST int Hej = 1640;
CONST int deadlo = 1270;
CONST int deadhi = 1290;
CONST int center = 1280;
int ch [8]. Matrisen att lagra och visa värdena för varje kanal
int ch4; Servo produktionen variabeln
Servo steer; Styrning Servo
Rutinen installationsprogrammet körs en gång när du trycker på reset:
void setup()
{
initiera seriell kommunikation på 9600 bitar per sekund:
Serial.BEGIN(9600);
Ingående stift:
pinMode(chA,INPUT);
pinMode(chB,INPUT);
pinMode(chC,INPUT);
pinMode(chD,INPUT);
pinMode(chE,INPUT);
pinMode(chF,INPUT);
pinMode(chG,INPUT);
pinMode(chH,INPUT);
Servo utgångar:
Steer.attach(2); Bifoga styrning Servo till PWM stift 2
}
Huvudprogrammet
void loop()
{
Läs de ingående kanalerna
CH [0] = pulseIn (chA, hög); Läsa och lagra kanal 1
CH [1] = pulseIn (Chohung bank, hög);
CH [2] = pulseIn (chC, hög);
CH [3] = pulseIn (chD, hög);
CH [4] = pulseIn (chE, hög);
CH [5] = pulseIn (chF, hög);
CH [6] = pulseIn (chG, hög);
CH [7] = pulseIn (chH, hög);
Input Signal konditionering
för (int jag = 0; jag < = 8; i ++) //Signal konditionering loop
{
om (ch [i] < = lo) //Trim buller från nedre änden
{
CH [i] = lo;
}
om (ch [i] < = deadhi & & ch [i] > = deadlo) //Create döda-Band
{
CH [i] = center;
}
om (ch [i] > = Hej) //Trim buller från övre änden
{
CH [i] = Hej;
}
}
Utgång för styrservo kontroll på Channel 4
CH4 = ch [3].
om (ch4 > = lo & & ch4 < = deadlo)
{
CH4 = karta (ch4, lo, deadlo, 0, 90);
}
annars om (ch4 == center)
{
CH4 = 90.
}
annars om (ch4 > = deadhi & & ch4 < = Hej)
{
CH4 = karta (ch4, deadhi, Hej, 90, 180);
}
Steer.write(CH4);
Seriella utgångar
Serial.Print ("Ch1:"); Visar text snöre på Serial bildskärm skilja variabler
Serial.Print (ch[0]); Skriva ut värdet av kanal 1
Serial.Print ("|");
Serial.Print ("Ch2:");
Serial.Print (ch[1]);
Serial.Print ("|");
Serial.Print ("Ch3:");
Serial.Print (ch[2]);
Serial.Print ("|");
Serial.Print ("Ch4:");
Serial.Print (ch[3]);
Serial.Print ("|");
Serial.Print ("Ch5:");
Serial.Print (ch[4]);
Serial.Print ("|");
Serial.Print ("Ch6:");
Serial.Print (ch[5]);
Serial.Print (& q. uot; | ");
Serial.Print ("Ch7:");
Serial.Print (ch[6]);
Serial.Print ("|");
Serial.Print ("Ch8:");
Serial.println (ch[7]);
Serial.Print ("utgång för styrservo:");
Serial.println (ch4);
}
Jag ska anta att servo hade ett nervöst sammanbrott och utvecklat en liten fästing? Terminalfönstret bekräftar att hjulen helt enkelt föll OFF av projektet, nu vad? Innan du begår din servo eller Arduino mutter kammaren är det något som kan bearbetas runt. Problemet är hur Arduino servo biblioteket genererar krävs utsignalen. Den avbryter huvudprogrammet att behålla 50Hz pulsen och kommer i konflikt med funktionen pulsein korrumperande valuesbeing läsa. Både de servo bibliotek och pulsein är avbrott baserat men som man ser vi till att ersätta? Jag valde att eliminera servo biblioteket efter en massa google-fu.