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.
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.
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:
- Adafruit Motor Shield Library V2 Link status: OK
- RF24Link status: Broken
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:
- Verlangsamung des Rades in die Richtung, in die ich lenken möchte
- nach links lenken = links verlangsamen
- nach rechts lenken = rechts verlangsamen
- 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
- 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:
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
- RF NanoLink status: OK
- Funduino JOYSTICK V1.ALink status: OK
- Sunfounder nRF24 Remote ControlLink status: OK
- Preview – Arduino Motor Shield mit L298PLink status: OK
- D1 Mini Shield – HR8833 MotorLink status: OK
- D1 Mini Shield – AT8870 MotorLink status: OK
- Zumo V1.2Link status: OK
- FunduMoto L298P High Power Motor Driver BoardLink status: OK
- RC car with PS2 controllerLink status: OK
- Arduino PS2 Controller Board FundamentalsLink status: OK
- NodeMCU V2 Motor BoardLink status: OK
- Adafruit Motor HAT v1Link status: OK
- Motor bridgesLink status: OK
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
| Date | Change | Author |
|---|---|---|
| 08.10.2026 | Überschriften-Hierarchie korrigiert (H1→H2, Unterebenen eine Stufe tiefer) | Suffocation |
| 03.10.2026 | Rechtschreibung korrigiert: Tippfehler, Kommas, Grammatik, Groß-/Kleinschreibung Log-Liste eingefügt | Suffocation |
| 26.05.2019 | Post created | Suffocation |



