DualDriveMixer - Ein Mikrocontroller Projekt zur Steuerung unseres Amphibienpanzer mit zwei Schaufelrädern
Motivation
Panzer und andere Kettenfahrzeuge werden normalerweise über zwei Antriebe oder ein sperrendes Differenzial gesteuert, damit man diese mit unterschiedlichen Geschwindigkeiten an den beiden Ketten zur Kurvenfahrt gebracht werden können. Auch unser ferngesteuertes Amphibienfahrzeug, den STRAWAP MFV 38 mit zwei Schaufelrädern als Antrieb haben wir jahrzehntelang so direkt über die Fernsteuerung betrieben. Dabei benutzten wir die zwei vertikalen Kanäle der Steuerkreuze des RC-Senders. Normalerweise steuert man Modelle aber über einen horizontalen Kanal zum Lenken und einen vertikalen Kanal zur Geschwindigkeitsregelung, was sich bei dieser Antriebsart mit zwei einfachen Fahrtreglern und einem Kanalmixern aber nicht umsetzen lässt. Bei der Renovierung des Modells habe ich nun die Möglichkeit genutzt über einen Mikrocontroller, der die RC Signale einliest, auswertet und die Ansteuerung der Antriebskomponenten übernimmt dies umzusetzen. Angefangen habe ich mit einem Arduino Nano, der dafür eigentlich völlig ausreichende Leistungsreserven hat. Da ich aber auch die nicht mehr funktionstüchtige Akustik-Elektronik durch den Mikrocontroller ersetzen wollte, bin ich im Lauf des Projektes auf einen ESP32-WROOM als Dev Kit umgestiegen. Für beide Plattformen habe ich mich für die Softwarekomponenten zur RC Signalverarbeitung, Sounderzeugung und einem Multiswitch Encoder/Decoder bei anderen Projekten bedient und meine Erweiterungen darauf entwickelt.
Funktionsumfang DualDriveMixer
Der DualDriveMixer kann beide Steuerungsarten umsetzen und zwischen diesen hin und her schalten. Zum Umschalten der Steuerungsart wird der jeweils dritte ungenutzte RC Kanal benutzt. Um immer klar anzuzeigen welche Steuerungsart gerade aktiv ist steuert die Software eine RGB-LED mit unterschiedlichen Farben an. Bei Verlust des RC Signales werden die Antriebe deaktiviert und die LED geht auf eine andere Farbe. Da unser Amphibienfahrzeug auch gut mit Rotation auf der Stelle klar kommt ist der Mixer so umgesetzt, dass das kurveninnere Rad ab halben Lenkausschlag rückwärts betrieben wird. Die Konstante für die PWM-Frequenz freq sollte, wie im Kapitel Hardware beschrieben, auf den genutzten Antriebsstrang angepasst werden.
Software
Die Umsetzung ist recht modular und flexibel gestaltet. Jede Funktionskomponente befindet sich in einer eigenen ino Datei, die über die Arduino IDE mitgeladen wird. Auch lassen sich viele Funktionalitäten über Konstanten im Definitionsbereich der Dateien konfigurieren. Ebenso befinden sich die Definitionen der für die Funktionen benötigten I/O Pins in diesen Dateien und müssen ggf. angepasst werden.
Allgemein habe ich meine Entwicklungen recht ausführlich kommentiert, damit ich auch in einigen Jahren noch nachvollziehen kann, was die SW da eigentlich machen soll.
Eigentlich wäre man mit den untenstehenden Funktionalitäten der Dateien DualDriverMix3CH, RcPWMRead, RGB-LED und Main-Loop fertig. Da die restlichen Softwarekomponenten meines STRAWAP Projektes aber noch andere, gegebenenfalls auch noch interessante Funktionen bereithalten habe ich diese hier gleich mit beschrieben.
DualDriveMix3CH
In der DualDriveMix3CH.ino sind die Objektdefinition für die beiden BTS7960 PWM-Motorshilds enthalten. Die Arduino IDE benötigt für den ESP32 die Dateien BTS7960ESP32.h und BTS7960ESP32.cpp im selben Verzeichnis, wie die ino Dateien des Projektes. Man könnte diese Komponenten auch als Library einbinden, was ich aber nicht getestet habe. In der ino lässt sich über die Konstante agilityI in der Software einstellen, wie dynamisch das Modell einlenkt. Es sollte in Kombination mit dem Faktor zu Beschleunigung des kurvenäußeren Rades agilityO an die Trägkeit des Modells angepasst werden. Ebenso sollte man die Konstanten für die Nulllagen an die eigene Fernsteuerung anpassen. Wir benutzen 40Mhz FM Anlagen aus den 80igern, die doch noch recht große Streuung in der Signalgüte haben. Daher sind die deadzone Konstanten groszügig auf 7% gesetzt, damit überhaupt ein Nullpunkt zur Steuerart Umschaltung gefunden werden kann.
RcPWMRead
Den alten Sender ist auch die zusätzliche RC-Signal-Streuungsprüfung über mehrere Kanäle (RCpwmScattering) in der RcPwmRead.ino geschuldet, die bei extrem wilden Gerühre am Sender zuschlagen könnte. Der Schwelwert th_scat definiert dabei das erlaubte Signaldelta pro Kanal zwischen zwei Einlesezyklen und sollte bei Bedarf angepasst werden. Die Grenzwerte RC_bound_min und RC_bound_max müssen gemäß der eingestellten Werte der Kanäle konfiguriert werden. Im Zuge der Migration auf ESP32 habe ich mir noch eine kleine Funktion erstellt, die das Kalibrieren der einzelnen RC PWM Signalbreiten erleichtert. Über das #define CHANNEL_DEBUG kann die bedingte Kompilierung dieser Funktion eingeschaltet werden. Mit Hilfe des Serielen Monitors lassen sich dann die benötigten Werte anzeigen, wenn man bei allen genutzten RC-Kanälen am Sender langsam durch die Anschläge läuft und auf die Mittelstellungen wieder zurück geht. Diese Min, Mid und Max Werte können dann, wie in Referenz 1 beschrieben, eingetragen werden.
Multiswitch
Auch die Hysteresefunktion in der Multiswitch.ino für den Multiswitch Decoder, die zu leichtem zeitlichen Verzug bei der Funktionsaktivierung / Deaktivierung sorgt, sollte geprüft und über MSthreshold an die eigenen Notwendigkeiten angepasst werden. Die Werte für MS_threshold zur Definition der Schaltbänder kann man berechnen und eintragen, oder man aktiviert die Debug Funktion, schaltet alle 16 Kombinationen durch und legt die 17 Werte immer genau dazwischen. Nur einer der 4 Schaltkanäle des Multiswitches ist für unseren Strawap über weitere Hardware an einen I/O Port verschaltet. Daher ist in diesem Bereich des Sourcecodes einiges auskommentiert. Da die restlichen drei Schalter per Software intern die Geräuschfunktionen schalten ist dieser Code aktiv.
Sound
Die Sound.ino war ursprünglich die unter Referenz 2 verlinkte ESP32 RC Sound & Light Controller aus dem alles für unseren Amphibienpanzer nicht notwendige entfernt wurde. Die neu eingefügten Schnittstellen und Funktionen sind entsprechend kommentiert. Einstellungen sind in dieser Datei nicht notwendig, Lautstärken und Soundfileauswahl wird weiterhin über die eingebundenen Headerdateien gemacht.
RGB-LED
Für mich hat sich die RGB-LED Funktion im Betrieb des Modells als sehr nützlich gezeigt, da man jederzeit über den aktuellen Modus informiert bleibt. Über die LED.ino kann man eigentlich nur die Blinkfrequenz mit der Konstanten blinkmilles anpassen und mit den Farben für die einzelen Modi über die show_color Aufrufe spielen.
Wasseralarm Funktion
Zuletz noch der Link zur recht trivialen Auswertung des Feuchtesensorsignals in der Datei Watersensor.ino, die über eine 10-schleifige Hysteres einen Wassereinbruchalarm an die RGB-LED und den Soundgenerator meldet.
Bei Bedarf kann über Wthold die Hystereseschleifenanzahl angepasst werden.
Strawap Main-Loop
Die Steuerung der obigen Funktionen für das namengebende Amphibienmodell findet in der Strawap38MVF_ESP.ino statt und teilt die Funktionsaufrufe auf die beiden verfügbaren Prozessorkerne auf. Notwendig wäre das nicht, da der ESP32 mit diesem SW-Projekt komplett unterfordert ist.
Aus Gründen der Übersichtlichkeit habe ich die globalen Definitionen und Includes im Strawap38MVF_ESP.h zusammengeführt.
Hardware
Den Arduino kann man, wegen seiner I/O Logik, die 5 Volt Pegel toleriert, einfach an jede Fernsteuerung anbinden. Beim ESP32 mit 3,3 Volt Logik ist das bei alten 5 Volt Fernsteuerungen nicht so. Es reichen aber Spannungsteiler die den Pegel entsprechend anpassen. Bei mir arbeiten 2,2 KΩ zu 3,3 KΩ Wiederstände problemlos direkt im Anschlusskabel zwischen Signal und Masse verlötet. Die restlichen Komponenten unterstützen alle sowohl 3,3V als auch 5V Logik und konnten somit ohne Äderung übernommen werden.
Für die Antriebe habe ich zwei BTS7960 Dual-H-Brücken-Regler besorgt. Diese über PWM gesteuerten Regler haben genug Leistung mit 43 Ampere, sind sehr günstig zu bekommen und lassen sich beim Arduino über ein Library sehr einfach ansprechen. Da die PWM Steuerung des ESP32 deutlich flexibler umgesetzt ist als beim Arduino lässt sich diese BTS7960 Lib damit nicht weiter nutzen. Daher habe ich mir erlaubt, die Lib mit den zusätzlichen Funktionen der PWM-Kanal Definition und der PWM Frequenz anzupassen und als BTS7960ESP32 in mein Projekt einzubinden. Die PWM Frequenz sollte sowieso auf den genutzten Motor angepasst werden. Bei den gängigen kleinen Bürstenmotoren, die im Modellbau genutzt werden, ergibt eine Frequenzen von 1 bis 2 kHz meistens die beste Leistung. Leider erzeugt diese meistens aber auch ein unangenehmes Fiepen im Betrieb. Daher braucht es einen individuellen Kompromiss.
Die RGB-LED habe ich am Arduino über einen WS2811 angebunden und über die Library FastLED problemlos angesprochen. Beim ESP32 gibt es bekannte Probleme bei der Interrupt Steuerung im Zusammenhang mit dem interruptgetriebenen Einlesen der RC-Empfänger-Signale, da beides die RTM Funktionen des ESP32 dafür nutzen. Da ich nur eine RGB-LED nutzen wollte habe ich dies daher direkt mit entsprechenden Vorwiederständen über 3 I/O Ports angesprochen. Auf eine PWM Steuerung habe ich erstmal verzichtet, da mir die darstellbaren Mischfarben bei Vollansteuerung für den Strawap ausreichen.
Meine Multiswitchumsetzung hat einen Schalter weniger als der YaMS, auf dem sie basiert, da ich nicht mehr Schaltfunktionen brauchte, es auf Grund der alten RC-Systeme nicht auf die Spitze treiben wollte und so mit Widerstandswerten der E6 Reihe aus dem Fundus arbeiten konnte. Für den Encoder werden daher die folgenden Werte an den Schaltern des Senders Schaltern des Senders genutzt: 220Ω, 470Ω, 1KΩ und 2,2KΩ.
Download:  Strawap38MVF_ESP_V02_1.zip (430Kbyte)
Referenzierungen
Einlesen von RC-Empfänger Signalen über eine Interrupt Routine mit Arduino:
Read PWM, Decode RC Receiver Input, and Apply Fail-Safe © GPL3+ von kelvineyeoneEinlesen von RC-Empfänger Signalen über Interrupt Routinen mit ESP32 inklusive einer Geräusch und Lichtsteuerung:
ESP32 RC Sound & Light Controller von TheDIYGuy999RC Encoder und Arduino basierter Decoder eines Multi Switches:
Yet another Multi Switch - YaMS von Dirk WiedemannArduino-BTS7960 Funktionsbibliothek auf GitHub:
BTS7960Library von Luis Llamas