DIY Victron BMV (Nur teilweise funktional)
Die Idee
Ein Victron BMV kostet ~130-160€ direkt von Victron. Der Shunt (Messwiderstand) selbst, ohne die ganze Elektronik lässt sich aber auch für 30-40€ besorgen. In meinem übereifrigen und selbstüberzeugten Kopf, hatte ich gedacht, ich könnte mit etwas Zeit, einem Mikrocontroller und ein paar Kabeln den BMV nachbauen.
Die Komponenten
Nach etwas Bastelei habe ich einen Prototypen gebastelt, bestehend aus:
- Einem Arduino Nano ~2€
- Einem INA219 Breakout-Board ~5€
- Einem Victron 500A/50mv-Shunt ~35€
- Einem 128x64 I2C OLED-Screen ~3€
- Einem Rotary-Encoder ~3€
Verkabelung
Formulierung eines Ziels
Die Ansprüche an meinen DIY-Shunt waren:
- genaue Messung des Stroms und der Spannung
- Anzeige von Ladezustand, Strom, Leistung und Spannung auf dem Display
- Möglichkeit der Konfiguration mittels Rotary-Encoder (weil ich die einfach nice finde)
- Dimensionierung ähnlich wie beim BMV
- Anbindung des Shunts an ein Venus-System und Darstellung der Akku-Daten in diesem
Dafür habe ich noch "Unterziele", die sich aus den vorherigen ergeben:
- Speicherung von historischen Maxima und Minima
- Speicherung der Einstellungen über Stromversorgungsverluste hinweg
Großer Unterschied zu dem "original" BMV ist, dass ich den Bildschirm und die Steuerung nicht per Kabel von dem Shunt entkoppelt habe - und das auch nicht vorgesehen habe. Das größte Problem dabei bildet der Bildschirm, der per I2C angeschlossen ist, was an sich nur für Kommunikation auf Platinen und recht kurzen Distanzen konzipiert ist. Ich habe noch nicht getestet, wie weit die Reichweite mit dem Bildschirm konkret sein könnte, laut meiner Recherche sind aber auch eher "nur" Längen von bis 5m möglich. Grundsätzlich ist ein differentielles I2C über ein Cat 5 Kabel auch möglich, die Chips dafür jedoch mit ~10€ im Verhältnis zum Rest recht teuer.
Der Code und die Anbindung an Venus-OS
Beim Schreiben des Codes durfte ich mich wieder sehr viel Reverse-Engineering bemühen: Die Spezifikationen der Victron-Protokolle lassen sich auf der Victron-Website anfordern. Relevant für das Projekt sind das VE.Direct Protocol, und das VE.Direct HEX Protocol BMV. Es haben sich nämlich Menschen gedacht, gleich Daten zweier Protokolle zur Auswertung in Venus-OS zu verwenden.
Die zwei Protokolle
ID 0x203
V 11996
I -439
P -5
CE -248917
SOC 774
TTG 14400
Alarm OFF
Relay OFF
AR 0
BMV 700
FW 0308
Checksum A
Das VE.Direct-Protokoll ist recht simpel aufgebaut und sendet einfach immer einen Identifier, einen TAB und dann den Wert dahinter. Zeilen wie P -5
lassen sich recht einfach Entziffern und die Bedeutung sogar erraten: P steht vermutlich für Power.
Die Checksum ist auch recht simpel, das byte der Checksum bildet mit dem Rest des Datenblock in Summe modulo 255 einfach Null. (Und ist auch wunderbar dokumentiert.)
:80C0100414141410404040404040404040404040404040404F8
Das HEX-Protokoll ist weitaus unintuitiver, da habe ich mich doch sehr über die Dokumentation von Victron gefreut. Grundsätzlich ist das Protokoll mehr ein Frage-Antwort-Spiel zwischen den Geräten, ein Kommando beginnt immer mit einem :
und einer Kommando-Kathegorie (8 zum setzen eines Registers, 7 zum Lesen) - gefolgt von dem Register und optional dem Wert. Die Checksum ist ähnlich zu der beim Text-Protokoll, muss jedoch am Ende 0x55
und nicht 0x00
ergeben.
Der fertige Code lässt sich in diesem git-Repo finden.
Was noch kommt: Eine eigene Platine
Das alles ist auf der Steckplatine doch noch recht groß und klobig und hat nicht so wirklich den Formfaktor, den ich mir vorgestellt habe. Wie bei anderen Projekten auch schon, plane ich eine eigene Platine zu designen, fertigen zu lassen und dann selbst zu bestücken. Im Gegensatz zu vorherigen Projekten, plane ich aber auch direkt SMD-Komponenten zu verwenden und zu schauen, wie gut ich die per Hand aufgelötet bekomme.