家用儲能 Powerwall DIY 第二回之 BMS 好好玩
話說我上次把 7S1P 的電池組起來後,讓 BMS 動了起來。嘉百達的這套附通訊功能的 BMS 非常強大,我跟淘寶的客服要了它在 serial port 上的通訊協定之後,就一直想做個裝置來跟它通訊、監控 BMS。
其實嘉百達有給 PC 的軟體,而且功能還蠻完整的,幾乎所有的 BMS 狀態、設定都看得到。畫面稍微醜了點,而且可能因爲缺字形的關係,Windows 的 form layout 有點跑掉。這個軟體叫 “JBDTools”,開起來的畫面長這樣:
原來寫程式的人還很浮誇地用了 SkinMagic 做出非方形的視窗。雖然我抓的是英文版的軟體,畫面中還是會出現一些亂碼,應該是簡體中文訊息用 GB 碼編碼造成的。
除了可以看 BMS 的狀態之外,有非常多的設定可以調整:
所有的 OVP、UVP 電壓、OCP 電流、OTP、UTP 溫度都可以設定,電池容量、可用容量可以設定,用來計算剩餘電量的電壓節點也有四個可以設,總之就是個功能非常完整,彈性也很大的 BMS。
這麼好玩的 BMS 絕對不會只有我在玩。其實我最早是在英文的電動滑板車改裝論壇裡看到這個 BMS 的名字,有人叫它 “JBD”,就是 “嘉百達” 的意思,但也有人叫它 “xiaoxiang BMS”,意思是 “小象 BMS”,因爲在 AppStore 跟 GooglePlay 中有個控制這個 BMS 的 app 叫做 “小象電動“。我本來以爲這是個電動滑板車的牌子,像是小米小什麼家族之類的,但是怎麼查都找不到。總之目前我還搞不清楚嘉百達跟小象之間有什麼關係,但這套 BMS 在電動滑板車 DIY 和改裝的社群中非常有名,國外有大量的玩家在使用,因此英文的資源也不少。
我找到了一個老外的部落格很認真的研究了這套 BMS 的細節,甚至還照著 protocol 的規格自己寫了程式去跟 BMS 溝通。我看到程式碼就知道我不用從頭自幹起了,我想做的事一定有人做過。
後來我在 GitHub 上找到一個 repo,他用 ESP32 連上 JBD BMS 的藍牙 dongle,直接用 BLE 讀取 BMS 的狀態。
我本來對它的 BLE dongle 有點頭痛,因爲不知道它的 BLE UART 走什麼 GATTservice,但是看了這個程式後就恍然大悟,原來它的 service UUID 是:
0000ff00-0000-1000-8000-00805f9b34fb
下面有兩個 characteristic:
0000ff01-0000-1000-8000-00805f9b34fb
0000ff02-0000-1000-8000-00805f9b34fb
其實這個 UUID 就是 16-bit short form service UUID/characteristic UUID 的格式。換句話說,JBD 很混地選了 0xff00、0xff01、0xff02 當作它 service 跟 characteristic 的 UUID。
而這兩個 characteristic,第一個可以 read、notify,其實就是 UART service 的 TX;第二個可以 read、write,其實就是 UART service 的 RX。看到這裡我就差不多懂了,因爲不久之前因爲某個工作的緣故,我剛寫過 Nordic nRF 52832 的 Nordic UART service。JBD 這個 BLE dongle 的晶片雖然是 TI 的 CC2541,但各家 UART service 的做法都一樣。
又剛好最近工作上需要大量用到 BLE,我找了一片 ESP-32 附 TFT-LCD 的小板子叫做 TTGo T-Display 來寫 BLE central,於是就順手用同樣地 BLE central 程式來連 JBD BMS,照著它的 communication protocol 把電池的資訊讀回來,在精美的彩色 LCD 面板上顯示出來:
畫面左邊是每個 cell 的電壓,底色是 scale 調整過的電壓長條圖,可以看出來哪個 cell 的電壓偏高、偏低。畫面右邊顯示了 BMS 現在的電壓、電流、兩個 溫度 sensor 的讀值,以及 cell 之間最大的電壓差。如果有 cell 的 balance 電路被觸發,在 cell 電壓的左邊會出現紅色的 icon。最右邊則是電池容量的圖示。畫面上方則是充電和放電這兩組 MOSFET 的狀態,實心是開、空心是關。
解讀 BMS 的資料其實不難,因爲它的通訊協定很簡單,發一個 polling 的指令過去 BMS 就會吐回一大串資料,只要按照格式解讀、把數字重建就好了。但真正花時間的其實是刻這個畫面。
以前我比較習慣寫 SSD1306 控制的 128×32 或 128×64 OLED 面板,但這次的顯示器是用功能遠比 SSD1306 強大的 ST7789V 驅動的,因此我掛了一個在 ESP-8266、ESP-32 上大家很常用的 library 叫 TFT_eSPI,並花了一些時間熟悉它。
TTGo T-Display 的 TFT-LCD 面板是個很怪的解析度:240×135,color format 是 RGB 565,整個 display buffer 有64KBytes,因此也需要比 OLED 大得多的頻寬,不可能再用 I2C,一定要走 SPI。
我一直想找有沒有什麼 UI design 的工具,可以適合用來畫這種低解析度的面板 UI,畫好之後把各 element 的座標算出來,再開始寫程式。但找來找去好像都沒有這種工具,也可能是我找的方向不對,總之最後我還是只能在紙上算座標、再把座標 key 到程式裡。但用手畫的最大問題就是沒辦法直接畫出正確的比例,因此有些座標還是需要反覆試錯,才能找出來。
總之,我現在有一個可以用藍牙連接 BMS 的 dash board 了,我可以用無線的方法監控電池組的狀態。下一步,就要真槍實彈來焊接電池、做個半度電來試試了。
近期留言