RC Steuerung und Arduino: A Complete Works

10 Schritt:Schritt 1: Bind / Pairing Empfänger zum Sender Schritt 2: Lernen Sie Ihre Radiosystem kennen Schritt 3: Schnell Arduino Tuitorial Schritt 4: Erstes Programm: Lesen Sie den Empfänger Schritt 5: Deep Tissue Signal Massieren ... Schritt 6: Zweite Programm: Servo Schritt 7: RCArduinoFastLib zur Rettung? Schritt 8: Adafruit zur Rettung !!! Schritt 9: Tank Steering W / Laufservos Schritt 10: Jetzt Was !?

RC Steuerung und Arduino: A Complete Works
In diesem instructable werde ich Ihnen mit auf meine Reise zu lernen, wie man mit Hilfe eines RC Steuer Arduino Mikrocontroller hinzufügen zu bringen. Im Gegensatz zu anderen Instructables oder Blogs, werde ich sind alle Informationen, die ich kann, auch wenn sie nicht direkt mit dem Projekt stehen. Ich tue dies aus zwei Gründen, erste ist, dass, wenn ich die Grundlagen zu lernen und ich habe immer über diese wirklich coole Projekte, die ich nicht wegen mangelnder Informationen Einführung tun stolpern. Zweitens ist, wenn jemand ihr Projekt präsentieren zu erziehen, anstatt uns und teilen ihre Fülle von Wissen. Dieses Projekt ist reichlich komplex und ich werde nur Entsendung meine Einführung in RC-Steuerung mit der Arduino-Plattform in diesem Instructable. Als ich mit anderen Phasen des RC Panzer Projekt weiter ich mehr Instructables veröffentlicht, sobald ich weiterhin.

Wenn Sie meine Arbeit hier bitte mögen für diese instructable entweder in der Arduino oder Remote Control Wettbewerbe stimmen !!! Vielen Dank

Fangen wir mit dem, was ich verwende für die Hardware:

Radio Control System:
FlySky TH9X Transmitter & Receiver R8b
http://www.hobbypartz.com/79p-th9x-r9b-9channel-radio.html

Mikrocontroller:
Arduino Uno
http://arduino.cc/en/Main/ArduinoBoardUno
Arduino Mega2560
http://arduino.cc/en/Main/ArduinoBoardMega2560

Servos
TowardPro (knockoff) MG996R Analog Servo, Futaba Compatable - für kontinuierliche Drehung Umgebaute
http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=251232756641

Batterien:
6V Lantern Battery - Reciever und Servos
9V Batterie - Arduino
1.2V Rechargable NIMH AA Batterien - Transmitter

Materialien:
Proto-Shield
Dupont Schaltdrähte
Karton
Ellenbogen Fett
Sinn für Humor - Vertrauen Sie,

Wenn etwas verwirrend fühlen Sie sich frei, Fragen zu stellen und ich werde mein Bestes tun, sie zu beantworten, und aktualisieren Sie den instructable.

Schritt 1: Bind / Pairing Empfänger zum Sender

  1. RC Steuerung und Arduino: A Complete Works

    RC Steuerung und Arduino: A Complete Works

    RC Steuerung und Arduino: A Complete Works

    Ich kaufte das TH9X als meine erste Funksystem und haben noch nie eine, die nicht mit einem Auto angebracht haben kommen, verwendet. Es gab ein paar Hürden Ich ging durch vor allem, weil ich nicht überprüfen, was ich tat.

    Erstens, das Etikett der R8b Empfänger die BIND und BATT Standorten geschaltet werden! Sie können den Akku in überall stecken, da die Spannung und Masse-Pins sind auf gemeinsamen Schienen. Allerdings, wenn Sie die Batterie, um einen Kanal zu verbinden Sie dann nicht in der Lage, um als Kanal für die Ausgabe, es sei denn Einspeisen des Signals in einem Mikrocontroller zu verwenden. Siehe zweites Bild.

    Zweitens wurde zu lernen, wie Sie den Empfänger mit dem Sender paaren als zwei Empfänger in die Binsen gegangen, weil ich den Stecker verdrahtet auf eine Wand Würze rückwärts! Dummen Fehler, aber ich habe sagen, ein Sinn für Humor erforderlich.

    Drittens, ich war immer die restlichen zwei Empfänger, mit dem Sender gekoppelt, jedoch nicht immer jede Ausgabe auf jedem Kanal. Kommen Sie, um herauszufinden, Sie haben zu deaktivieren, sowohl die Empfänger und Sender, um die Kopplung abgeschlossen.

    Bevor ich meine Methode, um die Empfänger zu dem Sender paaren gibt es einen Unterschied, wenn Sie ein RC Auto / Flugzeug werden! In einem RC-Fahrzeug werden Sie in Ihrer LiPo Akku in und elektronische Drehzahlregler (ESC) Anschluss und die Nutzung des WSA Battery Elimination Schaltungen (BEC), um den Empfänger zu versorgen. Ich bin nicht mit einem ESC und eine Laterne Batterie verwenden, aber jeder Batteriesatz sollte funktionieren, wenn die Spannung nicht über 6.5V.

    Erforderliche Materialien:
    Sender
    Empfänger
    Bindestecker
    Batterien / ESC
    Servo

    Wie Pair / Binden Sie Ihren Receiver, um Ihren Sender:
    1) Legen Sie die Batterien in Sender. Schalten Sie nicht auf noch nicht!
    2) Installieren Sie Bindestecker in den Empfänger.
    3) Schließen Sie Batterie / BEC zum Empfänger.
    4) Auf der R8b führte eine rote LED schnell.
    5) Drücken und halten Sie die Bindungstaste am Sender, wie Sie es einschalten.
    6) Wenn Sie den Hauptbildschirm auf dem Sender sehen lassen Sie die Bindungstaste. Die TH9X die Bindungstaste auf dem Funkmodul auf der Rückseite des Senders. Siehe drittes Bild.
    7) die rote LED am Empfänger sollte auf zu blinken und bleibt an innerhalb von fünf Sekunden. Siehe vierte Bild.
    8) Entfernen Sie den Bindestecker.
    9) Batterie abklemmen / BEC vom Empfänger.
    10) Schalten Sie Sender.

Schritt 2: Lernen Sie Ihre Radiosystem kennen

  1. RC Steuerung und Arduino: A Complete Works

    RC Steuerung und Arduino: A Complete Works

    Hier ist, wo die Dinge können schlammig wegen der Art, wie ich näher, und mit Hilfe des Funksystems. Ich werde mich nicht um die Kanäle durch das, was sie kontrollieren zu nennen und werden mit den Kanalnummern. Sehen Sie den folgenden Link für ein erstes Verständnis.
    http://www.rc-airplane-world.com/rc-transmitter-modes.html

    Ich beschloss, mit Mode 3, weil es leichter zu merken, wo die Kanäle am Sender zugeordnet gehen. Ich hatte nicht, alle Standardwerte auf der anderen als Mapping-Kanäle 5 bis 8. Gehen Sie voran und Karte diese Kanäle, wie immer Sie wollen, und wenn Sie nur ein 4-Kanal-Funk nicht darum kümmern, wie ich haben keine Sender ändern machen große Einsatz der Zusatzkanäle. Fühlen Sie sich frei zu erkunden rc-airplane-world.com , da es eine Menge Information zu lernen, ein Flugzeug oder rc heli fliegen. Ich bin auch nicht unter Verwendung beliebiger Dual / Rate-Einstellungen und verwenden werden stock lineare Kurven.

    Modus 3:
    Linker Stick:
    Kanal 1: Querruder
    Kanal 2: Aufzug
    Rechter Stick:
    Kanal 3: Gas
    Channel 4: Rudder

    Wenn alle Stricke reißen einfach hook up Servos an den Empfänger und manuell herauszufinden, wie Sie Ihren Sender eingerichtet ist.

    Wir müssen die Signale, die der Empfänger wird uns geben werden, zu verstehen und wie wir sie verwenden. Servos kommen in einer Vielzahl von Größen, Motor Designs, und die interne Kontrolle. Analog Servos sind die häufigsten, aber Digital-Servos sind an Popularität gewinnt, weil sie mehr Durchhaltevermögen, sind schneller zu reagieren, sondern verbrauchen mehr Energie. Wenn Sie unsicher sind, was zu kaufen lassen Sie Ihren Geldbeutel entscheiden, da sowohl analoge als auch digitale Servo erfordern das gleiche Signal, sondern nur unterschiedliche Einbauten. Haben Sie Geduld, können Sie knockoff Servos billig bei ebay kaufen, sondern muss einen Monat für die Lieferung warten, wenn Sie sie aus China zu kaufen. Beachten Sie, dass kontinuierliche Drehung Servos sind handlich zu haben, aber nicht billig. Ich kaufte zwei Standard-Servos und modifiziert sie als Dauerdreh Servos arbeiten.

    Die meisten RC-Empfänger-Ausgang ein 50 Hz Pulsbreite Signal an Servos. Die minimale Signal über Null Grad (wenn Sie einen 180-Grad-Servo haben) wird von 1ms 19ms von toten Raum folgte. Maximal Befehl für 180 Grad ist ein Impuls von 2 ms, gefolgt von 18 ms von toten Raum. Wenn Sie nicht verstehen, diese sofort ist es kein Problem, da können Sie lesen Sie weiter, bis dieses Wissen später in die Praxis umzusetzen. In der Zwischenzeit, wenn Sie Google "Hobby Servogrundlagen" sollten Sie eine pdf von Princeton, die ich von erlernt zu sehen!

Schritt 3: Schnell Arduino Tuitorial

  1. RC Steuerung und Arduino: A Complete Works
    Wenn Sie mit Arduino große Erfahrung, aber wenn nicht, bitte, durch ein paar Tutorials zu arbeiten. Zunächst müssen Sie die Arduino IDE herunterladen und die verschiedenen Installationsanweisungen für Ihr System. Ich empfehle das Buch arbeiten "Erste Schritte mit Arduino Started" oder mit Blink, Seriell, und Servo Knob Tutorials . Ich empfehle auch, die eine schnelle Referenz der verschiedenen Arduino Funktionsbefehle oder einem Programmier Notebook. Denken Sie daran, dass die großen Arduino bei ganzzahligen Mathematik sind aber nicht Gleitkomma, ich benutze die Karte Funktion für die meisten math.

    Hier werde ich nur die Funktionen werde ich mit später werden decken und werde mein Bestes tun, um Best Practices auf dem Weg hinzuzufügen.
    , - Erklärt Ende der Zeile, verwenden Sie am Ende jeder Zeile Code mit Ausnahme der nach geschweiften Klammern und nach dem bedingten Anweisungen,
    ex: if (x == 5)
    {
    y = 5;
    }

    // - Line Kommentar, am Anfang der Zeile zur Kommentierung verwendet

    / * Kommentar * / - Bausteinkommentar, kommentiert den Einsatz für mehrere Zeile wie die Hilfe-Datei am Anfang Ihres Codes. Die Hilfe-Datei wird erläutert, was die Datei der Code ist für und durch die vorgenommen.

    int - festzustellen, Typ Integer-Variable, ex: int Variable; oder int-Variable-5;

    const - zu verwenden, bevor Variablendeklaration zu gewährleisten variable ist nicht Programm zu ändern in. Nützlich, um Informationen für bedingte Anweisungen zu speichern. ex: const int Variable = 5;

    <?> # include - inklusive externe Dateien wie Bibliotheken, ex: #include <Servo.h> ** nein; wird gebraucht

    Servo, - festzustellen, um variable Servosteuerung, nur mit Servo.h Bibliothek verwendet verknüpft. ex: Servolenkung;

    befestigen (pin) - befestigen Servo an einem Stift Lage innerhalb Setup-Schleife verwendet, ex: Servo.attach (5)

    Leere setup () -, wo alle Ihre Setup-Daten ist es, Eingangs- und Ausgangspins sowie serielle Geschwindigkeit zu erklären.

    Serial.begin (Rate) - initilizes serielle Verbindung zu bestimmten Baudraten, erwartet Baudraten 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 oder 115200 ex: Serial.begin (115200 )

    pinMode (Stift-Modus) - legt fest, ob ein Pin ist ein Eingang oder Ausgang, Inneneinrichtungsschleife, ex verwendet: pinMode (5, INPUT); oder pinMode (CHA, OUTPUT); hier chA eine Konstante Speichern des Wertes für die referenzierte Stift.

    Leere Schleife () - Hauptprogramm eingeschleift werden.

    for (Initialisierung, Bedingung, Schrittweite) - wiederholen Sie einen Anweisungsblock, ex: for (int i = 0; i <= 8; i ++); Zunächst wird die Variable "i" wird nur in der for-Schleife und "i" kann für mehrere for-Schleifen verwendet werden, verwendet werden. Zweitens ist die bedingte Anweisung und wenn Sie verwenden möchten, müssen Sie zwei gleich nutzen zu können! Drittens ist, wenn man das Subtrahieren oder Addieren eines Werts zu Beginn oder am Ende der Schleife. --i subtrahieren eine am Anfang, i ++ man hinzufügen am Anfang, i-- eine am Ende subtrahieren, i ++ eine am Ende hinzufügen.

    if (Bedingung) - Läuft Code enthält, wenn die Bedingung erfüllt ist, ex: if (x == 5) oder wenn (x <= 5) Wenn Sie mehrere Bedingungen oder komplexe Bedingungen, die Sie verwenden können, logisch und habe (&&), OR (||), NOT (!) mit single ended bedingte Anweisungen.
    Und ex: if (x> 0 && x <5) nur wahr, wenn beide Ausdrücke wahr sind
    Oder Ex: if (x> 0 || y> 0) Wahre entweder Ausdrücke wahr sind
    NOT ex: if (! X> 0) nur wahr, wenn Ausdruck falsch

    elseif (Bedingung) - folgt einer if-Anweisung für die getrennte Verwendung von separaten logischen Bedingungen. Dies funktioniert gut, wenn das Lesen eines Sensors und für verschiedene Sensorwerte du gehst, um verschiedene Dinge zu tun.
    ex:
    if (Sensor <10) {tun}
    elseif (Sensor> 10) {tun}

    sonst - Gibt entweder / oder Funktion zu, wenn oder elseif-Anweisungen. Dies ermöglicht eine Operation durchgeführt werden, unabhängig davon, ob irgendwelche vorhergehenden oder wenn elesif Aussagen sind nicht erfüllt.
    ex:
    if (Sensor <10) {1}, was zu tun
    elseif (Sensor> 10) {2}, was zu tun
    else {3}, was zu tun

    write (var) - Gebraucht mit Servo.h Bibliothek, um eine neue Position oder Wert auf eine Servo passieren. ex: steer.write (Position);

    Serial.print (Daten) - Gebraucht mit seriellen Eingang und wird den Wert einer Variablen oder eine Zeichenkette in derselben Zeile im Terminal-Fenster zu drucken.
    var ex: Serial.print (x);
    String ex: Serial.print ("x =");

    Serial.println (Daten) - Gebraucht mit seriellem Eingang und Daten auf der gleichen Linie, gefolgt von einer automatischen Rück die Schaffung einer neuen Zeile zu drucken. Folgt der gleichen Syntax wie Serial.print ().

    Karte (var, fromLow, fromHigh, toLow, toHigh) - Verwendet integer math, um von einem Bereich zum anderen wieder Maßstab eine Variable oder Wert. Sehr nützlich für das Lesen eines Sensors und dann Ausgeben einer Servo. ex: x = map (x, 0,1027,0,255); Ich empfehle, dass statt der manuellen Eingabe von Werten, die Sie konstante Variablen gesetzt, um Bereiche, diktieren ex: x = map (x, analogLo, analogHi, Servolo, servoHi);

    Randbemerkung:
    Sobald Sie auf den Punkt zu machen ein Projekt zu bekommen gibt es ein paar Dinge zu beachten. Wenn Sie einen Draht aus dem Sensorausgangssignal direkt an das Arduino-Board verbinden Sie eine "schwebende" Signal, das funktioniert gut für Tests, aber nicht für die tatsächliche Umsetzung. Wenn Sie einen Widerstand von dem Signal auf Masse hinzuzufügen, es hilft sicherzustellen, dass Sie ein sauberes Signal haben. Je höher die Frequenz, desto mehr Grund Sie ein Pull-Down-Widerstand verwenden. I beträgt im allgemeinen mindestens 1 K Ohm Widerstand aber abhängig von der Länge des Drahtes, der Nähe zu anderen Signalleitungen zu verwenden, und wenn der Draht gewunden ist. Ein guter Weg, um die Auswirkungen der so aussehen wird mit einem Oszilloskop und variieren den Widerstand verwendet oder verwenden Sie ein Potentiometer. Um richtig Größe des Widerstandes für Ihren Einzelfall ist eine instructable oder technische Lehre für sich allein. Die kurze Version ist, herauszufinden, was der Ausgang des Sensors wird für bewertet und mit einem Serienwiderstand und Topf, um das beste Signal Variation der RC (Widerstands-Kondensator-Transienten-Analyse) Eigenschaften zu erzielen.

    Vollständiger Link Pfade:
    http://arduino.cc/en/Guide/HomePage
    www.makershed.com/Getting_Started_with_Arduino_2nd_Edition_p/mbk1.htm
    http://arduino.cc/en/Tutorial/HomePage
    http://arduino.cc/en/Reference/HomePage

Schritt 4: Erstes Programm: Lesen Sie den Empfänger

  1. RC Steuerung und Arduino: A Complete Works

    RC Steuerung und Arduino: A Complete Works

    RC Steuerung und Arduino: A Complete Works

    RC Steuerung und Arduino: A Complete Works

    Mit dem Wissen um die Grundfunktionen eines RC-Sender und grundlegende Programmierkenntnisse lässt schreiben unser erstes Programm! Ich begann mit der Grundlagen> BareMinimum Skizze, um ein Programm zu bauen, weil sie die grundlegenden Programmstruktur, mit zu beginnen hat.

    Zuerst schreiben Sie Ihre Hilfedatei so dass Sie wissen, was das Programm ist für die, welche Bord Sie verwenden, halten eine kleine Änderungsprotokoll, und jeden Tag oder wichtige Ergänzung / Änderung erstellen Sie eine neue Datei datiert. Ich eine Datei zu speichern jeden Tag arbeite ich an der Software und behalten eine separate Änderungsprotokoll. Dies scheint ein Schmerz, aber, wenn Sie Hilfe benötigen macht es leicht, einfach senden Sie Ihre Dateien und fragen.

    Zweitens erstellen Sie Ihre konstanten Stift Ort Variablen und deren pinMode Zustand im Setup.

    Drittens erzeugen die Variablen und die pulseIn Funktionen zum Lesen und Speichern der RC Receiver Werte.

    Viertens, kommentieren Sie den Code, wenn Sie nicht in der!

    Fünftens jetzt Setup das serielle Baudrate im Setup-Block und fügen Sie Ihre Druckfunktionen, um in das Terminal-Fenster angezeigt werden sollen.

    Sechstens: Speichern Sie es!

    Jetzt können Haken, die Hardware, ich wurde mit einem Mega2560 für diesen ersten Tests, wie es war neu und ich, um es zu testen etwas wollte. Wenn Sie eine Uno haben ändern Sie einfach die Stiftposition Variablen. Alle 8 Kanäle wurden durch w / m DuPont Kabel an die digitale Stifte auf dem Arduino verbunden. Dann habe ich den 5V und Masse, um ihre angesehenen Standorte. Der Receiver wurde bereits an den Sender gebunden, so nach dem Einschalten des Senders, Arduino, laden Sie die Skizze, und wir sind bereit, um Werte in das Terminal-Fenster sehen. Schauen Sie sich mein Code unten. Ich habe auch sehr minimal zu kommentieren, so fühlen sich frei zu fragen, wenn Sie es brauchen.

    // Das wird skizzieren wird alle 8 Kanäle eines RC-Empfänger und geben Sie die Werte über die serielle Monitor zu lesen.
    // Programmiert für die Arduino MEGA 2560 !!!

    // Variablen definieren:
    const int chA = 22; // Constant Variablen für Stiftpositionen
    const int chB = 24;
    const int chC = 26;
    const int CHD = 28;
    const int Che = 30;
    const int CHF = 32;
    const int CHG = 34;
    const int CHH = 36;

    int ch1; // Zugriffe auf Variablen zu speichern und die Werte der einzelnen Kanäle angezeigt werden
    int ch2;
    int CH3;
    int CH4;
    int ch5;
    int ch6;
    int ch7;
    int ch8;

    // Die Setup-Routine läuft einmal, wenn Sie Reset drücken:
    Leere setup () {
    // Initialisierung der seriellen Kommunikation mit 9600 Bits pro Sekunde:
    Serial.begin (115200);
    // Eingangsstifte Set
    pinMode (CHA, INPUT);
    pinMode (CHB Eingang);
    pinMode (CHC, INPUT);
    pinMode (KHK, INPUT);
    pinMode (CHE, INPUT);
    pinMode (CHF, INPUT);
    pinMode (CHG, INPUT);
    pinMode (CHH, INPUT);
    }

    // Hauptprogramm
    Leere Schleife () {
    // Die Eingangskanäle zu lesen
    ch1 = pulseIn (CHA, HIGH); // Lesen und Speichern von Kanal 1
    Serial.print ("K1:"); // Displaytext String auf Serial Monitor, um Variablen zu unterscheiden
    Serial.print (CH1); // Im Wert von Kanal 1 Drucken
    Serial.print ("|");

    CH2 = pulseIn (chB, HIGH);
    Serial.print ("Ch2:");
    Serial.print (CH 2);
    Serial.print ("|");

    ch3 = pulseIn (CHC, HIGH);
    Serial.print ("Ch3:");
    Serial.print (CH 3);
    Serial.print ("|");

    CH4 = pulseIn (KHK, HIGH);
    Serial.print ("Ch4:");
    Serial.print (CH4);
    Serial.print ("|");

    ch5 = pulseIn (CHE, HIGH);
    Serial.print ("Ch5:");
    Serial.print (CH5);
    Serial.print ("|");

    ch6 = pulseIn (CHF, HIGH);
    Serial.print ("Ch6:");
    Serial.print (ch6);
    Serial.print ("|");

    ch7 = pulseIn (CHG, HIGH);
    Serial.print ("Ch7:");
    Serial.print (ch7);
    Serial.print ("|");

    ch8 = pulseIn (CHH, HIGH);
    Serial.print ("Ch8:");
    Serial.println (ch8);
    }

Schritt 5: Deep Tissue Signal Massieren ...

  1. RC Steuerung und Arduino: A Complete Works
    Jetzt, wo wir können erfolgreich gelesen unsere Receiver, was über ein kleines Signal massieren? Ich fand, dass auch nach der Kalibrierung des Senders gab es eine Menge der Veränderung in den oberen und unteren Grenzen der verschiedenen Kanäle. Ich wollte auch einen leichten Totzone, um sicherzustellen, dass die thumbsticks kam zurück, um "center".

    Bevor wir weitermachen Ich habe eine kleine Anzeige. Außerhalb des Gebäudes Ihr Code auf einen Schlag, empfehle ich, dass Sie nur ändern / eine Sache zu einer Zeit, aufbauend auf den ursprünglichen Code. Testen Sie Ihre Änderungen, wenn sie erfolgreich fortsetzen und wenn nicht, sollten Sie einfach wissen, wo, um das Debuggen zu starten. Auskommen Teile oder Zeilen Code ist eine gute Möglichkeit, Ihren Fehler leicht zu finden.

    Nun zurück zu dem Feature-Präsentation. Lässt sich auf Einstellen eines Bereichs, klare Grenzen, ohne dabei zu viel Auflösung. Beim Lesen der Rohwerte entscheiden über die Werte, die Sie für Ihren niedrigen und hohen Werten wollen und sie als konstante Größen. Denken Sie an die Bedingungen, die Sie aufzurufen, um Ihre Daten zu beschränken müssen. Im Folgenden sind meine zwei Methoden um zu signalisieren, Massieren und Bereichsvariablen.

    Variablen:
    // RX Signal massieren Werte
    const int RXLo = 920;
    const int RXHi = 1640;
    const int RXDeadLo = 1265;
    const int RXDeadHi = 1295;
    const int RXMid = 1280;

    Methode 1:
    // Input Signal massieren
    for (int i = 0; i <= 8; i ++) // Signal Conditioning Schleife
    {
    if (ch [i] <= lo) // Trim Lärm von unteren Ende
    {
    ch [i] = lo;
    }

    if (ch [i] <= deadhi && ch [i]> = deadlo) // Erzeuge Totbands
    {
    ch [i] = center;
    }

    if (ch [i]> = Hallo) // Trim Lärm von oberen Ende
    {
    CH [i] = Hallo;
    }
    }

    Methode 2:
    // Signal Massieren
    for (int i = 0; i <= 8; i ++) // Signal Conditioning Schleife
    {
    Cheng [i] = constrain (Cheng [i], RXLo, RXHi); // Trim unteren und oberen Ende
    if (Cheng [i] <= RXDeadHi && Cheng [i]> = RXDeadLo) {// Erstellen Tot-Band
    Cheng [i] = RXMid;}
    }

    Wie Sie sehen können die zweite Methode ist ein bisschen weniger Code und gibt ein perfektes Beispiel dafür, wie die constrain Funktion verwendet wird.

Schritt 6: Zweite Programm: Servo

  1. RC Steuerung und Arduino: A Complete Works
    Ich hob das Bild von Adafruit-Standort und nicht über sie zu sagen, genug gute Dinge!

    Jetzt beginnt der Spaß! Mit dem Programm Ich habe zuvor dargelegt, können fügen Sie einige Servoausgang mit dem Standard-Servo-Bibliothek. Ich habe auch beschlossen, eine Reihe für die Eingangsdaten statt acht separaten Variablen verwenden. Wenn Sie eine Uno, die ich verwenden werden Letztere haben, ist alles, was Sie tun müssen ändern Sie die Stiftposition Variablen.

    // Das wird skizzieren wird alle 8 Kanäle eines RC-Empfänger und geben Sie die Werte über die serielle Monitor zu lesen.
    // Programmiert für die Arduino MEGA 2560

    // Inklusive Libraries
    #include <Servo.h>

    // Variablen definieren:
    const int chA = 22; // Constant Variablen für Stiftpositionen
    const int chB = 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 Conditioning Grenzen
    const int lo = 920;
    const int hallo = 1640;
    const int deadlo = 1270;
    const int deadhi = 1290;
    const int center = 1280;

    int ch [8]; // Array zu speichern und die Werte der einzelnen Kanäle angezeigt werden
    int CH4; // Servo Output Variable
    Servolenkung; // Lenkservo

    // Die Setup-Routine läuft einmal, wenn Sie Reset drücken:
    Leere setup ()
    {
    // Initialisierung der seriellen Kommunikation mit 9600 Bits pro Sekunde:
    Serial.begin (9600);

    // Eingangs Pins:
    pinMode (CHA, INPUT);
    pinMode (CHB Eingang);
    pinMode (CHC, INPUT);
    pinMode (KHK, INPUT);
    pinMode (CHE, INPUT);
    pinMode (CHF, INPUT);
    pinMode (CHG, INPUT);
    pinMode (CHH, INPUT);

    // Servo Ausgänge:
    steer.attach (2); // Bringen Lenkservo um PWM Pin 2
    }

    // Hauptprogramm
    Leere Schleife ()
    {
    // Die Eingangskanäle zu lesen
    ch [0] = pulseIn (CHA, HOCH); // Lesen und Speichern von Kanal 1
    ch [1] = pulseIn (chB, HOCH);
    ch [2] = pulseIn (chC HIGH);
    ch [3] = pulseIn (KHK, HIGH);
    ch [4] = pulseIn (CHE, HIGH);
    ch [5] = pulseIn (CHF, HIGH);
    ch [6] = pulseIn (CHG, HIGH);
    CH [7] = pulseIn (CHH, HOCH);

    // Eingangssignalkonditionierung
    for (int i = 0; i <= 8; i ++) // Signal Conditioning Schleife
    {
    if (ch [i] <= lo) // Trim Lärm von unteren Ende
    {
    ch [i] = lo;
    }

    if (ch [i] <= deadhi && ch [i]> = deadlo) // Erzeuge Totbands
    {
    ch [i] = center;
    }

    if (ch [i]> = Hallo) // Trim Lärm von oberen Ende
    {
    CH [i] = Hallo;
    }
    }

    // Steering Control Output auf Channel 4
    CH4 = CH [3];
    if (CH4> = lo && CH4 <= deadlo)
    {
    CH4 = map (CH4, lo, deadlo, 0, 90);
    }
    else if (CH4 == Mitte)
    {
    CH4 = 90;
    }
    else if (CH4> = deadhi && CH4 <= Hallo)
    {
    CH4 = map (CH4, deadhi, hallo, 90, 180);
    }
    steer.write (CH4);

    // Serielle Ausgänge
    Serial.print ("K1:"); // Displaytext String auf Serial Monitor, um Variablen zu unterscheiden
    Serial.print (ch [0]); // Im Wert von Kanal 1 Drucken
    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 ("Steering Output:");
    Serial.println (CH4);
    }

    Ich gehe davon aus, dass der Servo hatte einen Nervenzusammenbruch und entwickelt einen leichten Tick? Das Terminal-Fenster bestätigt, dass die Räder einfach nur fiel Ihres Projekts, was nun? Bevor Sie Ihren Servo oder Arduino an der Mutter Haus begehen es ist etwas, umgangen werden können. Das Problem ist, wie die Arduino Servo Bibliothek erzeugt die erforderliche Ausgangssignal. Er unterbricht das Hauptprogramm, um die 50 Hz Impuls erhalten und wird mit der Funktion pulsein korrumpieren valuesbeing lesen in Konflikt geraten. Sowohl die Servo-Bibliothek und pulsein sind Interrupt basiert aber welche haben wir uns zu ersetzen? Ich entschied mich für das Servo-Bibliothek nach einer Menge Google-Fu zu beseitigen.

Schritt 7: RCArduinoFastLib zur Rettung?

  1. Nach einem Forum-Thread auf die Arduino Foren Ich wurde angewiesen, um zu versuchen RCArduinoFastLib von Duane bei RCArduino . Ich war in der Lage, einfache Durchlauf durch den Betrieb zu erhalten, aber wenn Sie versuchen, Werte über die serielle Monitor die Räder spüren wieder eingelesen. Dies ist für die Uno geschrieben und ist, wo ich offiziell in den Ruhestand meine Mega. Nach der Implementierung von seriellen Eingängen Ich sah nichts auf dem Terminal-Fenster und durch den Betrieb eingestellt. Duane scheint großes Werk getan haben, aber ich nicht in der Lage, um es für mich zu arbeiten war. Ich kann näher zu diesem Schritt hinzufügen, wenn jemand will, um die Informationen zur Verfügung stellen. Allerdings seeked ich eine andere Ressource und wichen von dieser Lösung. Mein Skizze-Dateien sollten zu diesem Schritt angeschlossen werden.

Schritt 8: Adafruit zur Rettung !!!

  1. RC Steuerung und Arduino: A Complete Works

    RC Steuerung und Arduino: A Complete Works

    RC Steuerung und Arduino: A Complete Works

    RC Steuerung und Arduino: A Complete Works

    Im Adafruit Shop aufgefallen, ich dieses kleine PWM / Servo Controller Board , die eine 2-Draht-Schnittstelle verwendet. Der einzige Nachteil ist, dass Sie müssen manuell zu verstehen und zu programmieren, die durch den Servo erforderliche Signal. Sie müssen downloaden und kopieren Sie in den neuen Bibliotheksdateien. Nicht zurückschrecken tun, wie es ist nicht so schwer, müssen Sie die Bretter Frequenz eingestellt, die Anzahl der Servos, Bord-Adresse und Ihr Wertebereich auf Werte-Karte neu. Ich habe die Adafruit Tutorial und ein Forum Fragen an die verstehen, wie man das Board verwenden. Die Servoplatine ist ein wenig mühsam als die Servo Bibliothek, da Sie die vom Servo erforderliche Signal manuell konfigurieren müssen. Des Weiteren verwendet dieses Board Analogeingänge 4 & 5, um eine Kommunikation über I2C (Zweileiter) Bus .

    Bevor wir weitermachen, sollten Sie prüfen, Löten eines Kondensators auf dem Servo Controller Board zu entkoppeln oder Stabilisierung der Stromquelle. Es ist auch ratsam, entweder separate Stromquellen für die Servos und der Arduino oder entkoppeln / Stabilisierung der Stromversorgung des Arduino geliefert. Die Entkopplung ist eine andere Art zu sagen Sie, um einen Kondensator zwischen der Spannungsquelle (VCC) und Masse (GND) hinzufügen müssen. Die Größe des Kondensators hängt von der Stromquelle, wie gut sie mit Stoßströmen und Artikel ein Entkoppeln sind zu halten. finden Sie in der allmächtige Google für weitere Informationen. Schließlich, wenn Sie mit Elkos (Metalldose caps) stellen Sie sicher, um die Leiterplatte zu suchen Ihre richtige Polung zu bekommen.

    Eine kleine Auffrischung auf dem Servosignal:
    Frequenz 50Hz, damit 1 Sekunde / 50 = 20 Millisekunden (ms) Zeiträume
    1 ms Grundimpuls ist die Low-Signal, 0 Grad, oder volle Rückwärts für eine kontinuierliche Rotation (CR) Servo
    1,5 ms Impuls ist die Mitte-Signal, 90 Grad, oder in der Mitte für eine CR Servo
    2ms Impuls ist das High-Signal, 180 Grad, oder ganz nach vorn für eine CR Servo

    Die Servo-Controller-Platine verfügt über 12 Bit Auflösung pro Periode, um das Servosignal zu erzeugen. Wie nutzen wir diese 12 Bits ist einfach, weil 2 ^ 12 = 4096. Jetzt können wir einfach Verhältnisse oder stoichemetry anwenden, um herauszufinden, den Wert mit, wie lange wir wollen, dass unsere Signal an Hoch ot Tastverhältnis bleiben verbunden. Denken Sie daran, Arduino mag keine Fließkomma-Berechnungen so versuchen, ganze Zahl math verwenden, oder Sie werden Ihr Programm versinken.

    Servosignal von 4096
    Gesamtzeit: 20 ms = 4096
    Low-Signal: 1ms = 4096/20 = 205
    Mid-Signal: 1,5 ms = 205 * 1,5 = 308
    High-Signal: 2 ms = 205 * 2 = 410

    Software Instruction:
    Diese Werte sind als Konstanten in der beggining Ihres Programms für die einfache Bearbeitung später gespeichert werden. So, jetzt, wie werden wir diesen Bereich über die Servopension zur Ausgabe verwenden?

    Zuerst müssen Sie die Bibliotheksdatei für den Vorstand enthalten.
    #include <Adafruit_PWMServoDriver.h>

    Zweitens erklären den Namen an den Servopension gegeben und verbinden die beiden mit der Kammer-Adresse. Standardadresse ist 0x40.
    Adafruit_PWMServoDriver Servo = Adafruit_PWMServoDriver (0x40);

    Drittens, im Setup-Schleife, beginnen die Servoplatine Anschluss.
    servo.begin ();

    Viertens, stellen Sie den Freqeuncy des Servopension im Setup-Schleife.
    servo.setPWMFreq (freq);

    Fünftens, schreiben Sie den Wert auf dem Servobrett in der Hauptprogrammschleife.
    servo.setPWM (Kanal, on, off);
    servo.setPWM (2,0, CH 3);

    Hardware Instruction:
    Zuerst gelötet ich auf den mitgelieferten Stiftleisten, Klemmleiste und einem 470uF elektrolytischen cap bewertet für 10V. Sie könnten mit einer größeren Kappe gehen und für 6V sogar eins bewertet.

    Zweitens, ich habe nicht die Standardadresse der Karte zu verändern und wird nur benötigt, wenn Sie Ketten mehrere Boards miteinander Daisy möchten.

    Drittens habe ich etwas Flüssigkeit Isolierband an der Unterseite der Stiftleisten, seit ich wird einen Roh-Roboter zum Testen.

    Viertens, um das sich der I2C Bus müssen Sie 5V und GND von der Arduino auf den VCC und GND Pins zu versorgen. Weiter zu verbinden A5 bis A4 und SCL SDA. Sehen Sie die Abbildung I mit Fritzing erstellt!

    Das sind die Grundlagen und überprüfen Sie bitte heraus Adafruit Tutorial für weitere Informationen. Als nächstes werde ich zeigen, wie ich realisiert das Servobrett mit Logik zu zwei Laufservos steuern.

Schritt 9: Tank Steering W / Laufservos

  1. RC Steuerung und Arduino: A Complete Works
    Dieser letzte Schritt ist ein Höhepunkt aller bisherigen Themen und mein Tank steer-Code. Ich machte den Tank steer-Code, um nur den rechten Daumen-Stick des Senders zu steuern dann zwei CR Servos. Denken Sie daran, dass mein TX-Modus auf 3 gesetzt ist und ich haben noch keine Kanäle vertauscht. Der rechte Daumen ist Kanal 3 für die horizontalen und Kanal 4 für die verticle Achse. Finden meine Skizze mit einem Arduino UNO anstelle der MEGA. Ich bin mit differnt Servo Grenzen, die einen Mikroreglerfreigabe um volle 180 Grad und sie anderen Bereich für Tanklenk bewegen, um mehr Sensibilität zu geben.

    Stellen Sie sicher, mein wunderbares Modell Sid (Bild oben), dass er so ein guter Sport, während ich habe mit ihm, mein Programm zu verfeinern danken.

    / * Dies wird skizzieren wird alle 8 Kanäle eines RC-Empfänger und geben Sie die Werte über die serielle lesen
    überwachen. Für die Arduino Uno und Adafuit Servo-Treiberplatine programmiert (Pins A5 und A4-SCL-SDA).
    Meine Sender auch in Modus 3 gesetzt, so dass die rechte Daumen ist wie folgt:
    Verticle Achse = Kanal 3
    Horixontal Achse = Channel 4
    ================================================== ========================================= * /
    // Inklusive Libraries
    # include
    # include

    // Aktivieren Sie den Debug-Modus, um Daten über die serielle
    / * 0 = AUS, 1 = Engineering Data On, 2 = Rohdaten, 3 = Servo Wert Ausgang,
    4 = Raw Eng & Servo Data Output, 5 = Tank-Datenausgang zu steuern, * /
    const int debug = 0;

    // Arrays für Channel Stiftpositionen und Kanaldaten
    const int Kanäle = 8;
    const int chPin [] = {2,3,4,5,6,7,8,9}; // Pin Standorten
    int Cheng [8]; // Shop massiert Daten
    int chSer [8]; // Servo Wertspeicher

    // 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 Ranges
    const int Serlo = 130;
    const int serMid = 330;
    const int serHi = 530;
    const int tankLo = 250;
    const int tankHi = 410;

    // Servo Output
    Adafruit_PWMServoDriver Servo = Adafruit_PWMServoDriver (0x40);
    const int freq = 50;
    const int SerNum = 8;
    int CH3; // Behälter variable lenken
    int CH4; // Tank-Steer variable

    // Setup-pin Standorten starten serielle oder beginnen I2C
    Leere setup () {
    if (debug> 0) {
    Serial.begin (115200); // Wir werden PLAID!
    }

    // Eingangs Pins:
    for (int i = 0; i pinMode (chPin [i], input);
    }

    servo.begin ();
    servo.setPWMFreq (freq);
    } // Ende der Installation

    // Hauptprogramm
    Leere Schleife () {
    // Werte von Chy an CHZ Bewegen, chx zu Chy, und lesen die neuen Werte
    for (int i = 0; i Cheng [i] = pulseIn (chPin [i], HIGH);

    // Signal Massieren
    Cheng [i] = constrain (Cheng [i], RXLo, RXHi); // Trim unteren und oberen Ende
    if (Cheng [i] <= RXDeadHi && Cheng [i]> = RXDeadLo) {// Erstellen Tot-Band
    Cheng [i] = RXMid;
    }

    // Map Eng Werte zu Servo
    if (Cheng [i]> = RXLo && Cheng [i] <= RXDeadLo) {// Karte unteren Bereich der Werte
    chSer [i] = map (Cheng [i], RXLo, RXDeadLo, Serlo, serMid);
    }
    else if (Cheng [i] == RXMid) {// Map Mittelwert
    chSer [i] = serMid;
    }
    else if (Cheng [i]> = RXDeadHi && Cheng [i] <= RXHi) {// Karte höheren Wertebereich
    chSer [i] = map (Cheng [i], RXDeadHi, RXHi, serMid, serHi);
    }
    } // Ende der For-Schleife

    // Tank-Steer mit rechten Ministick, outputing zwei Dauerdreh Servos
    / * Verwendung von kartesischen Quadranten-System und jeden Wert nach rechts Motor gegeben wird, um umgekehrt
    gewährleisten einen ordnungsgemäßen Betrieb * /

    // Ersten Quadranten.
    / * Flip Bereich auf der rechten Servo in Bezug auf vertikale Achse Position. Dies wird das Halten
    links in die Servo verticle Position und reduzieren die richtige Servos Geschwindigkeit. * /
    if (chSer [2]> = serMid && chSer [3]> = serMid) {
    ch3 = chSer [2];
    CH4 = map (chSer [3], serMid, serHi, chSer [2], serMid);
    }

    // Zweiten Quadranten
    / * Flip Bereich auf der linken Servo bezüglich verticle Achsposition. Dieses ist nicht so
    Meerenge nach vorne als Quadrant 1, aber der folgende Beispielcode war ich mit, bevor sollten
    ähnlich aussehen.
    ch3 = map (chSer [3], Serlo, serMid, serMid, serHi);
    servo.setPWM (2,0, Karte (CH 3, serHi, serMid, chSer [2], serMid));
    Wie kann ich mich mit der folgenden eingetroffen ist durch Vereinfachung und um Ressourcen zu sparen. * /
    else if (chSer [2]> serMid && chSer [3] CH3 = map (chSer [3], Serlo, serMid, serMid, chSer [2]);
    CH4 = chSer [2];
    }

    // Dritten Quadranten
    / * Klappen Sie den Bereich auf der rechten Servo bezüglich verticle Achsposition. Der linke Servo
    weiter rückwärts reisen, während der rechte Servo verlangsamt wird. * /
    else if (chSer [2] <= serMid && chSer [3] <= serMid) {
    ch3 = chSer [2];
    CH4 = map (chSer [3], serMid, Serlo, chSer [2], serMid);
    }

    // Vierten Quadranten
    / * Klappen Sie den Bereich auf der linken Servo mit Bezug auf die Achse Position vertivle, Das Recht Servo
    wird continut Rückwärtsfahrt, während der linke Servo verlangsamt wird. * /
    else if (chSer [2] serMid) {
    CH4 = chSer [2];
    ch3 = map (chSer [3], serMid, Serlo, chSer [2], serMid);
    }

    / * Aktivieren Linkslauf durch Umkehrung rechten Servo und Spedition links Servo in Bezug auf
    die horizontale Achse ist. * /
    if (chSer [2] == serMid && chSer [3]> = serMid) {
    ch3 = chSer [3];
    ch4=map(chSer[3],serMid,serHi,serMid,serLo);
    }

    /*Enable CW Rotation by forwarding right servo and reversing left servo with respect to
    the horizontal axis.*/
    if(chSer[2]==serMid && chSer[3]<=serMid){
    ch3=chSer[3];
    ch4=map(chSer[3],serMid,serLo,serMid,serHi);
    }

    //Remap variables to give better sensitivity and the full range isn't needed to acheive full speed.
    ch3=map(ch3,serLo,serHi,tankLo,tankHi);
    ch4=map(ch4,serLo,serHi,tankLo,tankHi);

    //Flipping right side servo signal, channel 4 signal.
    if(ch4>=serMid){
    ch4=map(ch4,serMid,serHi,serMid,serLo);
    }
    else if (ch4 ch4=map(ch4,serMid,serLo,serMid,serHi);
    }

    //Output to servo driver
    servo.setPWM(2,0,ch3);
    servo.setPWM(3,0,ch4);

    //Debug Output
    if (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 ("|");
    }

    if (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 ("|");
    }

    if (debug==5){
    Serial.print(ch3);
    Serial.print("|");
    Serial.println(ch4);
    }
    }//End of Main Program

    I know how I did the tank steering is far from optimal but it is how I figured it out. The fourth quadrant doesn't work and I have yet to get working. It wasn't that big of a problem as this is a proof of concept robot in working with RC control and Arduino before I move full scale.

    Let me know if you have any questions and I will do my best to answer and update accordingly. Please include the step and some detail explaining your problem to help me get on the same page with you.

Step 10: Now What!?

  1. I haven't really game to an end result here but have taught you something new or a new way for something you already knew. My goal was to clearly explain, provide detailed documentation and explain again to pound in core concepts. You could call Sid and end result but he is the completion of the initial "testing" or "proof of concept" phase for my RC Tank Project. The next phase is to begin mock-up of my power-train while slowly adding required functions ending with a very rough prototype. I have acquired a Tecumseh two-stroke engine from a snow blower and am working on setting an idle speed. I believe the engine is set to constantly run at 4300 RPM so setting an idle speed has been trouble some but not impossible. Below is a video of my initial attempt at remotely controlling the engine and turned out quite well until I lost power in the end of the video!