Gang-, Tank- und Verbrauchsanzeige für mein Motorrad
Sonntag vor ein paar Monaten ging es mir mal wieder tierisch auf den Zeiger, dass die serienmäßige Tankuhr meiner Kawasaki ZX10 die ersten 100 Kilometer nach einem Tankstopp durchgängig "voll" zeigt, sich dann die nächsten 100 Kilometer langsam gen "leer" neigt, um dann am unteren Anschlag für weitere 120 Kilometer zu verweilen...

In dem Moment hab ich beschlossen, mir meine eigene, genaue Tankuhr zu basteln. Und wo ich schon einmal dabei war, hab ich gleich noch eine Ganganzeige (wie oft hab ich schon in den imaginären "7. Gang" geschaltet...) und eine Verbrauchsanzeige mit eingeplant.

Meine Wahl fiel auf die Arduino-Plattform, über die ich vor einiger Zeit etwas gelesen hatte, und es schien mir auf dieser Hardwarebasis ein in überschaubarer Zeit durchaus realisierbares Vorhaben zu sein.

Allerdings hatte ich zu der Zeit noch ein paar andere "Eisen im Feuer", und damit wurde das Thema erst einmal vertagt, ich beschäftigte mich aber in der darauffolgenden Zeit verstärkt mit dem Thema und bin seither auch im entsprechenden Forum aktiv.

Vor drei Wochen konnte ich dann günstig ein paar kräftige Schrittmotoren erstehen (für eine Eigenbau-CNC-Fräse, eines der anderen meiner Eisen), und im Zuge dessen fiel auch ein Arduino ab. Mit diesem fing ich dann nebenher an, auch die Anzeige anzugehen.

Mein aktueller Stand ist Rechts unten auf dieser Seite zu sehen.

Ich habe den Code so angelegt, dass er mit einem einfachen Script quasi automatische zum Java-Applet übersetzt werden kann; in der Form entwickle ich gerne meine Anwendungslogik, weil ich dafür gute IDEs habe. Genauso einfach läßt sich der Code anschließend wieder per Script für den Arduino zurückübersetzen.

Mein Entwurf sieht einen einzigen Knopf für die komplette Bedienung vor, das Applet kann äquivalent mit der Maus angeklickt werden. Das Programm kennt kurze Klicks (kürzer als 700ms aber länger als 25ms zwecks Debounce) sowie lange Klicks (länger als 700ms). Im Hauptmenü kann über kurze Klicks navigiert werden. Auf die entsprechenden Einstellungsseiten kommt man jeweils über lange Klicks.

11.08.10
Verbesserungen an der Software
Heute hab ich etwas Zeit gefunden den Code zu erweitern und zu verbessern. Unter Anderem wurden die für die Schrift zuständigen Funktionen komplett überarbeitet und vereinheitlicht, außerdem habe ich erstmals die DS1307-Echtzeituhr eingebunden.
23.10.10
Und es geht weiter...
Endlich mal wieder ein Update: In den letzten Tagen ist der Code auf fast 100kB angewachsen, compiliert etwa 28 Kilobyte. Und das RAM ist mittlerweile auch so gut wie am Ende.

Dafür bin ich mit der Logik jetzt soweit durch, die Eingangspins arbeiten mit Interrupts und verlieren keine Impulse mehr, die DS1307-Echtzeituhr ist sauber eingebunden, und erste Versuche mit Zugriffen auf ihren zusätzlichen nichtflüchtigen Speicher gibts auch schon.

Letzteres muss ich noch fertig machen, und vielleicht muss ich noch den ein oder anderen Debounce einbauen, aber das wird erst die Praxis zeigen.

Dummerweise befindet sich mein Motorrad seit Anfang des Monats im Winterschlaf, daher kann die Fertigstellung dieses Projekts noch etwas dauern...
08.11.10
Besser, schneller, schöner...
Eine neue Version mit einem zentralen Menü, die Uhr stoppt jetzt während der Umstellung, die Version benötigt weniger RAM, speichert die sich ständig ändernden Werte (Benzinfluss, gefahrene Strecke nach Tour, Tag und Tankstopp) im NVRam der Echtzeituhr, kann (fast schon) die tägliche Ungenauigkeit der Echtzeituhr korrigieren und noch einige Kleinigkeiten...
11.11.10
Noch ein kleines Update
Hab das Stoppen der Uhr bei der Umstellung wieder ausgebaut, dafür wird der Wochentag nun automatisch berechnet und die Möglichkeit zur Korrektur eines (linearen) Uhrenfehlers funktioniert. Zu bearbeitende Zahlen werden jetzt von links nach rechts durchlaufen.
16.11.10
So gut wie fertig...
  • 84x48 Pixel vollgrafisches Display
  • Per Drehzahl/Radumdrehungen berechnete Ganganzeige
  • 'Neutral' über Neutralsignalleitung
  • Große Uhr mit Datum und Wochentag
  • Balkentankfüllstandsanzeige
  • Zentrale Menüsteuerung
  • Automatische Tankstopperkennung
  • Tageskilometerzähler
  • Tourkilometerzähler
  • Tankstoppkilometerzähler
  • Kurz- und Langzeitbenzinverbrauchsmessung via Durchflussmesser
  • Kurz- und Langzeitrestdistanzberechnung
  • Geschwindigkeitsmessung
  • Drehzahlmessung
  • Auswahlmöglichkeit für vier von zwölf Werten auf der Hauptseite
  • Regelmäßige Sicherung von Verbrauch und gefahrenen Entfernungen
  • Möglichkeit zur Korrektur eines linearen Uhrenfehlers der DS1307 RTC
  • Automatische Sommer-/Winterzeitumschaltung
  • Optionaler "Kopfüber"-Einbau
  • Abschaltbarer Splashscreen
  • Steuerung komplett über einen einzigen Knopf
25.11.10
Am Limit...
Mittlerweile bin ich sowohl was das RAM angeht als auch bei der Sketchgröße voll am Limit meines in meinem Arduino Pro Mini verbauten ATmega328. Bei jeder meiner letzten Erweiterungen am Code waren anschließend größere Umbaumaßnahmen nötig, um Funktionen zu verschlanken und RAM freizugeben...

Neu dazugekommen ist:
  • Rücksetzbarer Gesamtkilometerzähler
  • Sechs statt vier Slots auf der Startseite
  • Kilometerzählerslots werden nur angezeigt, wenn ein im Slot davor konfigurierter Zähler einen anderen Wert zeigt
  • Es gibt jetzt auch die Slotoption "leer"
  • Auf den "Impuls/Sekunde"-Eingangsgraphen gibt es jetzt zusätzlich einen kleinen Millisekundengraphen samt Minimal- und Maximalwerte für den Fall dass vermutet wird, dass Impulse verloren gehen oder hardwareseitig vorgeschaltetes Debounce nötig ist
16.12.10
Physikalische Tankuhr...
Ich arbeite daran, eine gegebenenfalls physikalisch vorhandene Tankuhr mit einzubinden, so dass sie exakte Werte anzeigt.

Bestenfalls kann ich dann in diesen Fällen die digitale Tankuhr aus dem Display entfernen und damit Platz frei machen für weitere 6 Informations-"Slots"...
22.06.11
Die Unterstützung der physikalische Tankuhr nimmt Form an...
Mittlerweile wird zumindest in Java eine physikalische Tankuhr unterstützt; die Routine für den Arduino sollte jetzt nur noch Kleinkram sein.

Wo es allerdings haken kann ist mal wieder die Codegröße und der Speicherverbrauch, aber das muss ich mir noch ansehen.

Man kann in der neu hinzugekommenen Einstellungsseite zum Benzintank außer der Tankgröße (ist von der Einstellungsseite zu den Eingängen dorthin gewandert) auch das analoge Mapping einstellen, so dass bei einem leeren Tank die Tankuhr genau "E" zeigt sowie "F" bei einem vollen.
29.06.11
Alternative Echtzeituhr?
Aufgrund des Uhrenfehlers meiner DS1307-RTC habe ich mich im Internet mal nach Alternativen umgehört und bin dadurch auf den ChronoDot von macetech.com gekommen, die kleine Platine besitzt einen temperaturstabilisiern DS3231SN als Uhrenchip.

Nachdem das Ding dann endlich aus den USA kommend bei mir auf dem Tisch lag (die gibts wohl noch(?) nicht in Deutschland zu kaufen) konnte ich feststellen dass er fast Pin-kompatibel mit meinem DS1307 Breakout-Board ist, das ich von Watterott gekauft habe. Soweit so gut.

Leider stellte sich dann heraus dass der DS3231SN statt der zusätzlichen frei verfügbaren 54 Byte nichtflüchtigen Speichers (NV-SRAM), welche der DS1307 quasi als Abfallprodukt zur Verfügung stellt, zwei zusätzliche Alarmregister besitzt, zusammen mit den Uhrenregistern 13 adressierbare Bytes, die aber alle belegt sind.

In Ermangelung eines NVRAMs (ich konnte im Internet auch kein reines NVRAM-Breakout finden) ist der DS3231SN somit für mich leider keine Alternative.
27.07.11
Durchflussmesser-Erfahrungen...
Für den Fall dass jemand mal über das gleiche Problem stolpert:

Heute habe ich den ersten Praxistest mit dem Durchflussmesser "FCH-m-POM-LC 6mm" von Conrad Electronic durchgeführt, diesmal mit ins Motorrad eingebautem Durchflussmesser und im Stand laufendem Motor.
(Ich weiß nicht ob die Pumpe bei meinem Motorrad schubweise stark oder gleichbleibend leicht fördert, daher hab ich die Reduzierdüse aus dem Durchflussmesser gezogen um einen größeren Messbereich abdecken zu können.)

Zuerst hab ich den Arduino angeworfen (noch über ein USB-Netzteil an der 230V-Steckdose in der Garage), die entsprechende Diagnoseseite im Menü aufgerufen, das Motorrad gestartet, die Anzeige überwacht und in Ermangelung eines Speichermediums mit dem Fotohandy protokolliert.


Die ersten paar Sekunden sahen soweit ungefähr aus wie erwartet, zuerst kam ein kurzer Peak in dem die Benzinpumpe den Druck in den Schwimmerkammern aufgebaut hat und anschließend ein gleichbleibender schwacher Durchfluss, mit dem der Druck aufrechterhalten wurde, der zwar etwas über dem erwarteten Wert aber noch im akzeptablem Rahmen lag.

Dann gings plötzlich los, riesen Anstieg in der Förderleistung, WEIT über das erwartete Maß hinaus.




Das Ganze ging so weit rauf bis der Durchflussmesser unglaubliche 54 Impulse pro Sekunde vermeldete, was einer theoretischen Förderleistung von ungefähr 77 Litern pro Stunde entspräche, entgegen der berechneten 4,4 Liter pro Stunde bei zügiger Landstraßenfahrt.

Außerdem fing das Bike an stärker in der Drehzahl nachzulassen und begann zu rauchen.

Reaktion: PANIK!!!


Daraufhin hab ich mich mit der Taschenlampe bewaffnet schleunigst unters Bike geworfen und nach Flüssigkeit gesucht, Lecks, vergessene Schläuche, irgendwas. Hab aber nix gefunden.

Also erstmal alles ausgemacht, abgebaut, in mein Arbeitszimmer verzogen und alles nochmal überprüft.

Hatte dann die Erleuchtung: Bei meiner letzten Fahrt war ich zum Schluß schon auf Reserve unterwegs (das ist beim Motorrad eine spezielle Stellung des Benzinhahns, die Zugang zu nochmal etwa vier zusätzlichen Litern erlaubt wenn der "normale" Tank schon leer ist), beim Abbau des Tanks zum Einbau des Durchflussmessers hatte ich den Benzinhahn auf "Off" gestellt und nach dem Wiederzusammenbau auf das normale "On", wodurch kein Benzin mehr verfügbar war.

Dadurch konnte die Pumpe nichts wirklich fördern sondern statt dessen nur noch etwas Benzin im Durchflussmesser hin und her bewegen, was wohl den Messpropeller über dem Abnehmer nur hin und her bewegt hat, was dann zu der krassen Sensormeldung geführt hat.


Zusammenfassend muss also bei der Benutzung eines digitalen Durchflussmessers an einer Pumpe (zumindest im Fall dass der Sensor auf der Pumpenabgewandten Seite angebracht wurde) auf jeden Fall auch bedacht werden, dass ein leerer Tank nicht automatisch zwingend eine gemeldete Fördermenge von "0" bedingt, sondern dass auch völlig abwegige Ergebnisse in die andere Richtung möglich sind!

Das Rauchen kam übrigens von etwas Öl auf den Krümmern.
05.08.11
Das Projekt wird erstmal auf Eis gelegt...
Im Hinblick auf kommende HUDs wie Googles Projekt Glass lege ich das Projekt in seiner aktuellen Form erstmal auf Eis und experimentiere mit CAN, OBD2, ELM327 und solchen Sachen...

Das "Endziel" ist, dass sämtliche relevanten Fahrzeugdaten über eine entweder aufgesetzten oder in den Motorradhelm integrierten Datenbrille und damit in der direkten Sicht des Fahrers auftauchen, also Geschwindigkeit und Drehzahl, aber auch Dinge wie der aktuell eingelegte Gang (oder Leerlauf), Blinker, Öldruck, Tankfüllstand etc., und somit der Blick nicht mehr zum Cockpit gesenkt werden muss. Für mich ein definitiver Sicherheitszugewinn.

CAN deshalb, weil es, zumindest bei Autos, ein anerkannter und weit verbreiteter Standard und quasi in jedem neueren Fahrzeug verbaut ist. Dadurch könnte man das System dann auch, ohne Anpassungen vornehmen zu müssen, im Auto einsetzen, was die Benutzerkreis um ein vielfaches verbreitert.

Ich bastle grade an einem Adapter aus einem Arduino Pro Mini und einem Bluetooth-Modul, welcher dann auf der einen Seite eine Ladung Kabel haben wird, die im Motorrad an die entsprechenden Stecker des Cockpits angeschlossen werden und über Bluetooth via RFCOMM einen ELM327 emuliert, welcher CAN spricht.

05.06.12
Aktueller Stand
Sourcecode