Translate

19 März 2013

Franzbox meets Arduino Teil 2

 Franzbox auf Arduino-Basis... ist das dann jetzt ein Pacco Francesco oder ein Franzuino?????

Ein kleiner Zwischenbericht:
Das Franzbox-Programm läuft ohne größere Probleme auch auf einem
Freeduino Serial v2.0- Board (......oder muss ich da jetzt Shield sagen......)
Natürlich ginge auch ein Arduino Uno, aber auf dem Freeduino ist der Chip gesteckt, beim Uno
SMD aber nicht, und weil ich den Bootloader eh nicht brauche und überschreiben würde, und weil
ich ausserdem demnächst mit dem Seriellen Port des Freeduino die Daten vom EMUS BMS
auswerten möchte, habe ich es gleich mal mit dem Freeduino getestet.
Lief auf Anhieb..... die ganzen Timer und Zeit-Geschichten mussten natürlich auf die vierfach
höhere Frequenz von 16MHz angepasst werden. (ich hätte auch den Quarz tauschen können ;-) )
Aber es soll ja mit jedem Arduino gehen, also doch 16MHz. Das geht schon!
Ich denke da ja ganz besonders an den Wattuino pro mini 5V 16MHz.....fertig aufgebaut 10Euro!
(da möchte ich aber den Quarz nicht tauschen müssen, ebenso beim UNO SMD )
Der Timer für die PWM der Tankazeige lief bisher mit Prescaler 1, das sind bei 4MHz 8kHz
der ist jetzt auf 8 eingestellt, das gibt jetzt eine PWM-Frequenz von 4kHz, das ist hier unkritisch,
da hier nur eine Spannung ausgegeben wird um die Tankuhr anzusteuern.
Der Timer für die Frequenzerzeugung für den Drehzahlmesser konnte von 64 auf 256
umgestellt werden, das sollte also unverändert laufen (habs noch nicht getestet)
und der Timer zum Erzeugen des Sekundentaktes war schon auf 1024, da war nichts
zu ändern, das musste in der Berechnung berücksichtigt werden. Aber da es sich
um den Faktor vier handelt war das nicht weiter tragisch.
Nur bei der Einstellung der Timeout-Zeit für Menue und Beleuchtung gab es ein Problem.
Das wird beim Timer-Interrupt eine Zahl heruntergezählt, und da reichten jetzt ein paar
Variablen nicht mehr aus und mussten von Byte auf Word geändert werden.
Das war einfacher als die ganzen Berechnungen anzupassen. Es scheint alles zu laufen.
Die Uhr braucht womöglich noch ein wenig Feinabstimmung. Da hier einiges im
Unterprogramm mit drin ist,  incl. AD-Wandlung und Berechnung der Stromwerte
sowie die Ansteuerung des Takt-Timers für den Drehzahlmesser passt die Umrechnung
in Sekunden nicht ganz perfekt zum berechneten Wert und muss leicht korrigiert werden.
Es war aber nicht möglich, hier mit einem Uhrenquarz zu arbeiten darum blieb nur dieser Weg.
Die Ungenauigkeit von ein paar Sekunden pro Tag ist aber hier völlig bedeutungslos.

Die Ausgänge für DZM und Tankuhr müssten sich auch mit einfachen Transistoren
(N-Mosfet nach GND) realisieren lassen. Da muss ich noch ein paar Versuche machen.
Hier sind ein paar Problemchen aufgetaucht, weil die Spannungen für einen älteren
VW Golf sowohl beim Drehzahlmesser als auch bei der Tankuhr nicht ganz reichen.
Das krieg ich aber auch noch hin. Hier gibt es einige Lösungsansätze,
auch ohne Redesign der Franzbox ist das zu machen, nur halt anders bestücken.
Die höhere Impulsspannung könnte durch Schalten einer Spule erzeugt werden,
und auf 12V Spannungshub statt 5V für die Tankuhr käme man, wenn die PWM
nicht vom Atmega direkt mit 5V käme, sondern aus dem im Layout schon vorgesehenen
TC4431, wenn an dieser Stelle nicht sogar schon ein einfacher Transistor reicht,
mit dem man das Gebersignal nach GND taktet. (das geht aber ganz sicher nicht
für "moderne" VW- Tankanzeigen ab dem Golf 4 etc.)
Mehr dazu aber ein andermal.





























Man sieht hier meinen 14poligen Stecker auf dem ich Display und Drehencoder
zusammengefasst habe und der bei mir zugleich als Programmierport dient.
Das ist entstanden, weil ich das Display beim STK500 direkt am 10-pol-Stecker
von PortB betreibe, (PortB.0 bis B.5 auf Pin 1-6 ;  Gnd und 5V auf Pin 9 und 10)
das habe ich hier einfach übernommen und an Pin 7 und 8 noch um je eine Leitung für
Reset und Beleuchtung ergänzt. Die vier Leitungen des Drehencoders kamen
später auch noch dazu auf Pin 11 bis 14. Diesen Stecker gibt es bei der "echten"
Franzbox zwei mal, einmal innen und einmal aussen, so dass man das Display + Encoder
auch mal wo anders hinbauen kann.....und weil da auch alle Pins des ICSP-Ports
drauf sind kann man hier auch die Box umprogrammieren.
Man braucht halt noch einen Adapter, aber das ist ja kein Problem.

Andererseits müsste es doch sogar möglich sein, Hex-Files mit dem Arduino-Bootloader
zu flashen. Ich habe da ein Programm gefunden das das angeblich kann:  Xloader
aber ich konnte es noch nicht testen, weil ich mal wieder an meinem alten WIN2000-PC
sitze und Xloader will Dotnet V4 installiert haben, und das geht hier nicht.....
Aber Arduino benutzt doch eigentlich auch das STK500-Protokoll, also muss doch Bascom
normalerweise ohne größere Probleme darauf zugreifen können ODER ETWA NICHT ?????
So was wäre aber eine feine Sache, wenn man damit BASCOM-Programme auf
einen Arduino laden könnte ohne einen ICSP-Programmer zu verwenden, der ja dann auch
den Bootloader des Arduino überschreibt. Der umgekehrte Weg, also Arduino-Hex
per ICSP ohne Bootloader auf Atmegas zu laden klappt ohne Probleme, also sollte
es so rum eigentlich auch funktionieren. Xloader nutzt auch nur die Funktionen von
AVRDUDE, aber mit dessen Kommandozeile kann ich mich nicht recht anfreunden.

Nachtrag 25.03.2013:
Es scheint so, dass es wirklich klappt, den Arduino-Bootloader zu nutzen.
Mehr dazu hier:
http://avrhelp.mcselec.com/arduino.htm
Ich habe es aber noch nicht selber versucht, es so zu machen wie es hier beschrieben ist.

Ich werde mir nicht die Mühe machen, das Programm vollständig auf Arduino zu übertragen.
Die Arduino-Umgebung ist gerade für PWM-Geschichten nicht ideal, weil man da ziemlich
tricksen muss um mit anderen Frequenzen und Prescalern zu arbeiten als vorgegeben.
Das ist schade, zumal das nicht an der Hardware liegt sondern am guten Willen der Entwickler
und an der Philosophie von Arduino überhaupt. Das Programmieren durch Weglassen
unnötiger Dinge zu vereinfachen ist ja lobenswert, aber wenn man dann für grundlegende Dinge
wie das Einstellen einer PWM-Frequenz oder die Verwendung eines anderen Quarzes
so richtig "von Hand" in irgendwelchen Registern herumschreiben muss um Sachen zu ändern
die in Bascom ganz nebenbei einzustellen sind, dann ist das doch ein wenig übers Ziel
hinausgeschossen! Aber egal, Arduino hat auch seine guten Seiten, vor allem da, wo man die
fertige Hardware nutzen kann, und bereits existierende Libs verwendet werden können.

Ich habe vor, demnächst diverse Files   HIER  zum Download anzubieten.
.......mal schaun ob das so klappt.....

Ich habe aber gerade so viel anderes am Hals, dass mir schlicht und einfach die Zeit und Lust
fehlt, jetzt auch noch ein paar Franzboxen zu bauen. Die Platinen als Prototypen fertigen zu
lassen ist ausserdem einfach zu teuer, (ca 30Euro pro Stück) wenns dafür auch schon fertige
Arduinos gibt, und deshalb werde ich das Programm soweit anpassen, dass es sich mit
handelsüblichen Arduinos und deren Clones verträgt, dann kann sie sich jeder bei
Bedarf selber basteln. Wie schon weiter oben erwähnt will ich als "Zentrale" am liebsten
den Wattuino pro mini verwenden, und da spricht bis jetzt noch nichts dagegen.
Als Display bleibt zunächst das EA DIP204 vorgesehen.
(das ist leider ein kleines bisschen anders als der Standard, da ist die Zeilenadresse anders,
deshalb klappt es nicht mit anderen Displays, aber die Anpassung im Programm ist
überhaupt kein Aufwand, wer also was anderes haben will mit 4 x 20 Zeichen aber HD44780
kompatiblem Controller, das ist machbar, und da denke ich gerade an die EA W204-XLG
Oled-Displays........und weil die Franzbox eigentlich auch mit 2x20 Zeichen auskommt,
die oberen Zeilen sind schon fürs BMS reserviert..... sollte einer zweizeiligen Version
auch nichts im Wege stehen. Aber ich muss das alles erst noch testen.

Wenn jemand noch einen Wunsch hat, bitte melden! vielleicht gehts ja noch einzubauen oder
anzupassen.Am BMS mache ich wohl so schnell nicht weiter, da versuche ich lieber, die Daten
aus dem EMUS BMS auszuwerten, das macht momentan aus meiner Sicht mehr Sinn.


Kommentare:

  1. Hallo! Ich hab mir so wie Bernd (Lazerus) einen 1er Golf in ein E-Auto umgebaut (in Zusammenarbeit mit der Firma Lorey, e-cabrio.blogspot.co.at.
    Nachdem ich das EV-Display V3 als Anzeige verwende, habe ich eine recht gute SoC-Anzeige. Auch alle anderen relevanten Werte wurden angezeigt.
    Dein Blog mit dem Arduino hat mich dann auf die Idee gebracht, die Ampere-Anzeige in Form von LEDs an den 5 unbenutzten Stellen im Golf-Armaturenbrett anzeigen zu lassen - dort wo Bernd seine "Tankanzeige" hat.
    Ich hab zwar absolut keine Vorerfahrung damit, habs trotzdem versucht und bin gescheitert.
    Das Programm von Arduino Uno funktioniert zwar mit dem Terminalprogramm, aber nicht mit der ev-display-Platine bzw. dem Mini-Usb-Anschluss darauf.
    Problem: ich hab den PC mit der Mini-Usb-Buchse vom ev1 verbunden: dieser sendet die Daten mit 38400baud an das Terminalprogramm des PCs als String mit 45 Zeichen. Zeichen 25-28 sind die momentan gezogenen Ampere.
    Wenn ich das Arduino-Board an den PC anschließe und mit dem Terminalprogramm den String eingebe, leuchten die LEDs wie vorgesehen auf.
    Aber wenn ich den Mini-Usb vom ev-display am Arduino anschließe, tut sich nichts.
    Das ev-display sendet jede Sekunde das 45-Zeichen-Datenpaket (ist am Blinken einer LED auf der Platine erkennbar). Da es nirgends ein Kabel gibt, das auf einer Seite einen Mini-Usb-Stecker und auf der anderen Seite einen USB Typ B stecker (Arduino Uno) hat, hab ich beide über eine USB-Kupplung verbunden. Das Funktioniert aber wie gesagt nicht. Kann man da ein Kabel basteln oder hast du eine Idee, wie man das Problem lösen kann? Ich wäre die sehr dankbar dafür!!!
    Was ich in deinem Artikel auch nicht verstehe: warum kann man die PWM-Ausgänge vom Arduino nicht für die Tankanzeige verwenden - das hätte ich nämlich auch vorgehabt? Lässt sich das nicht mit einer Transistorschaltung lösen? Danke im Voraus für die Antwort!

    AntwortenLöschen
  2. Hallo Averell,
    erst mal sorry wegen der etwas verspäteten Antwort. Ich war in den letzten Tagen mit
    vollkommen anderen Sachen beschäftigt....

    Dass die beiden keine Verbindung aufbauen liegt in der Natur des USB-Anschlusses.
    Wenn man ein USB-Gerät am PC anschliesst, dann ist der PC der "MASTER" und das
    USB-Gerät (Slave) gaukelt ihm eine serielle Schnittstelle vor.
    Slave zu Slave das klappt nicht.
    Du musst also den USB komplett umgehen sonst wird das nichts.

    Wenn der Weg nicht zu weit ist und alles auf dem selben GND liegt und auch die
    Spannungen passen dann kann man RXD und TXD der beiden Platinen direkt miteinander
    verbinden ("über Kreuz" RXD nach TXD, Abgriff noch vor dem USB-Baustein, beim Arduino
    ist das kein Problem, aber das EV-Display hatte ich noch nie in der Hand, also keine Ahnung )
    Ich versuche mal, an Infos zu kommen.

    Tankuhr:
    Beim Golf1 , Golf2 und bei älteren Golf3 (Tacho ab 20Km/h) kann man die Tankanzeige
    mehr oder weniger direkt per PWM ansteuern.
    Bei neueren Golf3 und allem was danach kommt klappt das allerdings nicht mehr so einfach.
    Wenn Du einen N-Mosfet nimmst kann der per Vorwiderstand direkt vom Arduino angesteuert werden.
    Der VW-Tankgeber hat um die 30 Ohm bei "Voll" und irgendwas in der Gegend von
    350 bis 400 Ohm bei "Leer" Wenn Du also die Leitung zur Tankanzeige mit 390 oder 470 Ohm
    nach GND ziehst sollte der Zeiger auf "Leer" stehen (ggfs Wert etwas anpassen)
    Wenn Du dann die Leitung über einen 27R Widerstand nach GND taktest hast Du fast den
    ganzen PWM-Bereich zur Verfügung. Das Ganze ist leider nicht so wirklich linear,
    daher solltest Du zumindest die Mitte einstellbar machen und die PWM für unter und über 50% SOC
    gesondert berechnen.


    AntwortenLöschen
  3. EV-Display V3 ........oh je...., da hast Du genau das unpassendste erwischt,
    um die seriellen Daten auf einem Arduino weiterzuverarbeiten.
    Die Version V4 hat einen galvanisch getrennten seriellen TTL-Pegel-Ausgang,
    das wäre, was Du da bräuchtest!
    Um die Version V3 mit einem Arduino oder dergleichen zu koppeln müsstest Du die
    seriellen Signale (bzw eigentlich ja nur das TXD-Signal) an der Verbindung vom
    Prozessor zum USB-Chip abgreifen. Idealerweise mit einem Optokoppler oder
    einem Isolator-Baustein (z.B. ADUM......)
    Die USB-Geschichte ist einzig und allein sinnvoll um einen PC oder ein Tablet
    daran anzuschliessen. Das ist zwar gut gemeint, aber nicht sehr praxistauglich.
    Ein serieller Ausgang wie dann bei V4 reinkonstruiert wurde ist da viel sinnvoller.
    Adapter von TTL-Seriell auf USB um einen PC da anzuschliessen gibts für
    kleines Geld fertig zu kaufen. (Zubehör z.B. für "mini-Arduinos" ohne USB etc.)
    Es wird also nicht ohne Löten/Basteln klappen.bzw Du rüstest um/auf auf die Version V4.
    Einen fertigen Adapter um USB-Slaves direkt auf seriell-TTL-Pegel umzusetzen wirst Du wohl nicht finden.Eventuell gibts sowas im Bereich Industrie/Maschinenanbindung, dann aber sicher nicht billig!

    Die miniatur-Arduinos bei denen der Prozessor auch den USB-Teil onboard hat (Arduino micro????)
    und die dann auch eine USB-Tastatur steuern/abfragen könnten hätten die nötige Hardware drauf,
    aber das wird dann schon eine andere Größenordnung was die Programmiererei anbelangt.

    Vielleicht bist Du ja in Sachen Raspberry-Programmierung bewandert......Das ginge auch!

    AntwortenLöschen
  4. Hallo Averell,
    eins habe ich ja vollkommen übersehen, da merkt man mal wieder,
    dass Arduino nicht "meine Welt" ist:

    Da wäre noch das Arduino USB Host shield! Wenn Du das zum Laufen bekommst dann löst das
    Dein Problem, obwohl das letztendlich ganz schön umständlich ist.
    Aus dem Prozessor des EV-Display kommt vermutlich schon genau das serielle TTL-Signal raus,
    das Du mit dem Arduino auswerten möchtest.

    Mit dem Usb-Host Shield würde aber erst mal das serielle Signal im EV-Display in USB-Daten umgewandelt, dann per USB übertragen, auf dem Host-Shield nach SPI umgesetzt und dann vom Arduino wieder so decodiert als obs serielle daten wären.........
    Machbar ist offenbar so manches! obs allerdings den Aufwand wert ist das sei dahingestellt.
    Aus dem EV-Display kommt ja auch ein 0-5V Spannungssignal, das eigentlich dafür gedacht wäre
    solche Displays anzusteuern. ein OP könnte die Tankanzeige ansteuern und ein kleines
    Balken-Display ist auch nicht allzuviel Aufwand.
    Für die Tankanzeige wird wohl eine Verstärkung von ca 2:1 nötig sein + Offset-Korrektur.
    Leer dürfte je nach Instrument bei etwa 5-8V liegen, voll irgendwo bei 2-3Volt auf der Geberleitung.

    Bei meiner Franzbox habe ich das Ampere-Signal noch entsprechend in eine Frequenz umgesetzt
    dass der Drehzahlmesser die Stromstärke anzeigt

    AntwortenLöschen
  5. Ach ja, und das EV-Display hat seinen GND am Fahrakku (Klar, die messen ja auch die Spannung)
    Das machts nicht einfacher! Eine "galvanische Trennung" ist also unvermeidbar, und die Übertragung des 0-5V-Spannungssignals zur Tankanzeige dürfte da schwierig werden.
    Das war auch der entscheidende Grund warum ich bei meiner "Franzbox"
    auf eine Messung der Fahrakku-Spannung bisher verzichtet habe.

    Gibt es irgendwelche Erkenntnisse, was für Signale denn eigentlich von der Steuerplatine
    zum Display des EV-Displays übertragen werden? da würden sich ja auch serielle Signale geradezu aufdrängen, ausser das Display versteht auch SPI.
    Ich vermute mal, dass es sich her um ein DMC-50448N-AAE-AD LCD handelt
    mir ist sonst kein so kleines handelsübliches 2*8-Display bekannt, aber das kann kein SPI.
    Ich habe ja keine Ahnung, was denn die "Konkurrenz" sich da für Gedanken gemacht hat ;-)
    Trotzdem ist es immer wieder interessant wie andere genau die gleichen Probleme lösen
    mit denen man schon selber gekämpft hat.
    Das mit "Konkurrenz" darf man aber jetzt nicht eng sehen, meine Franzbox war nie für eine
    Serie gedacht und ich werde auch keine Serie auflegen.
    Es hat sehr viel Spass gemacht, und ich hab auch viel dabei gelernt.
    Eine kommerzielle Fertigung war und ist nicht geplant.
    Das waren nur ein paar Geräte für spezielle Freunde und für meine Basteleien daheim.
    Ich habe auch kein fertiges Gerät mehr übrig, auch keine Platinen.Sorry
    Wer also dennoch eine möchte der wird sie wohl selber bauen müssen, mir fehlt die Zeit.
    Wenn jemand Unterlagen, Quellcodes und Platinendaten haben möchte,
    dann muss er halt bei mir Bescheid sagen.Ist alles kein Betriebsgeheimnis.

    AntwortenLöschen
  6. Danke Franz! War ja eine sehr ausführliche Analyse! Jetzt weiß ich jedenfalls, wie es nicht geht - das erspart mir eine Menge Probiererei!
    Ich habe auch den Hersteller von EV-Display kontaktiert - waren sehr schnell und bemüht zu helfen! Aber das hat auch nicht gefruchtet: die Anschlüss-Leiste am EV-Board hat 5V-TX-RX-GND Anschlüsse. Damit hab ich den Arduino verbunden. Der hat aber keine Daten empfangen. Liegt wahrscheinlich an der nicht vorhandenen galvanischen Trennung.
    Daher hab ich jetzt eine andere Lösung:
    Ich werde einen Stromwandler an eine der drei Motorkabel hängen und mit dem Arduino die Stromwerte an die LED-Leiste schicken. Ist ein unabhängiges System. Außerdem wird die tatsächlich gezogene Motorstromstärke gemessen und nicht die restlichen Verbraucher mit (was mir eigentlich lieber ist). Und ich brauche ja keine "Messung" - die hab ich eh. Es geht mir um eine optisch gut sichtbare Anzeige. Genauigkeit ist weniger wichtig.

    Für die Ansteuerung der Tankanzeige habe ich vor, es einmal wie in der Anleitung zum EV-Display V3 vorgeschlagenen Schaltung zu versuchen. Es gibt ja dafür einen eigenen Ausgang am EV-Display-Board. Aber erst wenns wieder wärmer wird (hab momentan keine freie Garage zum Basteln!
    Danke dir jedenfalls nochmal! - Averell

    AntwortenLöschen