前回セットアップしたRaspberry Piを使ってバッテリ監視で遊んでいきます。
既製品の監視アプリに不満があったので結局自作することにしました。
使うもの
- Raspberry Pi Zero WH
- BMS (SP04S005)
- ロジックアナライザ
監視アプリいろいろ
今回使っているBMSはSmartBMSと呼ばれるものでUARTやBluetoothで接続して情報が取れます。接続アプリの配布元ではWindows用とAndroid用が配布されています。
Android版はPlayストアにもありますが、BMSの設定変更はできません。上記サイトの方が新しく、設定変更も可能となっています。
iOS版はAppleストアだけにあるようです。
Windows用
UARTケーブルでパソコンのUSB端子と接続します。要UARTケーブル。
無料で使える。一度にたくさんの情報が表示できる。一秒おきに収集した情報をログファイルに落とせる。BMSのファームウェアを更新できる。
設定画面がエラー出て使えない
android用
Bluetoothで接続。要Bluetoothモジュール
無料で使える。設定画面もちゃんと使えるので監視設定を照会・更新できる。取得した情報をグラフで表示できる。
ログが落とせない以外は特に不満なし
iOS用
Bluetoothで接続。要Bluetoothモジュール
デザインはこれが一番見やすいと思う。730円払うと設定変更も可能になる。
有料なこと、ログが落とせないこと
機種別比較
各機種ごとの特徴を比較してみると以下のようになります。
機種 | 見た目 | 設定変更 | ログ | グラフ | Lineでお知らせ | 価格 | 接続方法 |
---|---|---|---|---|---|---|---|
Windows版 | △ | × | 〇 | × | × | 0円 | UART |
Android版 (Playストア) | △ | × | × | × | × | 0円 | Bluetooth |
Android版 (配布サイト) | 〇 | 〇 | × | 〇 | × | 0円 | Bluetooth |
iOS版 (無課金) | ◎ | × | × | × | × | 0円 | Bluetooth |
iOS版 (課金) | ◎ | 〇 | × | × | × | 730円 | Bluetooth |
RaspberryPi /Windows (自作) | ◎ | ◎ | ◎ | ◎ | ◎ | 0円 | UART |
それぞれ一長一短があり、希望をすべて満たすには自作するしかないと思いました。
バッテリシステムも自作なのだから監視も自作でいいかなというのもあります。(仕様書もありましたので)
JBD BMS電文仕様
下記サイトより電文仕様「BMS Communication protocol」をダウンロードします。
仕様書によると、以下のことがわかります。
- コマンドは2つ(読み取り、書き込み)。
- 読み取りにレジスタ番号を指定することで3種類の情報が取得できる
- 書き込みに関する情報はなし
基本情報(0x03)
以下の情報が取得できます。
- 合計電圧(V)
- 電流(A)
- 残容量(Ah)
- 総容量(Ah)
- 使用回数(回)
- 製造日付
- 各セルのバランス状態
- 各保護状態
- ソフトウェアバージョン
- 残容量(%)
- 充放電禁止状態
- バッテリーセル数
- 各センサーの温度(℃)
セル情報(0x04)
セルごとの電圧が取得できます。
ハードウェアバージョン(0x05)
型番が取得できます。
アプリ作成
要件定義
まずはアプリ仕様を決めていきます。
- 基本構想としては既存アプリのいいとこ取り
- 画面uiはiOS版
- BMSから定期的に情報を取得し、ロギング
- ロギングした情報を元にグラフで表示
- BMS設定も照会可能(設定変更機能はとりあえずは不要)
- 充電開始・終了等のイベント時にLINEにお知らせ
- 情報量等を考慮し、情報はweb経由で表示
- 実行プラットフォームは開発のしやすさ、省電力性を勘案し、ラズパイのZero W
- 開発プラットフォームはWindows10、という事でnodejs上で開発
仕様確認
電文仕様を確認するため、まずは手慣れたC#でテストプログラムを作って通信してみます。(nodejsはほとんど使ったことなかったので…)
すると応答電文が仕様書と違う…
仕様書では
0xdd | 0xa5 | 結果 | data長 | 0xff | checksum | 0x77 |
実際は
0xdd | レジスタ番号 | 結果 | data長 | 0xff | checksum | 0x77 |
この方が仕様として正しいと思うのでおそらく仕様書の間違い。
いざ実装
電文仕様は理解したのでNodejsの環境をWindows10上に作成し、実装していきます。
まずはserialportを呼び出し、com1で送受信が出きることを確認。port設定はラズパイで動かすことを想定し、設定ファイルから読み出すことに。
※Windows環境ではserialportはすんなり入りましたが、ラズパイでは”–unsafe-perm”付けないとインストールできませんでした。
webインターフェースにするのでexpress、express-generatorをインストールし、webAPIを作り、pugでサイトを作ります。
この辺りの話は完成したあとあらためて上げようと思います。
自作監視画面
iOS版の画面をそのまま再現してもつまらないので日本語化してみました。
これだけだと既製品と変わらないので、充電開始・終了等のイベント発生時にLINE Notifyを使ってスマホにお知らせするよう実装します。
LINE Notifyを使用するために、LINE Notifyホームページからアクセストークンを発行します(無料です)
イベントが発生するとこのようにスマホに通知が来るようになりました。
設定値にアクセスしたい
公開されている仕様には設定値にアクセスする方法が書いてないのですが、”BMS JBD”で検索すると同じようなことをしているサイトが見つかります。
そのサイトによると設定値に関するレジスタ番号は0x10以降にあり、なにもせずにそのレジスタを読み取ると失敗(0x80)が返ってきます。アクセスするためには0x00レジスタに書き込みを行い、EEPROMのモード変更が必要らしいです。
早速モード変更を組み込んでみますが、モード変更に失敗(0x80が返ってくる)します。件のサイトとはBMSのFWが微妙に違うのかもしれません。
最後の手段(ロジックアナライザ)
UARTケーブルに流れている信号を直接読みとって電文仕様を確認することにします。下記のようなロジックアナライザがamazonでは1000円程で買えるので買ってみます。
HiLetgo 24MHz 8チャンネル USBロジックアナライザ 8CHロジックアナライザ UART IIC SPI デバッグ MCU FPGA ARMに対応 [並行輸入品]
レビューを参考にZadigでUSBドライバをインストールしてロジックアナライザを認識させます。次にPulseViewをインストールします。
BMSにBluetoothアダプタを繋げ、ロジックアナライザの線を割り込ませます。このようにブレットボード経由にすることで割り込ませています。
原因究明
Bluetooth経由でandroidから設定画面を開くと、0x00レジスタの前に0x06レジスタにアクセスしていました。
0x06レジスタ書き込みを追加し、0x10以降のレジスタにアクセスすると…
mission completed
このように設定値を取得することができるようになりました。どのレジスタがどの値に割り当たっているかは、androidのアプリは表示順にレジスタにアクセスしていたので簡単にわかりました。ただ、メッセージは日本語にしてみましたが、英語の方が分かりやすかったような気もします・・・。
その後Windows版の信号を同様に確認してみましたが、0x06レジスタにアクセスしてませんでした。Windows版が設定値読み出せなかったのはこれが原因のようです。。。
コメント