Haibike Yamaha: Reverse-Engineering

Dieses Thema im Forum "Yamaha" wurde erstellt von gamerpaddy, 22.03.16.

Schlagworte:
  1. gamerpaddy

    gamerpaddy

    Beiträge:
    180
    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:
    [​IMG]
    !!!! 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:
    [​IMG]

    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):
    [​IMG]
    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
     
    redalexx, schaefersklaus, z_qp und 22 anderen gefällt das.
  2. gamerpaddy

    gamerpaddy

    Beiträge:
    180
    Ort:
    Mannheim
    Details E-Antrieb:
    Yamaha PW
    Update Akku:
    Es gibt neue logs. Rund 1130 einträge über 17 minuten.
    Die fertigen daten gibts hier, visuell dargestellt.

    http://dgs.square7.ch/values.html
    rohdaten finden sich auf der selben seite unter /data.log
     
    OnFire, rebecmeer und zrx-1200 gefällt das.
  3. hErMeS

    hErMeS Guest

    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 von einem Moderator bearbeitet: 29.03.16
  4. gamerpaddy

    gamerpaddy

    Beiträge:
    180
    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: 29.03.16
  5. hErMeS

    hErMeS Guest

    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.
     
  6. Tobi_36

    Tobi_36 Guest

    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: ?
    --- Beitrag zusammengeführt, 02.04.16 ---
    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...
     
    rebecmeer und gamerpaddy gefällt das.
  7. hErMeS

    hErMeS Guest

    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.
     
  8. gamerpaddy

    gamerpaddy

    Beiträge:
    180
    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.
    [​IMG]

    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: 02.04.16
  9. Tobi_36

    Tobi_36 Guest

    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 :)
     
    gamerpaddy gefällt das.
  10. Tobi_36

    Tobi_36 Guest

    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.
     
    torcman gefällt das.
  11. gamerpaddy

    gamerpaddy

    Beiträge:
    180
    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.
     
  12. Tobi_36

    Tobi_36 Guest

    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.
     
    Speedline und rebecmeer gefällt das.
  13. gamerpaddy

    gamerpaddy

    Beiträge:
    180
    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: 06.04.16
    rebecmeer und angerdan gefällt das.
  14. hErMeS

    hErMeS Guest

    @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.
     
    rebecmeer gefällt das.
  15. Gene

    Gene

    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
     
    rebecmeer gefällt das.
  16. Bimogi

    Bimogi

    Beiträge:
    30
    Sounds interesting. Could you elaborate, please.
     
  17. Gene

    Gene

    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: 08.04.16
  18. band45

    band45

    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?
     
  19. hErMeS

    hErMeS Guest

    @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.
     
  20. Gene

    Gene

    Beiträge:
    14
    Details E-Antrieb:
    Orange-c7 Impulse 11AH 36V ORANGE C330 BOSCH 11Ah
    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:



  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden