バッテリー監視::Raspberry Pi4 + Ubuntu22.04 + ROS2 Humble でロボット作り（その８）

# バッテリー情報を取得する
前回からちょっと間が空きましたが（年末年始は忙しいねぇ）、今回はバッテリーの情報を取得してみます。

使用したモジュールはINA219（秋月電子で購入）です。

https://akizukidenshi.com/catalog/g/gM-08221/

## 接続
INA219の電源電圧は3.3V〜5Vなので、ラズパイのGPIOに合わせて3.3Vで接続します。
ラズパイのGPIO、バッテリーとの接続は以下のとおりです。

| INA219B | Raspberry Pi |バッテリー|
|:-|:-|:-|
|1. VIN+  |   |+|
|2. VIN-  |   |-|
|3. GND   |6. GND  ||
|4. VCC   |1. 3V3 power   ||
|5. SCL |5. GPIO3(SCL)   ||
|6. SDA |3. GPIO2(SDA)   ||
|7. A0 | NC   ||
|8. A1   | NC  ||

※[前回の記事](https://qiita.com/shoichi4411/items/bb9e792a0dfb600c90ad)で、I2Cは有効にしているのでI2Cの設定は端折ります。

### 複数のI2Cデバイスを接続する場合の注意点

ラズパイ側のI2C１つに対して複数のデバイスを接続する場合、プログラム側の処理を正しく書かないとエラーが出ます。
当たり前といえばそうなのですが、それぞれのデバイス用にNodeを作って実行させると１つのデバイスの通信中に他のデバイスの通信処理が入って（バッティングして）エラーになるというわけです。

なので、複数のI2Cデバイスを繋いで処理させる場合は、１つのNode内でプログラムを書いて、pythonの場合だとthreading.Lock()を使って、個々のデバイス処理が終わるまで待機するようにするのが良いようです。

実際の処理コードについて、前回の記事で紹介した[BNO055用のROS２パッケージ](https://github.com/flynneva/bno055)にそのものズバリな処理が書かれていますので、ご参照ください。
※ようは、個々の処理をスレッドにして、それぞれのスレッドは他のスレッドが終わるまでロックして処理が走らないようにしているという仕組みです。

## ドライバーのインストール
INA219は[Adafruitからライブラリ](https://learn.adafruit.com/adafruit-ina219-current-sensor-breakout/python-circuitpython)が出ていますので、以下のコマンドでライブラリをインストールします。

```bash
$ sudo apt update
$ sudo pip3 install adafruit-circuitpython-ina219
```

自分の環境（構成）の場合は、複数のI2Cデバイスがつながっているため、ROS2用のパッケージを自分で作る必要がありましたので、Gitにアップしました。

https://github.com/shoichi4411/ros2_i2c

※BNO055 + INA219 の接続処理が書かれています。

Gitクローンして、ビルドして、ローンチファイルに追加してください。（だんだん説明が雑になっていく。。。）

## Web側の処理

Web側は特に前回と処理自体は変わりません。

前回のJavascriptに + の行を以下のように追記します。

```diff_javascript
+    function ros_battery_topic_subscribe() {
+        battery_listener.subscribe(function(message) {
+            let voltage = message.voltage.toFixed(2);
+            let current = message.current.toFixed(2);+++
+            $('#rbBarText').html(voltage + 'V');
+            $('#rcBarText').html(current + 'A');
+        });
+    }

    $('#start').on('click', function() {
        ros_camera_topic_subscribe();
        ros_imu_topic_subscribe();
+       ros_battery_topic_subscribe();
    });

    $('#stop').on('click', function() {
        camera_listener.unsubscribe();
        imu_listener.unsubscribe();
+       battery_listener.unsubscribe();
    });
```
HTML側も追記します。
```diff_html
+ <div id="rbBarText"></div>
+ <div id="rcBarText"></div>
<div id="main-contents">
        <img id="camera_view" src="">
        <div id="camera_frame">
            <img id="camera_roll" src="img/roll_white.svg">
            <img id="camera_yaw" src="img/yaw_white.svg">
        </div>
        <div id="camera_pitch">
            <img src="img/pitch_white.svg">
        </div>
    </div>
```

レイアウトは適当ですので、アレンジしてみてください。

## 動作確認

結構改良してしていますので、全然見た目は違いますが、今の感じはこんなのです。

https://twitter.com/shoichi4411/status/1608391259072368640

バッテリー監視は、ラズパイ側バッテリーと、別電源の両方を監視。
また、温湿度センサーで外気温なども所得
スマホ側のカメラとラズパイ側のカメラの同時表示をしています。

ブラウザでスマホのカメラを使用する場合、SSL（HTTPS）接続が必須になるため、rosbridge_suiteの初期設定のままでは使用できません。（WSSで繋ぐ必要がある）

次回はそのあたりの記事を書こうかなと思います。
あ、ハードウェア編も書いていきたい。

## 目次

* [[←前回]WebでIMU取得::Raspberry Pi4 + Ubuntu22.04 + ROS2 Humble でロボット作り（その７）](https://qiita.com/shoichi4411/items/bb9e792a0dfb600c90ad)
* [[次回→]スマホカメラとSSLとWSS::Raspberry Pi4 + Ubuntu22.04 + ROS2 Humble でロボット作り（その９）](https://qiita.com/shoichi4411/items/caa67154b833e28eda26)