NRF RC Car

Last Updated on 8. October 2026 by SuffocationLink status: OK

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.

View

Applications

  • Spaß für die Kinder und den Papa 😉

Bill of materials

Car

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

Remote control

  • Sunfounder Remote Control Board
  • Arduino Nano
  • nRF24 Module
  • Spannungsversorgung (Lipo)

Foundations

Für die RF Kommunikation habe ich einen älteren Beitrag, auf den verwiesen sei. Dieser Beitrag enthält auch die Verkabelung des Arduino Uno mit dem nRF24 Modul.

Funk über 2.4 GHz nRF24L01 ModuleLink status: Unknown

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

Zuletzt noch die Ansteuerung der Motorplatine.

Arduino Motor Shield V2Link status: OK

Circuit

Die gelinkten Beiträge 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.

Programming

Library

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

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

Test programme

Die beiden Programme für Sender und Empfänger können unter folgendem Link heruntergeladen 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äprozessordefinitionen 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 hochkant 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 rechts
  • SWAP Y macht das gleiche für die Y Ausrichtung des Joysticks.
Recipient

Bei den ersten Fahrversuchen ist mir aufgefallen, dass die Lenkung entweder zu schnell oder zu langsam ist, aber irgendwie nie richtig 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 herumgespielt:

  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überliegenden Rades. Hier ist zu beachten, dass die maximale Geschwindigkeit um den maximalen Lenkfaktor vermindert werden muss, da sonst eine zu hohe Geschwindigkeit herauskommen kann.
    • nach links lenken = rechts 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/rechts beschleunigen
    • nach rechts lenken = links beschleunigen/rechts verlangsamen

Eine weitere Option mit Anpassung der Lenkung an die Geschwindigkeit (Adaptives Lenkverhalten) ist denkbar. Diese habe ich allerdings aus Zeitgründen (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 Grundeinstellungen basieren auf Versuchen mit meinem Untersatz, bei anderen könnten die Werte variieren. Viel Spaß beim Ausprobieren ;).

Ich verwende im Empfänger die Arduino map FunktionLink status: OK, diese ist ganz praktisch, um einen Wertebereich in einen anderen umzuwandeln.

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

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

Output

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

Kleine Testfahrt

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

Conclusion

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

Problems

Toter Bereich des Joysticks

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.0Link status: OK

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 Joystick in einer Ecke ist, beispielsweise x=0 y=0, dann ist er auch nicht auf vollem Ausschlag. Ich vermute, dass dies zu der Verkürzung führte.

RF Problem

Hierzu siehe die RF Beiträge hereLink status: Broken and hier.Link status: OK Mögliche Fehlerquellen sind die Verdrahtung oder die RF Bibliothek. Eine externe Spannungsversorgung kann auch helfen.

Recipient responds with a significant delay

Die schon beschriebene Map Funktion scheint sehr rechenintensiv zu sein. Sollten viele Telegramme hereinkommen, kann es zu Verzögerungen bei der Abarbeitung kommen. Dies habe ich durch Verwerfen gleicher Telegramme ein wenig umgangen.

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

Auf Senderseite versuche 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)
and
Gemessener Wert > ( Vorgänger – Toleranz)
=> verwerfen.

Related Posts

Sources

http://tmrh20.github.io/RF24Link status: Broken

https://github.com/adafruit/Adafruit_Motor_Shield_V2_LibraryLink status: OK

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

https://www.arduino.cc/en/Tutorial/AnalogInputLink status: Unknown

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

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

DateChangeAuthor
08.10.2026Überschriften-Hierarchie korrigiert (H1→H2, Unterebenen eine Stufe tiefer)Suffocation
03.10.2026Rechtschreibung korrigiert: Tippfehler, Kommas, Grammatik, Groß-/Kleinschreibung
Log-Liste eingefügt
Suffocation
26.05.2019Post createdSuffocation
Changelog

Leave a Reply

Your email address will not be published. Required fields are marked *