Eine Ganganzeige selbst bauen, Teil 1, Hardware
Die folgenden Kapitel sollen eine Hilfestellung für alle Bastler geben die selbst eine Ganganzeige aufbauen
möchten. Der erste Teil hat den Fokus auf der HW.
Beispiele von Versuchsplatinen aus frühen Entwicklungsphasen:
Das generelle Prinzip der Gangerkennung
Der aktuell eingelegte Gang bestimmt die Gesamtübersetzung zwischen Motor-Drehzahl und Rad-Drehzahl
(=Geschwindigkeit). Umgekehrt, wenn man diese beiden Drehzahlen kennt dann kann man daraus den Gang bestimmen.
Genau das macht eine Ganganzeige.
Es gibt auch Getriebevarianten in denen ein Gangschalter verbaut ist der direkt die jeweilige Gangposition
signalisiert. Dessen Auswertung ist trivial und wird hier nicht betrachtet.
Testumgebung
Ein unentbehrliches Hilfsmittel bei der Entwicklung einer Ganganzeige ist ein
Testgenerator.
Er emuliert eine Motorrad-Elektronik und liefert definierte und bekannte Geschwindigkeits- und Drehzahlsignale. Der hier verlinkte Generator ist speziell für diesen Zweck ausgelegt. Er basiert auf einem Arduino-NANO Board.
HW und SW Auswahl
Eine elektronische Ganganzeige selbst zu programmieren ist heutzutage kein grosses Problem mehr. Es gibt eine
breite Auswahl von sehr leistungsfähigen Mikroprozessoren und dazu komfortable Programmierumgebungen.
Zeitkritische Programmteile sind praktisch nicht mehr vorhanden weil die Clock-Frequenzen und Rechenleistungen
extrem angestiegen sind. Als Beispiel: ein ATmega128 (guter Stand der Technik vor 15 Jahren) hat eine
typische Clock-Frequenz von 8MHz. Ein heute üblicher ESP32 arbeitet mit 240MHz.
Man muss kein Assembler-Freak (mehr) sein um damit ein reaktionsschnelles System aufzubauen.
Die sonstige, notwendige Hardware ist aber eine ganz andere Geschichte mit einer einfachen Antwort: Es gibt nichts
passendes! Am besten man baut sich die Elektronik selbst.
Neben einem Prozessor(-Modul?) sind zusätzlich noch die folgenden Funktionsgruppen notwendig:
- Gehäuse oder Befestigung
- Stromversorgung
- Display und Tasten
- Elektronische Signalaufbereitung für Drehzahl und Geschwindigkeit
Für den Anfang sind die üblichen Compute-Module (Arduino, ESP32, etc) eine gute Wahl. Sie benötigen aber
mindestens eine spezielle Interface-Platine. Die Stromversorgung solcher Module ist nicht für die typischen
Störsignale im automotive Einsatz ausgelegt und alles würde nach kurzer Zeit versagen. Ebenso müssen die
Signaleingänge geschützt und die Pegel angepasst werden.
Die nächsten zu klärenden Fragen sind:
- Welchen Prozessor verwende ich als Basis?
- Wie realisiere ich die Zusatzelektronik?
- Wo und wie kann die Elektronik (am Motorrad) verbaut werden?
- Wo sollen Display und Taster verbaut werden?
Für alle die am liebsten sofort mit dem Programmieren beginnen möchten sind diese Punkte natürlich super lästig.
Aber leider direkt entscheidend ob das Projekt am Ende am Motorrad funktioniert.
Vom populären Raspberry Pi würde ich abraten. Er benötigt ein fehlerfreies Dateisystem auf einer SD-Karte.
Genau das ist gefährdet durch plötzliche Spannungsausfälle die am Motorrad sehr leicht auftreten können. Ein
Read-Only Mode des Betriebssystems wäre möglicherweise eine Lösung.
Weiterhin kann der enorm hohe Peak-Strombedarf ein Problem werden und die Spannung einbrechen lassen. Der
Strombedarf ist eine direkte Folge der für diesen Einsatzzweck absurd überzogenen Rechenleistung.
Digitale Signalbusse
Alle modernen Motorräder verwenden digitale Busse zur internen Signalübertragung. Das bedeutet dass die Drehzahl- und Geschwindigkeitssignale nicht mehr "wie früher" direkt als Analogsignale zur Verfügung stehen. Oft handelt es sich um einen CAN- oder K-Line-Bus der auch an einem Diagnose-Connector zur Verfügung. Manchmal ist es aber auch
ein proprietärer, interner Bus der nur Daten von der ECU zum Cockpit schiebt.
In diesem Fall hat man 2 Optionen um an die Signaldaten zu kommen:
- Die digitalen Signale dekodieren
- Direkt die Sensoren anzapfen und auswerten
Eine Dekodierung der Digitalsignale ist vom Konzept her sehr elegant und umgeht viele Probleme der analogen Signalfilterung. Und den nachfolgenden SW-Algorithmen ist es ziemlich egal wie die Daten beschafft wurden. Leider gibt es dabei einige Hürden:
- Man benötigt spezielle Interface-Bausteine um den Bus anzuzapfen
- Die SW-Protokolle sind nur für die offiziellen OBD2 Übertragungsmodi bekannt und öffentlich. Alle anderen sind unbekannt und bei jedem Motorradtyp anders.
Alternativ kann man direkt die Sensoren anzapfen und auswerten. Für das Drehzahlsignal klappt das gut weil jeder Motor einen Kurbelwellensensor besitzt, teilweise auch noch einen Nockenwellensensor.
Ein Geber für das Geschwindigkeitssignal ist häufig nicht mehr separat vorhanden weil die Informationen durch das obligatorische ABS sowieso schon vorhanden sind. Das ABS ist aber ein sensibles Bauteil für die Verkehrssicherheit und das Anzapfen keine triviale Sache.
Welcher Weg der beste ist hängt stark vom Motorradtyp ab. Und natürlich von den eigenen Fähigkeiten und Präferenzen.
Senorsignale vorbereiten
Bei meinen Ganganzeigen werte ich immer nur die Sensorsignale aus, keinen digitalen Bus. Diese Entscheidung hat
historische Gründe. Zu Beginn meiner Aktivitäten (~2004) wurden digitale Busse nur sehr selten eingesetzt. Alle
Signale waren schön und sauber im Cockpit verfügbar.
Die Auslegung der Elektronik hängt von den zu erwartenden Signalen ab. Die Signalhöhe muss an das
Pegelniveau des Prozessor angepasst werden und die Frequenzfilter auf den zu erwartenden Bereich zugeschnitten
werden. Das folgende Bild zeigt beispielhaft die Drehzahl- und Geschwindigkeitssignale im Cockpit einer Yamaha
FZS1000. Beide Signale sind sehr typisch und ähnlich bei den meisten Motorrädern zu finden.
Das Drehzahlsignal (obere Kurve) hat eine Amplitude von 0 .. 12V. Die Motorelektronik erzeugt 2 Impulse pro
Umdrehung der Kurbelwelle. Mit einem nutzbaren Drehzahlband von 1000 .. 12000 U/Min ergibt sich ein Frequenbereich von
33 .. 400 Hz.
Das Geschwindigkeitssignal (untere Kurve) hat eine Amplitude von 0 .. 5V. Der zugehörige Geber erzeugt
40 Impulse/Meter
Mit einem nutzbaren Geschwindigkeitsbereich von 0 .. 250 km/h ergibt sich ein Frequenbereich von
0 .. 2800 Hz.
Wen man diese Werte zur Sicherheit noch grosszügig etwas aufrundent dann muss die Elektronik in der Lage sein
Signale mit einer Frequenz von bis zu 3500 Hz und Amplituden von 0.. 12V zu verarbeiten.
Ein wenig komplizierter wird die Sache wenn man direkt den Kurbelwellensensor anzapfen muss. Das Drehzahlsignal
ist dann nicht schon durch die ECU vorverarbeitet und aufgehübscht. Als Beispiel die Signale einer Yamaha FZ1:
Das Signal spiegelt die Anzahl der Signalzähne (24 Zähne pro Umdrehung, = 400Hz pro 1000U/min) und ist
um den Faktor 12 höher als im vorherigen Beispiel: 400 .. 4800 Hz .
Wesentlich lästiger ist dabei die Synchronisationslücke (zwingend notwendig für den Zündungzeitpunkt, wird durch
Weglassen der Zähne 23 und 24 erzeugt). Das Signal hat dadurch 2 Frequenzanteile was die Auswertung
erheblich verkompliziert.
Ein weiterer erschwerender Punkt ist die Signalamplitude. Das Signal im Beispiel liegt symmetrisch zum Massebezug und
geht auch ins Negative. Zusätzlich wächst der Peak-Peak-Wert mit der Drehzahl (ca 10 .. 25V). Der Innenwiderstand
ist relativ hoch und man muss die "Anzapfung" entsprechend hochohmig auslegen (40k Ohm oder so?).
Eingangsschutzbeschaltung
Eine geignete Schutz- und Filterbeschaltung für die Prozessoreingänge ist z.B. die folgende:
Als Sensorsignal (V1) wird ein 5V Rechteck angenommen. Die Amplitude wird durch R1/R2 leicht verringert und durch
D1 auf ~5V begrenzt. C1 erzeugt einen Tiefpass mit einer Eckfrequenz von ~15kHz. R1 verhindert hohe Ströme.
Sein Wert ist so gewählt dass der Signaleingang nicht zu hochohmig und dadurch überempfindlich gegen
gestrahlte Einstreuungen wird. Gleichzeitig soll das Sensorsignal nicht zu stark belastet werden.
Stromversorgung
Eine saubere Stromversorgung ist essentiell damit die Elektronik störungsfrei laufen kann. Die 12V-Bordspannung eines
Motorrads ist hochgradig "verseucht" mit allem was man sich denken kann (Spannungsspitzen, -Einbrüche, Störsignale in allen
Frequenzbereichen, kurzzeitige Umpolungen, Masse-Offsets, etc). Sowas führt sehr leicht zu einem Prozessor-Reset
oder zur Zerstörung. Für Automobile, als Beispiel, muss man eine Filterkaskade
ähnlich der folgenden Schaltung vorsehen um alle Testanforderungen zu erfüllen (links Eingang, rechts Ausgang):
Diesen Aufwand muss man für eine DIY-Schaltung natürlich nicht unbedingt treiben. Hier sind 2 Entwürfe die für
"normale" Ansprüche gut funktionieren:
Die Schaltung basiert auf einem "good old" LM317. Die beiden dicken ELKOs am Eingang sorgen für eine extrem gute Filterung.
Der 47R-Widerstand "verbrät" den Grossteil der unvermeidbaren Verlustleistung die in jedem Design mit linearen Spannungsreglern
auftreten. Ein LM317 benötigt eine Eingangsspannung die ca 3V oberhalb der Ausgangsspannung liegt. Bei 100mA Strombelastung
passt das alles sehr gut zusammen.
Dieser Entwurf verwendet einen speziellen Automotive-Linearregler mit fix eingestellter Spannung. Seine Low-Dropout-Eigenschaft
wird hier nicht wirklich benötigt, schadet aber auch nicht. Die Eingangsspannung läuft zuerst durch eine Verpolschutz-Diode.
Die wird nicht für "Trunkenheit beim Einbau" benötigt sondern gegen eventuelle kurzzeitige lokale Umpolungen der Bordspannung.
Es gibt Motorräder mit unglücklicher Masseführung wo so etwas durchaus auftreten kann. Der 47R ist aufgesplittet um extreme
Hitzeentwicklung des Bauteils zu vermeiden (sehr kleine SMD Bauteile). Der 18V-Varistor ist möglicherweise überflüssig, die
eingesetzten 1u-SMD-Kondensatoren sind aber nur bis 25V gerated.
Beide Entwürfe sind für Peak ca 100mA@3V/5V ausgelegt. Sobald man leistungsfähige Compute-Module einsetzt (oder sogar
einen Raspberry Pi) wird das bei weitem nicht mehr ausreichen. Insbesondere wegen der Verlustleistunge wäre in
diesem Fall ein Entwurf mit einem Schaltnetzteil angeraten.
Anzeigen der Werte
Für die Anzeige hat man die Qual der Wahl. Und man muss vorab entscheiden ob man die Gelegenheit nutzen möchte
um auch direkt noch andere Parameter anzuzeigen (z.B Temperatur, Bordspannung, ect.). In diesem Fall reicht eine
simple, einstellige Ziffernanzeige nicht mehr aus und man sollte auf eine Grafik-Anzeige überwechseln.
Am einfachsten umzusetzen ist die Ansteuerung eines
7-Segment LED-Displays.
Diese können direkt durch die Ports jedes Mikroprozessors angesteuert werden und benötigen nur minimale Aufwände
in der Software.
Eine Stufe schwieriger sind sog. "statische LCDs", z.B. ein
DE 112 RS.
Schwieriger deshalb weil sie eine permanente Wechselspannung an den Segmenten erfordern. Dafür bieten sie einen
hervorragenden Kontrast und sind deshalb eine gute Wahl bei starker Sonneneinstrahlung. Single-Digit Varianten
sind praktisch vom Markt verschwunden und sehr schwer zu finden, deshalb hier ein 2-stelliges Beispiel.
Am schwierigsten und aufwändigsten sind LCD-Grafik-Displays. Je nach Ausführung benötigen sie in Einzelfällen
sogar eine lästige, zusätzliche Hochspannung für das LCD. Am Prozessor ist ein passendes Bus-Interface
notwendig (SPI, I2C, ..). In der Software benötigt man umfangreiche Bibliotheken und Schriftsätze.
Als grossen Vorteil bieten sie dafür aber alle Freiheiten bei der Darstellung. Selbst Animationen sind kein
Problem und die schnöde Ganganzeige kann ein echter "Hingucker" werden.
Vereinfachen kann man das alles durch Verwendung von Displays aus (alten) Mobiltelefonen. Sehr verbreitet sind
die Module aus Nokia-Telefonen. z.B. ein
Nokia 1202 Display.
Es existieren umfangreiche, freie Bibliotheken für sehr viele Modelle. Trotzdem bleibt die Integration in eigene
Projekte eine grosse Aufgabe.
LCD Character Textmodule sind ein Mittelding. Sie können mehrzeilige Texte darstellen. Allerdings ist
die optische Erscheinung nicht jedermanns Sache und hat eher den Charme einer Steuerungsanzeige aus dem
hintersten Keller eines Kernkraftwerks aus den 70er Jahren ..