Was muss man nicht alles beachten, wenn man eine Drohne legal betreiben möchte: Man braucht eine Haftpflichtversicherung, muss sie beim Luftfahrt-Bundesamt registrieren und benötigt u.U. - je nach Ausstattung - auch noch einen Drohnen-Führerschein. Als ich eine billige Drohne geschenkt bekam, war ich daher nicht gerade begeistert - bis mir die Idee kam, sie "auszuschlachten" und für diverse Bastelprojekte zu nutzen! Hier soll darüber berichtet werden wie ich die Drohnen-Fernsteuerung umgebaut habe; die Drohne selbst wurde zerlegt und soll in der Schule für Land- bzw. Wasserfahrzeugprojekte im AG-Bereich genutzt werden.
Zurück zur Drohnensteuerung: Diese besteht aus einem schwarzen Kunststoffgehäuse mit zwei (funktionslosen) "Antennen" und es kann ein Smartphone dank einer ausziehbaren Halterung mit Federmechanismus eingeklemmt werden (für die Verbindung mit der Drohnenkamera). Auf der Unterseite befindet sich ein Batteriefach, auf der Oberseite 2 Joysticks und 10 Taster zur Steuerung der Drohne.
Meine Idee war nun, die vorhandenen Joysticks, die Taster, die ebenfalls vorhandene LED und den passiven Piezo an einen RP2040-Zero anzuschließen, um mittels Programmierung aus der Drohnensteuerung ein USB-Gamepad zu basteln. Die Wahl für diesen Mikrocontroller fiel leicht, das er über eine USB-C-Buchse verfügt, die sowohl unter CircuitPython als auch unter Arduino als USB-Host konfiguriert werden kann.
Zunächst musste mittels "reverse engeneering" herausgefunden werden, welche der verbauten Aktoren und Sensoren von der Platinenoberseite für das Projekt genutzt werden konnten. Die Platinenunterseite der Drohnen-Fernsteuerung wies relativ wenige elektronische Komponenten auf: Ein IC zur Ansteuerung der Aktoren und Sensoren, ein IC für die Funkverbindung, einige Spannungsregler, Widerstände, Dioden und ein Quarz:
Schnell wurde beschlossen, alle elektronischen Bauteile von der Unterseite der Platine zu entfernen, um alle Aktoren und Sensoren unabhängig von weiteren elektronischen Komponenten direkt an einen Mikrocontroller anschließen zu können. Anschließend musste herausgefunden werden, wie die Leiterbahnen der Platinenunterseite verschaltet waren. Dabei konnte schnell ermittelt werden, dass die beiden Joysticks (grüne Umrahmung: X-Achse, Y-Achse, GND, VCC), die LED (blaue Umrahmung: GND, GPIO) und der Piezo (violette Umrahmung: VCC, GPIO) relativ einfach über entsprechend an den Lötkontakten zusätzlich angelötete Kabel mit einem Mikrocontroller verbunden werden können. Die 10 Taster (rote Umrahmung, K1-K10) dagegen waren z.T. mit GND, z.T aber auch nur mit anderen Tastern verbunden:
Nach genauen Untersuchungen der mit den Tastern verbundenen Leiterbahnen ergab sich folgendes Bild:
Der hilfreiche KI-Assistent vermutete hier eine Tastermatrix und versuchte zunächst, mittels Pin-Paaren jeden Taster korrekt anzusteuern. Schnell stellte sich hier jedoch heraus, dass bei fast allen Kombinationen ein "Ghosting-Effekt" eintritt, der zwar über Software-Tricks unter MicroPython minimiert werden konnte, später jedoch in der Konfiguration für Gamecontroller unter Microsoft Windows (joy.cpl) nicht vollständig beseitigt werden konnte. Doch zunächst zu den weiteren Bastelarbeiten: Nachdem die Leiterbahnen entschlüsselt waren, konnten alle Aktoren (LED, Piezo) und Sensoren (Taster, Joysticks) mittels angelöteter Kabel mit dem RR2040-Zero verbunden werden. Letzterer wurde direkt auf eine zurechtgeschnittene Lochrasterplatine mit Breadboard-Pinout gelötet, um Mikrocontroller und Trägerplatine möglichst kleinformatig auszuführen:
Zur Programmierung: Zunächst wurden in MicroPython Testprogramme geschrieben (z.B. ein Fading der eingebauten LED mittels beider Joysticks, welches hier zu finden ist), um alle angeschlossenen Aktoren und Sensoren zu testen, was - abgesehen von den bereits erwähnten "Ghoting-Effekten" der Taster - problemlos gelang. Danach wurde die Programmierung auf CircuitPython umgestellt, da dessen Bibliothek "adafruit_hid" es ermöglicht, einen RP2040-Zero als USB-Eingabegerät zu konfigurieren. Unglücklicherweise unterstützt die derzeit aktuelle Version 10.x von CircuitPython jedoch keine Gamepads / Joysticks mehr, sondern nur Mäuse und Tastaturen: Eine Maus-Emulation funktionierte wunderbar mit einem Joystick und zwei Tasten (hier ist der entsprechende Code), eine Gamepad-Emulation dagegen war nicht möglich.
Nach einem Umstieg auf die Arduino-IDE und dem passenden Board-Treiber mit Adafruit TinyUSB als USB-Stack erkannte die Konfiguration für Gamecontroller unter Microsoft Windows (joy.cpl) das "Gamepad" anstandslos. Nach vielen, trotz KI-Unterstützung vergeblichen Versuchen erwies sich die Standard-Gamepad-Konfiguration als stabilste Lösung; auch die beiden Joysticks ließen sich auf diese Weise schnell einbinden.
Es blieb das Tasterproblem: Alle Versuche, das Ghosting innerhalb der Tastermatrix zu vermeiden, schlugen fehl, auch der freundliche KI-Assistent wusste keine Lösung zu präsentieren. Letztlich wurde ein gedanklicher Wechsel vollzogen: Alle Taster, die keinen direkten GND-Anschluss besitzen, sollten fortan ignoriert werden (dem mittlerweile ziemlich erschöpften KI-Assistenten musste diese neue Idee übrigens mehrfach erläutert werden, bevor sie verstanden wurde; er hing sehr an seiner Vision von einer Tastermatrix). Übrig blieben folglich fünf Taster, die jeweils separat mittels im RP2040-Zero eingebauten Pullup-Widerständen störungsfrei angesteuert werden konnten: Oben links, vorne links, oben rechts, vorne rechts (ideal zum Zocken!) und ein weiterer Taster (K7). Dieser Taster K7 wurde so programmiert, dass er die eingebaute LED, welche während des Betriebs des Gamepads dauerhaft leuchtet, aus- und wieder einschalten kann; währenddessen wird der "Imperial March" von Star Wars über den eingebauten Piezo abgespielt. Die übrigen vier Tasten sind über die Spielsteuerung unter Windows programmierbare Gamepad-Tasten. Verbindet man das Gamepad mit dem USB-Anschluss, ertönt übrigens das "Main Thema" aus Star Wars. Der vollständige Arduino-Code des USB-Gemepads ist hier zu finden.
Um die neue Elektronik mit dem RP2040-Zero und der zugehörigen Trägerplatine im Gamepad unterzubringen, wurde zunächst das Batteriefach aus dem Gehäuse herausgetrennt. Anschließend wurde für den USB-C-Anschluss eine kleine Aussparung an der Vorderseite des Gamepads hineingebohrt. Schließlich wurde die Trägerplatine mittels Heißkleber so im Gamepad-Gehäuse fixiert, dass der Batteriefachdeckel problemlos geschlossen werden kann:
lediglich die nun von außen sichtbare USB-C-Buchse weist auf einen Umbau der ehemaligen Drohnen-Fernsteuerung hin:
Eine Drohnen-Fernsteuerung als USB-Gamepad - das war ein spannendes Upcycling-Projekt! Die Umsetzung war zwar nicht ganz einfach, führte letztlich jedoch zum gewünschten Ergebnis - auch wenn nur die Hälfte der verbauten Taster genutzt werden kann.
Dass es sich hierbei um ein "Low Cost" - Projekt handelte, ist eine nette "Zugabe": Alle benötigten Komponenten waren bereits vorhanden, würden im Fall eines Neukaufs jedoch 10 EUR nicht überschreiten.