Haibike Yamaha: Reverse-Engineering

Diskutiere Yamaha: Reverse-Engineering im Yamaha Forum im Bereich Fertig-Pedelecs; Hallo, nachdem ich zusammen mit dem Nutzer @hErMeS den Yamaha Thread mit dem Akku-protokoll vollgequatscht hatte, haben wir uns über die...
gamerpaddy

gamerpaddy

Mitglied seit
12.07.2015
Beiträge
194
Ort
Mannheim
Details E-Antrieb
Yamaha PW
Hallo, nachdem ich zusammen mit dem Nutzer @hErMeS den Yamaha Thread mit dem Akku-protokoll vollgequatscht hatte, haben wir uns über die Unterhaltungsfuntkion ausgetauscht.

Nun, erste teilerfolge beim Akku, erste werte konnte ich auslesen.

In diesem thread werde ich informationen über die Kommunikation zwischen Drive Unit und Akku, und Drive Unit und Display verbreiten, damit man endlich anfangen kann, selbst Akkus, Logger oder Displays dafür zu bauen.

Eine anfrage an Yamaha Motors bzg. Dokumente / Informationen über die Protokolle ergab noch nichts, bis die EMail in Japan ankommt, dauerts wohl noch ein paar Wochen. :D


Alle Tests erfolgen ohne das Auseinanderbauen der Komponenten. In diesen Tests wurden keine Yamahas Gequält oder Verletzt. Lediglich die frei zugänglichen Pins werden großzügig abgehört.


Akku:
Der Akku kostet mit 400Wh neu rund 600€, was es bei den aktuellen Li-Ion Preisen (1000Wh, ~350€) natürlich umso schmackhafter macht, ihn nachzubauen.

Der Stand beim identifizieren der Signale ist überraschend weit, weiter als ich gedacht hatte.
Der Akku kommuniziert über eine Asynchrone Serielle datenverbindung, dabei setzt die Drive Unit den Signal pin auf 5V, und der Akku zieht ihn wieder auf GND während er das Signal sendet.

Die Serielle verbindung besteht aus 8 bit zeichen, "Even parity bit" und 1 Stop bit. Baud-rate ist 2400.
Oder für die Arduino freunde:
Code:
 Serial.begin(2400,SERIAL_8E1);
Fakten:
-Der Akku sendet daten an die Drive Unit
-Die Drive Unit sendet keine Daten an den Akku
---Fehler werden nicht an den Akku übertragen (getestet mit ERR 15, CLK pin am display getrennt)
---Der Status vom Licht, Unterstützungsmodus (eco, norm. high) werden ebenfalls nicht übertragen.
-Der Akku sendet jede 160ms ein 19 Bytes datenpaket, bestehend aus je 8 bit zeichen.

Der Pinout ist wie folgt:

!!!! Achtung, selbst bei abgeklemmten Akku ist restspannung am DriveUnit V+ pin vorhanden.
Einer meiner Serialports hat es beim Abrutschen gegrillt, ergebniss siehe hier: http://www2.pic-upload.de/img/30106510/CIMG5904.jpg !!!! Zum glück gehen die andern 3 noch. War wohl keine sehr große ladung gespeichert.


Die Signalspannung ist 5V, wobei Signal auf GND gezogen werden muss beim Senden.
Ähnlich diesem aufbaus:


Die Akkuspannung verläuft wie bekanntlich nicht Linear.
Gemessen hatte ich:
100% = 41.0V,
80% 38.9V,
30% = 35.3V
(+- 0.5V, da billigmultimeter)

Bisherige erfolge:
Daten teilweise entziffert.

Die 19 Bytes sind wie folgt aufgebaut:
Code:
B1   - 255 / Unbekannt / fixed
B2   - 255 / Unbekannt / fixed
B3   - 14 / Unbekannt / fixed
B4   - 6 / Unbekannt / fixed
B5   - 0-100 / Akkuspannug in % / dynamic
B6   - 25 / Unbekannt / fixed
B7   - 1 / Unbekannt / fixed
B8   - 110-169 / Unbekannt/ teil dynamic
B9  - 2-3 / Unbekannt / teil dynamic
B10 - 22-199 / Unbekannt, könnte mit B10 zusammenhängen* / dynamic
B11 - 42 / Unbekannt / fixed
B12 - 248 / Unbekannt / fixed
B13 - 1 / Unbekannt / fixed
B14 - 24 / Unbekannt / fixed
B15 - 17 / Unbekannt / fixed
B16 - 192-240 / Unbekannt / teil dynamic
B17 - 0-6 / Unbekannt** / dynamic
B18 - 0-255 / unbekannt** / dynamic
B19 - 0-255 / unbekannt** dynamic
Erklärung:
fixed = wert blieb in allen messungen gleich
dynamic = wert änderte sich während der messung
teil dynamic = wert bleib während messung gleich, aber war manchmal anders als die anderen messungen.
* = B9 und B10 könnten für die Temparatur zuständig sein.
** = B17 bis B19 könnten zusammenhängen. Leistungsentnahme?


Hier die rohdaten mit kommentaren:
http://pastebin.com/MWVe76nf

Code um rohdaten auszulesen (funktioniert mit Arduino Mega2560 & fakes):
http://pastebin.com/B43eY5W8
(Gnd an Gnd, Pin RX2 an Signalpin, dann Akku einhängen, serial monitor starten und bike einschalten.)



DISPLAY:
Der Aktuelle stand beim Display ist nicht so gut.
Ich vermute I2C, da es eine data und eine clk verbindung gibt.
Eine anfrage bei einem Hersteller der dies schon entschlüsselt hat, war erfolglos.
den hersteller nenne ich hier nicht, da er dinge vertreibt die gegen die boardregeln verstoßen.

Die Pinbelegung sieht wie folgt aus (ansicht von vorne):

Versorgungsspannung 12V, Signalspannung ~3.3V (muss noch bestätigt werden)
Die kommunikation erfolgt in beide richtungen, sofern dass display nicht antwortet, geht nichts.

Bisherige erfolge & versuche:
Keine. Ich muss erst einen Adapter bauen, um das Display im betrieb auslesen zu können. Nur den Displayslot angreifen bringt kein brauchbares ergebniss.






Sobald ich mehr erkenntnisse darüber habe, werde ich euch Informieren.
Die ergebnisse beziehen sich hauptsächlich auf die Haibike's mit Yamaha antrieb (der alte ohne wireless display / knöpfe) Könnte aber auch bei dem neueren funktionieren.


Bitte den Thread nur mit Hilfreichen antworten füllen, da die Bearbeitungsfunktion nur eine Stunde lang gilt, möchte ich nicht, dass man zig Seiten für ein Update durchblättern muss.
Wäre dies kein problem, wäre ich über eine Diskussionsrunde erfreut.

Bei Fragen steh ich gern zur verfügung.

Danke für's lesen
 
H

hErMeS

Meine Vermutungen nach anschauen der Graphen:

Byte17: entnommene Leistung oder Stromstärke
Byte10: könnte die Batteriespannung seien. Schneller Abfall, lansgamer Wiederaufbau
Byte8: sieht nach Temperatur im Batteriegehäuse aus. Steigt bei Spannungsabfall/Stromentnahme an.

Wie war der Akkustand bei dem fahrenden Log?

Edit:
Könnte das Byte 18 und 19 von einem Beschleunigungssensor stammen?
 
Zuletzt bearbeitet von einem Moderator:
gamerpaddy

gamerpaddy

Mitglied seit
12.07.2015
Beiträge
194
Ort
Mannheim
Details E-Antrieb
Yamaha PW
Der Akkustand steht in Byte 5, dieser stimmt mit der anzeige 1:1 überein.
Das mit dem Beschleunigungssensor ist eine interessante idee. Kommt aber nicht hin.
Die werte ändern sich auch im Stand wenn man leistung entnimmt. (pedal tretten oder schiebehilfe drücken)

Ich hab mal fix die daten unserer unterhaltung visualisiert.
4 Datensätze, getrennt.
1 - 26% akku
2 - 100% akku
3 - 58..57% akku
4 - 57% (10 min nach datensatz 3)

http://dgs.square7.ch/conv.php?file=data2.log&alt=akku&val=5

?file=data2.log sind die daten aus unserer unterhaltung. ?file=data.log sind die während dem fahren.
&alt=akku kann ignoriert werden. ist nur n kommentar im bild.
&val=5 ist der zu lesende Byte geht von 1 bis 19.
 
Zuletzt bearbeitet:
H

hErMeS

Könnten die beiden letzten Diagramme eventuell in der Mitte des akkupacks seien zu beiden Enden gemessen (Spannung) seien?

Ein Wert scheint positiv und der andere negativ zu seien.
 
T

Tobi_36

Hab mir ebenfalls mal die geposteten Daten angesehen.

Auch Byte 16 scheint neben Byte 5 den Ladezustand wiederzugeben denn:
Ladestand 100% --> 240 dezimal --> 1111 0000 binär
Ladestand 51% --> 224 dezimal --> 1110 0000 binär
Ladestand 50% --> 192 dezimal --> 1100 0000 binär

Sieht so aus, als würden die höherwertigen Bits den Zustand der LED's am Akku repräsentieren.
Bit 7: LED "F"
Bit 6: LED
Bit 5: LED
Bit 4: LED "E"
Bit 3: ?
Bit 2: ?
Bit 1: ?
Bit 0: ?
Ergänzung:
zu Byte 19:
Ich vermute, dass es sich hier um ein CRC-Byte handelt. Wie dies berechnet wird, hab' ich allerdings bislang nicht rausgefunden, bleibe aber dran...
 
H

hErMeS

Hi Tobi.

Vermute dass das kein CRC Byte ist. Addierst du 18 und 19 kommst du fast deckungsgleich auf das Byte 10 bis auf die extremen ausweicher.
 
gamerpaddy

gamerpaddy

Mitglied seit
12.07.2015
Beiträge
194
Ort
Mannheim
Details E-Antrieb
Yamaha PW
Danke @Tobi_36 für die idee, das könnte hinkommen. Nur die antwort, wieso der Akku den Akkustand in % und 4bit (balken) senden sollte, bleibt mir unbegründet. Es sei denn, die Ladestandanzeige auf dem Akku ist sepperat vom Balancer.

Byte 18 und 19 verändern sich, sobalt last anfällt. bei sehr geringer last (schiebemodus stufe 1) bleibt byte 17 auf 0.
Doch der wert auf Byte 17 ändert sich, selbst bei gleicher last.
Siehe:
http://dgs.square7.ch/conv.php?file=data2.log&alt=akku&val=17
Dort bin ich im Stand ein paar mal auf 100% gegangen, max wert: 7.

http://dgs.square7.ch/p16.png
Hier aber bin ich gefahren, und öfters mal auf 100% gelandet.geht bis 75

Ich war die letzten Tage krank, daher konnte ich nicht weiter machen. Die tage probier ich mal selbst daten zu senden. Vielleicht sind die letzten 3 Bytes irrelevant für die funktion.
Das ziel ist es ja, das Signal zu immitieren, um ggf. einen eigenen Akku zu bauen.

@hErMeS
Die 2 ähneln sich sehr. Ich hab mal die spitzen entfernt und Byte 10 drüber gelegt.


Falls jemand von euch selbst daten anfertigen und visualisieren will, hier ist der PHP Code dafür.
http://pastebin.com/6nmiWim0
Einfach über das Arduino programm im ersten beitrag die daten abgreifen und die ausgabe des Consolenfensters (Android terminal app mit logging & OTG kabel funktionieren sehr gut. ) in eine datei packen, die dann per ?file=mydata.log laden. &val=19 für den jeweiligen byte und &im damit ein bild ausgegeben wird.
 
Zuletzt bearbeitet:
T

Tobi_36

Hi.

Byte 19 kann man exakt berechnen mit:

B19 = (B1 - B2 - B3 - B4 - B5 - B6 - B7 - B8 - B9 - B10 - B11 - B12 - B13 - B14 - B15 - B16 - B17 - B18) % 256;

%: Modulo-Operator

Es scheint sich also um eine Prüfsumme bzw. eine Prüfdifferenz zu handeln :)
 
T

Tobi_36

Bezüglich Byte 17+18 wäre es vermutlich schlau, den Akku anstelle mit dem Motor mal mit einer elektronischen Last oder einen anderen Verbraucher zu belasten, um eine konstante und zugleich auch bekannte Stromentnahme zu erreichen. Eine damit durchgeführte Datenaufzeichnung sollte dann mehr Aufschluss geben.
Die Last könnte man auch parallel zum (unbelasteten) Motor anschließen.
 
gamerpaddy

gamerpaddy

Mitglied seit
12.07.2015
Beiträge
194
Ort
Mannheim
Details E-Antrieb
Yamaha PW
Also bei mir kommt das was anderes raus, aber nicht Byte 19.
http://dgs.square7.ch/conv3.php

Ich könnte mal einen Schiebewiderstand paralell schalten, mal sehen ob sich was tut.
 
T

Tobi_36

Für den Modulo gibts unterschiedliche Definitionen. Daher kommt bei negativen Zahlen je nach verwendeter Programmiersprache ein unterschiedliches Ergebnis raus.
Zu deinem Ergebnis musst du einfach noch 256 addieren, dann stimmt's.
 
gamerpaddy

gamerpaddy

Mitglied seit
12.07.2015
Beiträge
194
Ort
Mannheim
Details E-Antrieb
Yamaha PW
Ah, danke. Jetzt machts sinn.

Update akku:
Code:
B1   - 255 / Unbekannt / fixed
B2   - 255 / Unbekannt / fixed
B3   - 14 / Unbekannt / fixed
B4   - 6 / Unbekannt / fixed
B5   - 0-100 / Akkuspannug in % / dynamic
B6   - 25 / Unbekannt / fixed
B7   - 1 / Unbekannt / fixed
B8   - 110-169 / Unbekannt, temparatur?/ teil dynamic
B9  - 2-3 / Unbekannt / teil dynamic
B10 - 22-246/ Unbekannt, zusammenhang mit b9? Akkuspannung? / dynamic
B11 - 42 / Unbekannt / fixed
B12 - 248 / Unbekannt / fixed
B13 - 1 / Unbekannt / fixed
B14 - 24 / Unbekannt / fixed
B15 - 17 / Unbekannt / fixed
B16 - 192-224-240/ Unbekannt - Akkustand anzeige?/ teil dynamic
B17 - 0-7 / unbekannt Auslastung? / dynamic
B18 - 0-255 / unbekannt Auslastung?/ dynamic
B19 - 0-255 / Prüfsumme aus allen werten / dynamic - (modulo(B1+..+B18)%256) + 256 *
*danke an Tobi_36
 
Zuletzt bearbeitet:
H

hErMeS

@gamerpaddy,
könntest du noch ein Log anfertigen, über ein paar Minuten, welches jedes Datenpaket und nicht nur jedes vierte zeigt?

Wichtig sind dabei dann
-Akkuspannung
-Wie oft wurde nachgeladen zum letzten großen Log
-Fahrdaten
-in der ersten Minute Stillstand, eventuell hier mal noch etwas Last mit anderem Versuchen (Ich weiß nicht ob die Beleuchtung + USB Gerät sofern ein Anschluss da ist, hier schon was darstellen können)

Ich werde aktuell aus Byte 18 nicht schlau. Eventuell fehlt da was zwischen.
Sehe derzeit nur eine überlagerte Sinuswelle sobald Leistung entnommen wird.
Kannst du dein Oszilloskop eventuell auch mit an die 36v hängen sofern da noch ein a/d Eingang frei ist? So dass man hier den Spannungsverlauf mit verfolgen kann und da auf weiteres schließt.
 
Gene

Gene

Mitglied seit
30.12.2015
Beiträge
14
Details E-Antrieb
Orange-c7 Impulse 11AH 36V ORANGE C330 BOSCH 11Ah
I think I can copy the YAMAHA battery.
31655.jpg
 
B

Bimogi

Mitglied seit
12.02.2016
Beiträge
30
Sounds interesting. Could you elaborate, please.
 
Gene

Gene

Mitglied seit
30.12.2015
Beiträge
14
Details E-Antrieb
Orange-c7 Impulse 11AH 36V ORANGE C330 BOSCH 11Ah
I plan to use 50PCS lithium batteries, design a BMS compatible with YAMAHA communication format. So if I use LG's INR18650 MJ1 3500mAH batteries, then can increase the battery capacity to 17.5AH, 630WH, more than BOSCH highest 500wh battery pack, and increase about 25% riding distance.I think it is a good thing for the Haibike user.
 

Anhänge

Zuletzt bearbeitet:
band45

band45

Mitglied seit
30.11.2014
Beiträge
96
Details E-Antrieb
Haibike Sduro Hardnine RC
Was gibt das eigentlich wenn das hier fertig ist?
Einen günstigen Akku mit 500 AH?
Oder eine Pedelec mit Landeklappen?
 
H

hErMeS

@Gene
Is this a picture from the Yamaha battery circuit?
If yes, can you take better images (bottom and top, ICs in detail)

There seems a programming port on the circuit. (PROG, 4 pin)
Is the COM going to the signalling Port in the battery?
Thanks

@band45
Ziel ist es eine eigene Batterie für den Yamaha bauen zu können, hierfür sind die Datenmeldungen vom Akku erforderlich.
 
Gene

Gene

Mitglied seit
30.12.2015
Beiträge
14
Details E-Antrieb
Orange-c7 Impulse 11AH 36V ORANGE C330 BOSCH 11Ah
@Gene
Is this a picture from the Yamaha battery circuit?
If yes, can you take better images (bottom and top, ICs in detail)

There seems a programming port on the circuit. (PROG, 4 pin)
Is the COM going to the signalling Port in the battery?
Thanks
This is not the YAMAHA circuit, is my own design.
However, I have also seen Yamaha BMS design. It is using the Japanese Renesas chip R2A24060F020, but they do not sell this chip.
 

Anhänge

Thema:

Yamaha: Reverse-Engineering

Oben