Stap 9: Tank sturende W/continue rotatie Servos
Zorg ervoor dat mijn prachtige model Sid (hierboven foto) bedanken voor zo'n goede sport terwijl Ive ' geweest using hem om mijn programma te verfijnen.
/ * Dit zal schetsen wil lezen alle 8 kanalen van een RC-ontvanger en de waarden via seriële ingang
monitor. Geprogrammeerd voor de Arduino Uno en Adafuit Servo stuurprogramma Board(pins A5-SCL and A4-SDA).
Mijn zender is ook instellen in de modus 3 dus de rechter analoge stick als volgt is:
Verticle as = kanaal 3
Horixontal as = kanaal 4
===========================================================================================*/
Opgenomen bibliotheken
#include
#include
Debug-modus voor het invoeren van gegevens via seriële inschakelen
/ * 0 = uit, 1 = Engineering gegevens aan, 2 = Raw Data op, 3 = waarde van de Servo uitgang,
4 = raw Eng & Servo Data Output, 5 = Tank steer gegevens output, * /
Const int debug = 0;
Arrays voor kanaal pin locaties en gegevens kanaal
Const int kanalen = 8;
Const int chPin [] = {2,3,4,5,6,7,8,9}; PIN locaties
int chEng [8]; Gegevensopslag gemasseerd
int chSer [8]; Servo waarde opslag
RX signaal masseren van waarden
Const int RXLo = 920;
Const int RXHi = 1640;
Const int RXDeadLo = 1265;
Const int RXDeadHi = 1295;
Const int RXMid = 1280;
Servo bereiken
Const int serLo = 130;
Const int serMid = 330;
Const int serHi = 530;
Const int tankLo = 250;
Const int tankHi = 410;
Servo uitgang
Adafruit_PWMServoDriver servo=Adafruit_PWMServoDriver(0x40);
Const int freq = 50;
Const int serNum = 8;
int ch3; Tank steer variabele
int ch4; Tank Steer variabele
Pin locaties Setup, start seriële of beginnen met I2C
VOID Setup {}
Als (debug > 0) {}
Serial.begin(115200); We gaan PLAID!
}
Input Pins:
for (int i = 0; ik pinMode(chPin[i],INPUT);
}
Servo.begin();
servo.setPWMFreq(freq);
} //End van Setup
Hoofdprogramma
void loop {}
Waarden van tsjy naar chz, chx aan tsjy, en nieuwe waarden lezen
for (int i = 0; ik chEng[i]=pulseIn(chPin[i],HIGH);
Het masseren van het signaal
chEng [i] = beperken (chEng [i], RXLo, RXHi); Trim onderkant en bovenkant
Als (chEng [i] < = RXDeadHi & & chEng [i] > = RXDeadLo) {//Create Dead-Band
chEng [i] = RXMid;
}
Eng waarden toewijzen aan servo uitgang
Als (chEng [i] > = RXLo & & chEng [i] < = RXDeadLo) {//Map lagere bereik van waarden
chSer [i] = kaart (chEng [i], RXLo, RXDeadLo, serLo, serMid);
}
anders als (chEng [i] == RXMid) {//Map middelste waarde
chSer [i] = serMid;
}
anders als (chEng [i] > = RXDeadHi & & chEng [i] < = RXHi) {//Map hoger bereik van waarden
chSer [i] = kaart (chEng [i], RXDeadHi, RXHi, serMid, serHi);
}
} //End van For-lus
Tank Steer met behulp van de rechter analoge stick, outputing aan twee continu rotatie servo 's
/ * Met behulp van de Cartesische Kwadrant systeem en elke waarde gegeven aan de juiste motor omgedraaid te
zorgen voor goede werking * /
Eerste Kwadrant.
/ * Bereik op juiste servo met betrekking tot de positie van de verticale as spiegelen. Dit zorgt ervoor dat de
servo reeks links naar de verticle positie en verminderen de juiste servo's speed.* /
Als (chSer [2] > = serMid & & chSer [3] > = serMid) {}
H3 = chSer [2];
CH4=map(chSer[3],serMid,serHi,chSer[2],serMid);
}
Tweede Kwadrant
/ * Flip bereik op linker servo met betrekking tot de positie van de as van de verticle. Dit is niet als
zeestraat vooruit als kwadrant 1, maar de volgende voorbeeldcode die mij watertje using vóór moet
lijken te zijn.
CH3=map(chSer[3],serLo,serMid,serMid,serHi);
servo.setPWM(2,0,map(ch3,serHi,serMid,chSer[2],serMid));
Hoe ik kwam met het volgende is door vereenvoudiging en om op te slaan resources.* /
anders als (chSer [2] > serMid & & chSer [3] ch3=map(chSer[3],serLo,serMid,serMid,chSer[2]);
CH4 = chSer [2];
}
Derde kwadrant
/ * Het bereik op juiste servo met betrekking tot de positie van de as van de verticle flip. De linker servo
zal blijven reizen naar achteren terwijl de juiste servo slowed.* is /
anders als (chSer [2] < = serMid & & chSer [3] < = serMid) {}
H3 = chSer [2];
CH4=map(chSer[3],serMid,serLo,chSer[2],serMid);
}
Vierde kwadrant
/ * Flip het bereik op linker servo met betrekking tot de positie van de as van de vertivle, de juiste servo
zal doorgaan reizen naar achteren, terwijl de linker servo slowed.* is /
anders if(chSer[2]serMid) {}
CH4 = chSer [2];
CH3=map(chSer[3],serMid,serLo,chSer[2],serMid);
}
/ * CCW rotatie inschakelen door het omkeren van de juiste servo en doorsturen links servo met betrekking tot
de horizontale axis.* /
Als (chSer [2] == serMid & & chSer [3] > = serMid) {}
H3 = chSer [3];
CH4=map(chSer[3],serMid,serHi,serMid,serLo);
}
/ * Inschakelen van CW rotatie van de juiste servo doorsturen en achteruitrijlicht links servo met betrekking tot
de horizontale axis.* /
Als (chSer [2] == serMid & & chSer [3] < = serMid) {}
H3 = chSer [3];
CH4=map(chSer[3],serMid,serLo,serMid,serHi);
}
Remap variabelen om betere gevoeligheid en de volledige reeks is niet nodig om op volle snelheid.
CH3=map(CH3,serLo,serHi,tankLo,tankHi);
CH4=map(CH4,serLo,serHi,tankLo,tankHi);
Het wegknippen van rechterkant servo signaal, channel 4 signaal.
Als (ch4 > = serMid) {}
CH4=map(CH4,serMid,serHi,serMid,serLo);
}
anders als (ch4 ch4=map(ch4,serMid,serLo,serMid,serHi);
}
Uitvoer naar servo-stuurprogramma
servo.setPWM(2,0,ch3);
servo.setPWM(3,0,ch4);
Debug Output
Als (debug == 1 || debug == 4) //Engineering gegevens
{
Serial.Print ("EngData| Ch1: ");
Serial.Print (chEng[0]);
Serial.Print ("| CH2: ");
Serial.Print (chEng[1]);
Serial.Print ("| H3: ");
Serial.Print (chEng[2]);
Serial.Print ("| Ch4: ");
Serial.Print (chEng[3]);
Serial.Print ("| H5: ");
Serial.Print (chEng[4]);
Serial.Print ("| H6: ");
Serial.Print (chEng[5]);
Serial.Print ("| H7: ");
Serial.Print (chEng[6]);
Serial.Print ("| Ch8: ");
Serial.Print (chEng[7]);
Serial.println ("|");
}
Als (debug == 3 || debug == 4)
{
Serial.Print ("SerData| Ch1: ");
Serial.Print (chSer[0]);
Serial.Print ("| CH2: ");
Serial.Print (chSer[1]);
Serial.Print ("| H3: ");
Serial.Print (chSer[2]);
Serial.Print ("| Ch4: ");
Serial.Print (chSer[3]);
Serial.Print ("| H5: ");
Serial.Print (chSer[4]);
Serial.Print ("| H6: ");
Serial.Print (chSer[5]);
Serial.Print ("| H7: ");
Serial.Print (chSer[6]);
Serial.Print ("| Ch8: ");
Serial.Print (chSer[7]);
Serial.println ("|");
}
Als (debug == 5) {}
Serial.Print(CH3);
Serial.Print("|");
Serial.println(CH4);
}
} //End van hoofdprogramma
Ik weet hoe ik het deed de tank sturen is verre van optimaal, maar het is hoe ik het uit voorstelde. Het vierde kwadrant werkt niet en ik heb nog te werken. Het was niet dat groot van een probleem, aangezien dit een bewijs van concept robot in het werken met RC controle en Arduino voordat ik overga schaaleindwaarde.
Laat me weten als u vragen hebt en ik zal mijn best doen om te beantwoorden en dienovereenkomstig bijwerken. Gelieve te omvatten de stap en uitvoerig uitleg uw probleem om me krijgen op dezelfde pagina met u te helpen.