Schritt 9: Tank Lenkung W/kontinuierliche Rotation Servos
Achten Sie darauf, meine wunderbare Modell Sid (siehe oben Bild) Danke, dass ein guter Sport während ich ihn verwendet habe, um mein Programm zu verfeinern.
/ * Dies wird Skizze wird alle 8 Kanäle des RC-Empfängers zu lesen und die Eingabewerte über serielle Schnittstelle
überwachen. Programmiert für den Arduino Uno und Adafuit Servo-Treiber Board(pins A5-SCL and A4-SDA).
Meine Sender ist auch in Modus 3 eingestellt, also den rechten Analogstick wie folgt:
Vertikalen Achse = Kanal 3
Horixontal-Achse = Kanal 4
===========================================================================================*/
Mitgelieferten Bibliotheken
#include
#include
Aktivieren der Debug-Modus zur Eingabe von Daten über serielle Schnittstelle
/ * 0 = aus, 1 = Engineering Daten an, 2 = Raw Daten an, 3 = Servo Wert ausgegeben,
4 = Raw Ger & Servo Datenausgabe, 5 = Tank Steuern Datenausgabe, * /
const Int Debug = 0;
Arrays für Kanal-Pin-Positionen und Kanaldaten
const Int Kanäle = 8;
const Int ChPin [] = {2,3,4,5,6,7,8,9}; Pin-Positionen
Int ChEng [8]; Filialdaten massiert
Int ChSer [8]; Servo-Wert-Speicher
RX Signal massieren Werte
const Int RXLo = 920;
const Int RXHi = 1640;
const Int RXDeadLo = 1265;
const Int RXDeadHi = 1295;
const Int RXMid = 1280;
Servo-Bereiche
const Int SerLo = 130;
const Int SerMid = 330;
const Int SerHi = 530;
const Int TankLo = 250;
const Int TankHi = 410;
Servo-Ausgang
Adafruit_PWMServoDriver servo=Adafruit_PWMServoDriver(0x40);
const Int Freq = 50;
const Int SerNum = 8;
Int ch3; Tank-Steuern-variable
Int ch4; Tank-Steer-variable
Richten Sie Pin-Positionen ein, starten Sie serielle oder beginnen I2C
void setup() {}
Wenn (Debug > 0) {}
Serial.Begin(115200); Wir gehen PLAID!
}
Input-Pins:
für (Int ich = 0; ich pinMode(chPin[i],INPUT);
}
Servo.Begin();
servo.setPWMFreq(freq);
} //End Setup
Hauptfenster des Programms
void loop() {}
Werte von Chy an Chz, Chx, Chy, verschieben und neue Werte zu lesen
für (Int ich = 0; ich chEng[i]=pulseIn(chPin[i],HIGH);
Signal zu massieren
ChEng [i] = beschränken (ChEng [i], RXLo, RXHi); Unteren und oberen Ende trimmen
Wenn (ChEng [i] < = RXDeadHi & & ChEng [i] > = RXDeadLo) {//Create Dead-Band
ChEng [i] = RXMid;
}
Servo-Ausgang Eng Werte zuordnen
Wenn (ChEng [i] > = RXLo & & ChEng [i] < = RXDeadLo) {//Map unteren Wertebereich
ChSer [i] = Karte (ChEng [i], RXLo, RXDeadLo, SerLo, SerMid);
}
ElseIf (ChEng [i] == RXMid) {//Map Mittelwert
ChSer [i] = SerMid;
}
ElseIf (ChEng [i] > = RXDeadHi & & ChEng [i] < = RXHi) {//Map höhere Wertebereich
ChSer [i] = Karte (ChEng [i], RXDeadHi, RXHi, SerMid, SerHi);
}
} //End der For-Schleife
Tank-Steer mit rechten Analogstick, Outputing an zwei kontinuierliche Drehung servos
/ * Mit kartesischen Quadranten-System und jeder Wert für den passenden Motor umgekehrt ist
gewährleisten korrekte Bedienung * /
Ersten Quadranten.
/ * Flip-Bereich am rechten Servo in Bezug auf vertikale Achsenposition. So bleiben die
Servo-Set in der vertikalen Position verlassen und reduzieren die richtigen Servos speed.* /
Wenn (ChSer [2] > = SerMid & & ChSer [3] > = SerMid) {}
CH3 = ChSer [2];
CH4=Map(chSer[3],serMid,serHi,chSer[2],serMid);
}
Zweiten Quadranten
/ * Flip-Bereich am linken Servo in Bezug auf vertikalen Achsenposition. Dies ist nicht als
Straße nach vorne sollte als Quadrant 1 aber der folgende Beispielcode war ich vor mit
ähnlich aussehen.
CH3=Map(chSer[3],serLo,serMid,serMid,serHi);
servo.setPWM(2,0,map(ch3,serHi,serMid,chSer[2],serMid));
Wie kam ich mit den folgenden ist durch Vereinfachung und resources.* sparen /
ElseIf (ChSer [2] > SerMid & & ChSer [3] ch3=map(chSer[3],serLo,serMid,serMid,chSer[2]);
CH4 = ChSer [2];
}
Dritten Quadranten
/ * Flip-Bereich am rechten Servo in Bezug auf vertikalen Achsenposition. Die linke servo
weiterhin Reisen nach hinten, während das richtige Servo slowed.* ist /
ElseIf (ChSer [2] < = SerMid & & ChSer [3] < = SerMid) {}
CH3 = ChSer [2];
CH4=Map(chSer[3],serMid,serLo,chSer[2],serMid);
}
Vierten Quadranten
/ * Flip-Bereich am linken Servo in Bezug auf Vertivle Achslage, das richtige Servo
wird Continut Reisen nach hinten, während die linke Servo slowed.* ist /
sonst if(chSer[2]serMid) {}
CH4 = ChSer [2];
CH3=Map(chSer[3],serMid,serLo,chSer[2],serMid);
}
/ * CCW Drehung durch die Umkehrung richtig Servo und Weiterleitung linken Servo zu ermöglichen
die horizontale axis.* /
Wenn (ChSer [2] == SerMid & & ChSer [3] > = SerMid) {}
CH3 = ChSer [3];
CH4=Map(chSer[3],serMid,serHi,serMid,serLo);
}
/ * Rechtslauf durch Weiterleitung richtig Servo und Umkehr linken Servo zu ermöglichen
die horizontale axis.* /
Wenn (ChSer [2] == SerMid & & ChSer [3] < = SerMid) {}
CH3 = ChSer [3];
CH4=Map(chSer[3],serMid,serLo,serMid,serHi);
}
Remap Variablen geben bessere Empfindlichkeit und die volle Palette ist nicht gebraucht, um die volle Geschwindigkeit zu erreichen.
CH3=Map(CH3,serLo,serHi,tankLo,tankHi);
CH4=Map(CH4,serLo,serHi,tankLo,tankHi);
Rechten Seite Servo Signal, Kanal 4 Signal spiegeln.
Wenn (ch4 > = SerMid) {}
CH4=Map(CH4,serMid,serHi,serMid,serLo);
}
ElseIf (ch4 ch4=map(ch4,serMid,serLo,serMid,serHi);
}
Ausgabe auf Servo-Treiber
servo.setPWM(2,0,ch3);
servo.setPWM(3,0,ch4);
Debug-Ausgabe
Wenn (debug == 1 || Debuggen == 4) //Engineering Daten
{
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 ("|");
}
Wenn (debug == 3 || Debuggen == 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 ("|");
}
Wenn (debug == 5) {}
Serial.Print(CH3);
Serial.Print("|");
Serial.println(CH4);
}
} //End des Hauptprogramms
Ich wusste, wie ich den Tank Lenkung ist alles andere als optimal, aber es ist wie ich es herausgefunden. Der vierte Quadrant nicht funktioniert und ich habe noch zu arbeiten. Es war nicht so groß ein Problem, da dies ein Beweis der Begriff Roboter im Umgang mit RC Steuerung und Arduino ist bevor ich Vollausschlag bewegen.
Lassen Sie mich wissen, wenn Sie Fragen haben und ich mein Bestes werde zu beantworten und entsprechend aktualisieren. Bitte geben Sie den Schritt und einige Details erklären, Ihr Problem zu mir auf der gleichen Seite mit Ihnen zu helfen.