NRF RC Auto

Last Updated on 31. Mai 2019 by sfambach

Basierend auf meinen nRF Beiträgen und mit Hilfe der Sunfounder Fernbedienung habe ich mir gedacht, es wäre doch nett hieraus ein ferngesteuertes Auto zu bauen. Dieser Beitrag beschreibt was hieraus geworden ist.

Ansicht

Einsatzzwecke

  • Spass für die Kinder und den Pappa 😉

Stückliste

Auto

  • Fahrbarer Untersatz
  • Arduino Uno
  • Motorplatine V2
  • nRF24 Modul + Anschlussplatine
  • Spannungsversorgung (Akkupack)

Fernbedienung

  • Sunfounder Fernbedienungsplatine
  • Arduino Nano
  • nRF24 modul
  • Spannungsversorgung (Lipo)

Grundlagen

Für die RF Kommnikation habe ich einen älteren Beiterag auf den verwiesen sei. Dieser Beitrag enthält auch die Verkabelung des Ardunio Uno mit dem nRF24 modul.

Die Verwendung der Sunfounder platine ist im folgenden Beitrag beschrieben. Dieser Beitrag kann für einen erste Funktionsprüfung der RF Kommunikation verwendet werden. Hier ist auch die Software für den Sender entstanden.

Zuletzt noch die Ansteuerung der Motorplatine.

Schaltung

Die gelinkten beiträgen zeigen wie die Schaltungen zu verdrahten sind. Die Motoren der Plattform werden für das aktuelle Projekt an der Motorplatine an M1 und M2 angeschlossen

Programmierung

Bibliothek

Bitte die Bibliotheken aus den Beiträgen verwenden, diese wären :

Für meine Programme habe ich die RF Dateien in die entsprechenden Projekt Ordner kopiert.

Testprogramm

Die beiden Programme für Sender und Empfänger können unter folgendem Link herunter geladen werden:

Es folgen noch ein paar kleinere Anmerkungen zum Sender und zum Empfänger. Auch hier kein Anspruch auf vollständigkeit, sollte es Fragen geben hinterlasst einen Kommentar.

Sender

Die folgenden Präprozessor definitionen habe ich eingeführt um evtl. Dreher in der Verkabelung und in der Haltung der Fernbedienung auszugleichen. Sind alle aktiviert, wird bei mir die Platine hochkannt gehalten, so dass der Joystick unten und die RF Antenne oben ist.

#define SWAP_X_Y    // swap x and y axis
#define SWAP_X      // swap x axis up and down 
#define SWAP_Y      // swap y axis up and down 
  • SWAP X Y vertauscht die X und die Y Achse also Geschwindigkeit und Lenkung
  • SWAP X vertauscht den positiven X Bereich mit dem negativen, also beispielsweise vorwärts mit rückwärts oder links mit recht
  • SWAP Y macht das gleiche für die Y Ausrichtung des Joysticks.

Empfänger

Bei den ersten Fahrversuchen ist mir aufgefallen, dass die Lenkung entweder zu schnell oder zu langsam ist aber irgendwie nie richt funktioniert :(. Deshalb habe ich mal drei unterschiedliche Ansätze ausgearbeitet und mit den Werten wie Lenkfaktor (Wie stark darf gelenkt werden) und Beschleunigung und Verlangsamung etwas herum gespielt:

  1. Verlangsamung des Rades in die Richtung in die ich lenken möchte
    • nach Links lenken = Links verlangsamen
    • nach Rechts lenken = Rechts verlangsamen
  2. Beschleunigung des gegenübliegenden Rades. Hier ist zu beachten dass die maximale Geschwindigkeit um den maximalen Lenkfaktor vermindert werden muss, da sonst eine zu hohe geschwindigkeit heraus kommen kann.
    • nach Links lenken = Recht beschleunigen
    • nach Rechts lenken = Links beschleunigen
  3. Beschleunigung und Verlangsamung gemeinsam. Auch hier
    muss die maximale Geschwindigkeit um den maximalen Lenkfaktor vermindert werden. Zudem, da die Lenkung sonst doppelt so schnell wäre, muss der Lenkfaktor noch halbiert werden.
    • nach Links lenken = links verlangsamen/recht beschleunigen
    • nach Recht lenken = links beschleunigen/recht verlangsamen

Eine weitere Option mit anpassung der Lenkung an die Geschwindigkeit (Adaptives Lenkverhalten) ist denkbar. Diese habe ich allerdings aus Zeigründe (Das Wochenende ist rum) nicht mehr angedacht/realisiert.

Die Klasse ist leider alles andere als vollständig, für die meisten Werte gibt es keine Setter/Getter. Die Gruneinstellungen basieren auf Versuchen mit meinem Untersatz, bei andern könnten die Werte variieren. Viel spass beim Ausprobieren ;).

Ich verwende im Empfänger die Arduino map funktion diese ist ganz praktisch um einen Wertebereich in einen anderen umzuwandel.

Beispiel: 0-50 auf 0 – 5 => 0-10 = 0, 11-20 = 1 …

Da diese Funktion auch für negative Werte anwenbar, ist scheint sie in manchen Situationen etwas langsam. Im aktuellen Projekt war sie jedoch mit ein paar Tricks schnell genug.

Ausgabe

Die Ausgabe ist wenig spektakulär, dennoch hier ein kleines Video:

Kleine Testfahrt

So sieht es auf der Console des Empfängers aus:

Fazit

Es fährt noch nicht perfekt auch die Handhabung mit nur einen Joystick ist alles ander als intuitiv, aber es geht. Jetzt lasse ich die beiden Testpiloten mal auf das Gespann los, mal schauen was dabei heraus kommt 😉

Probleme

Toter Bereich des Joystick

Der Joystick hat einen toten Bereich, dies bedeutet dass er nach rund 50% der Aussteuerung auf 100% der Ausgabe ist bei den restlichen 50% passiert dann nichts mehr. Hier ein externer Beitrag der das besser beschreibt:

https://forum.arduino.cc/index.php?topic=520880.0

Ich habe versucht dem Problem Herr zu werden indem ich mit der Referenzspannung der AD Wandler herumprobiert habe. Leider ohne Erfolg.

Am Ende ist mir aufgefallen, wenn der der Joystick in einer Ecke ist, beispielsweise x=0 y=0, dann ist er auch nicht auf vollem Ausschlag. Ich vermute, das dies zu der Verkürzung führte.

RF Poblem

Hierzu siehe die RF Beiträge hier und hier. Mögliche Fehlerquellen sind die Verdrahtung oder die RF Bibliothek. Eine externe Spannungsversorgung kann auch helfen.

Empfänger reagiert stark verzögert

Die schon beschriebene Map Funktion scheint sehr rechenintensiv zu sein, sollten viele Telegramme herein kommen kann es zu Verzögerungen bei der Abarbeitung kommen. Dies habe ich durch verwerfen gleicher Telegramme einwenig umgangen.

Sollten die Werte für x und y gleich den schon empfangenen sein, verwerfe ich das Telegramm.

Auf Senderseite sorge ich durch Testen der gemessenen Werte gegenüber den zuvor gemessenen Werten und einer definierten Toleranz für Ruhe zu sorgen.

Wenn
Gemessener Wert < ( Vorgänger + toleranz)
und
Gemessener Wert > ( Vorgänger – toleranz)
=> verwerfen.

Verwandte Beiträge

Quellen

http://tmrh20.github.io/RF24

https://github.com/adafruit/Adafruit_Motor_Shield_V2_Library

https://www.instructables.com/id/Calibrating-a-Joystick-Potentiometer/

https://www.arduino.cc/en/Tutorial/AnalogInput

https://forum.arduino.cc/index.php?topic=520880.0

https://www.arduino.cc/reference/en/language/functions/math/map/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert