RC kontroll och Arduino: A färdiga arbeten (9 / 10 steg)
Steg 9: Tank styrning W/kontinuerlig Rotation servon
Se till att tacka min underbara modell Sid (ovan bild) för att vara en bra sport medan jag har varit med honom för att förfina min program.
/ * Här kommer skiss kommer läsa alla 8 kanaler av en RC mottagare och indatavärden via seriell
övervaka. Programmerat för Arduino Uno och Adafuit Servo Driver Board(pins A5-SCL and A4-SDA).
Min sändare ligger också i läge 3 så höger styrspak är följande:
Vertikal axel = kanal 3
Horixontal axel = Channel 4
===========================================================================================*/
Medföljande bibliotek
#include
#include
Aktivera debug-läge att mata in data via seriell
/ * 0 = av, 1 = Teknisk Data på, 2 = Raw Data på, 3 = Servo värde utgång,
4 = rå Eng & Servo Data Output, 5 = Tank steer dataöverföring, * /
CONST int debug = 0;
Matriser för kanal pin platser och kanaldata
CONST int kanaler = 8.
CONST int chPin [] = {2,3,4,5,6,7,8,9}. PIN platser
int chEng [8]. Lagra masseras data
int chSer [8]. Servo värde lagring
RX signal massera värden
CONST int RXLo = 920;
CONST int RXHi = 1640;
CONST int RXDeadLo = 1265;
CONST int RXDeadHi = 1295;
CONST int RXMid = 1280;
Servo spänner
CONST int serLo = 130;
CONST int serMid = 330;
CONST int serHi = 530;
CONST int tankLo = 250;
CONST int tankHi = 410;
Servo utgång
Adafruit_PWMServoDriver servo=Adafruit_PWMServoDriver(0x40);
CONST int freq = 50;
CONST int serNum = 8;
int ch3; Tank steer variabel
int ch4; Tank Steer variabel
Ställa in pin platser, börja seriell, eller börja I2C
void setup() {
om (debug > 0) {
Serial.BEGIN(115200); Vi kommer Pläd!
}
Ingående stift:
för (int jag = 0; jag pinMode(chPin[i],INPUT);
}
servo.BEGIN();
servo.setPWMFreq(freq);
} //End av installationen
Huvudprogrammet
void loop() {
Flytta värden från chy till chz, chx till chy, och läsa nya värden
för (int jag = 0; jag chEng[i]=pulseIn(chPin[i],HIGH);
Signal massera
chEng [i] = begränsa (chEng [i], RXLo, RXHi); Trim nedre och övre
om (chEng [i] < = RXDeadHi & & chEng [i] > = RXDeadLo) {//Create döda-Band
chEng [i] = RXMid;
}
Karta Eng värden till servo utgång
om (chEng [i] > = RXLo & & chEng [i] < = RXDeadLo) {//Map lägre intervall av värden
chSer [i] = karta (chEng [i], RXLo, RXDeadLo, serLo, serMid);
}
annars om (chEng [i] == RXMid) {//Map mittersta värdet
chSer [i] = serMid;
}
annars om (chEng [i] > = RXDeadHi & & chEng [i] < = RXHi) {//Map högre intervall av värden
chSer [i] = karta (chEng [i], RXDeadHi, RXHi, serMid, serHi);
}
} //End av For-Loop
Tanken styr med höger styrspak, produktionen till två kontinuerlig rotation servon
/ * Använd kartesiska kvadrant och något värde till rätt motorn återförs till
säkerställa korrekt drift * /
Första kvadranten.
/ * Flip utbud på rätt servo med avseende på lodräta axeln position. Detta kommer att hålla den
lämnade servo set vertikal position och minska rätt servon hastighet.* /
om (chSer [2] > = serMid & & chSer [3] > = serMid) {
CH3 = chSer [2].
CH4=map(chSer[3],serMid,serHi,chSer[2],serMid);
}
Andra kvadrant
/ * Flip utbud på vänster servo med avseende på vertikal Axelposition. Här är inte som
sundet framåt som kvadrant 1 men följande exempelkod jag använde innan bör
ser lika ut.
CH3=map(chSer[3],serLo,serMid,serMid,serHi);
servo.setPWM(2,0,map(ch3,serHi,serMid,chSer[2],serMid));
Hur jag kom med följande är genom förenkling och spara resources.* /
annars om (chSer [2] > serMid & & chSer [3] ch3=map(chSer[3],serLo,serMid,serMid,chSer[2]);
CH4 = chSer [2].
}
Tredje kvadranten
/ * Flip spänna på rätt servo med avseende på vertikal Axelposition. Vänstra servo
kommer att fortsätta resa bakåt medan rätt servo är slowed.* /
annars om (chSer [2] < = serMid & & chSer [3] < = serMid) {
CH3 = chSer [2].
CH4=map(chSer[3],serMid,serLo,chSer[2],serMid);
}
Fjärde kvadranten
/ * Flip spänna på vänster servo med avseende på vertivle Axelposition, rätt servo
kommer har reser bakåt medan vänster servo är slowed.* /
annat if(chSer[2]serMid) {
CH4 = chSer [2].
CH3=map(chSer[3],serMid,serLo,chSer[2],serMid);
}
/ * Aktiverar CCW Rotation genom att vända rätt servo och vidarebefordran vänster servo med
den horisontella axis.* /
om (chSer [2] == serMid & & chSer [3] > = serMid) {
CH3 = chSer [3].
CH4=map(chSer[3],serMid,serHi,serMid,serLo);
}
/ * Aktiverar CW Rotation av vidarebefordring rätt servo och vända vänster servo med
den horisontella axis.* /
om (chSer [2] == serMid & & chSer [3] < = serMid) {
CH3 = chSer [3].
CH4=map(chSer[3],serMid,serLo,serMid,serHi);
}
Mappa om variabler för att ge bättre känslighet och fullt utbud är inte behövs för att uppnå full fart.
CH3=map(CH3,serLo,serHi,tankLo,tankHi);
CH4=map(CH4,serLo,serHi,tankLo,tankHi);
Bläddra höger servo signalen, channel 4 signal.
om (ch4 > = serMid) {
CH4=map(CH4,serMid,serHi,serMid,serLo);
}
annars om (ch4 ch4=map(ch4,serMid,serLo,serMid,serHi);
}
Utgång till servo drivrutin
servo.setPWM(2,0,ch3);
servo.setPWM(3,0,ch4);
Debug utmatning
om (debug == 1 || debug == 4) //Engineering Data
{
Serial.Print ("EngData| CH1: ");
Serial.Print (chEng[0]);
Serial.Print ("| CH2: ");
Serial.Print (chEng[1]);
Serial.Print ("| CH3: ");
Serial.Print (chEng[2]);
Serial.Print ("| Ch4: ");
Serial.Print (chEng[3]);
Serial.Print ("| Ch5: ");
Serial.Print (chEng[4]);
Serial.Print ("| Ch6: ");
Serial.Print (chEng[5]);
Serial.Print ("| Ch7: ");
Serial.Print (chEng[6]);
Serial.Print ("| Ch8: ");
Serial.Print (chEng[7]);
Serial.println ("|");
}
om (debug == 3 || debug == 4)
{
Serial.Print ("SerData| CH1: ");
Serial.Print (chSer[0]);
Serial.Print ("| CH2: ");
Serial.Print (chSer[1]);
Serial.Print ("| CH3: ");
Serial.Print (chSer[2]);
Serial.Print ("| Ch4: ");
Serial.Print (chSer[3]);
Serial.Print ("| Ch5: ");
Serial.Print (chSer[4]);
Serial.Print ("| Ch6: ");
Serial.Print (chSer[5]);
Serial.Print ("| Ch7: ");
Serial.Print (chSer[6]);
Serial.Print ("| Ch8: ");
Serial.Print (chSer[7]);
Serial.println ("|");
}
om (debug == 5) {
Serial.Print(CH3);
Serial.Print("|");
Serial.println(CH4);
}
} //End av huvudprogrammet
Jag vet hur jag gjorde tanken styrning är långt ifrån optimal men det är hur jag räknat ut. Den fjärde kvadranten fungerar inte och jag har ännu att få arbeta. Det var inte så stor av ett problem eftersom detta är ett bevis på konceptet robot i arbetar med RC kontroll och Arduino innan jag går fullt skalutslag.
Låt mig veta om du har några frågor och jag kommer att göra mitt bästa för att svara på och uppdateras också. Vänligen inkludera steget och några detalj förklara ditt problem för att hjälpa mig komma på samma sida med dig.