Raspberry Pi PicoでM5Unitを試してみた

M5Stack用のM5Unit（拡張モジュール）は、様々な種類が販売されていますが、ケーシングもしっかりしていて扱いやすいものが多いです。I/FもGrove互換なため、H/W的にも他のボードに接続しやすいですし、Arduinoライブラリも用意されているので、流用しやすいです。

今回は、Raspberry Pi Pico（実際に使ったのはPico W）にM5Unitを接続し、試してみました。
Raspberry Pi Picoは、Arduino IDEでプログラミングできる環境を使ってます。ボード定義は[arduino-pico](https://github.com/earlephilhower/arduino-pico)です。

試したのは、以下の2種類です。

https://www.switch-science.com/collections/m5stack/products/9508

https://www.switch-science.com/collections/m5stack/products/9509

どちらも手軽に購入できる価格です。

## QR コードスキャナ ーユニット（STM32F030）
様々なバーコード、QRコードに対応したリーダーユニットで、ユニット自体に取り付けられたトリガボタンもしくは、マイコン側からスキャンを開始できます。ユニット自体にもマイコンが内蔵されているので、自動的にスキャンして、コードを送ってくれます。

### Raspberry Pi Picoとの接続
QR コードスキャナ ーユニットはI2Cもしくは、Serialで通信ができるようになっています。今回は、I2Cを試しました。
Grove互換なので、Raspberry Pi PicoをPi Pico v1.0用Grove シールドに載せています。

https://www.switch-science.com/products/7109

QR コードスキャナ ーユニットをI2C0に接続し、Groveコネクタの電源選択は5V側にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/76ec19b0-7de9-5be6-9da6-d51f0efcc295.png)

### ライブラリ
QR コードスキャナ ーユニットを扱うための、オフィシャルのライブラリがありますので、それをArduino IDEでインストールします。

Arduino IDEのライブラリマネージャーで、`M5Unit-QRCode`で検索すると出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/bd8e924f-def9-d686-bd74-d56f9a752d51.png)

ちなみにライブラリのリポジトリは以下にあります。

https://github.com/m5stack/M5Unit-QRCode

しかし、このままでは、ビルドが通らなかったので、ソースコードを変更します。
通常、Arduino IDEでインストールされたライブラリは以下のパスにインストールされています。

/Arduino/libraries/M5UnitQRCode

Windowsの場合は、Documentsフォルダ下、Macの場合は、書類フォルダ下にあると思います。
（インストール時の指定により変わります）

変更する箇所は、

`/M5UnitQRCode/src/M5UnitQRCodeI2C.cpp`
43行目

```cpp
_wire->begin(_sda, _scl, _speed);
```
↓
```cpp
_wire->begin();
```

`/M5UnitQRCode/src/M5UnitQRCodeUART.cpp`
6行目
```cpp
_serial->begin(baud, SERIAL_8N1, RX, TX);
```
↓
```cpp
_serial->begin(baud);
```
です。

### スケッチ
ライブラリのサンプルを元に次のようなスケッチで試しました。

```cpp
#include "M5UnitQRCode.h"
#include "Wire.h"

M5UnitQRCodeI2C qrcode;

void setup() {
  Serial.begin(115200);
  Wire.setSDA(8);
  Wire.setSCL(9);

  while (!qrcode.begin(&Wire, UNIT_QRCODE_ADDR, 8, 9, 100000U)) {
        Serial.println("Unit QRCode I2C Init Fail");
        delay(1000);
    }

  Serial.println("Auto Scan Mode");
  qrcode.setTriggerMode(AUTO_SCAN_MODE);
}

void loop() {
  if (qrcode.getDecodeReadyStatus() == 1) {
      uint8_t buffer[512] = {0};
      uint16_t length     = qrcode.getDecodeLength();
      Serial.printf("len:%d\r\n", length);
      qrcode.getDecodeData(buffer, length);
      Serial.printf("decode data:");
      for (int i = 0; i < length; i++) {
          Serial.printf("%c", buffer[i]);
      }
      Serial.println();
  }
}
```

### 動作確認
パッケージにバーコードとQRコードがあったので、それを読み込んでみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/db720a76-6653-ecfb-1902-617389a04f35.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/175e236c-b92f-b478-7674-3b001aa2622e.png)

シリアルモニタに読み込んだコードが表示されたので、問題なさそうです。

## M5Stack用計量ユニット 5kgレンジ（HX711）
5Kgまでの計量ができるユニットです。ナットが付属していて、ネジで天板を取り付けることも可能です。
フルカラーLEDとスイッチが取り付けてあり、ステータスの表示やゼロリセットなどに使用することができます。
マイコンが内蔵されているので、細かい制御はユニット側で行われるので、簡単に扱うことができます。

### Raspberry Pi Picoとの接続
Raspberry Pi Picoとの接続は、QRコードスキャナと同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/f5ba2767-09ad-3c45-db2b-ec1697e5b671.png)

### ライブラリ
M5Stack用計量ユニットのライブラリもオフィシャルのものがあります。
こちらは、Arduino IDEのライブラリマネージャーでは出てこなかったので、リポジトリからZIPファイルでダウンロードして、Arduino IDEにインストールします。

https://github.com/m5stack/M5Unit-Miniscale

こちらもソースコードの修正が必要なため、以下の箇所を変更します。

/UNIT_MINISCALE/src/UNIT_SCALES.cpp
8行目

```cpp
_wire->begin(_sda, _scl, 400000UL);
```
↓
```cpp
_wire->begin();
```

### スケッチ
ライブラリのサンプルを元に次のようなスケッチで試しました。

```cpp
#include "UNIT_SCALES.h"

UNIT_SCALES scales;

void setup() {
  Serial.begin(115200);
  Wire.setSDA(8);
  Wire.setSCL(9);

  while (!scales.begin(&Wire, 8, 9, DEVICE_DEFAULT_ADDR)) {
      Serial.println("scales connect error");
      delay(1000);
  }
  scales.setLEDColor(0x001000);
  scales.setOffset();
}

void loop() {
  float weight = scales.getWeight();

  Serial.printf("Weight:%f\n",weight);

  delay(500);
}
```

### 動作確認
別なスケールで測った53gのBluetoothイヤフォンを測ったらだいたい一致したので、問題なさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/9d3ad756-5bc1-867a-b138-af55b5c7c963.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/d9f20f0f-d7b0-b5e2-1533-4d8f8a0bb9cc.png)


## 最後に
M5Unitは、M5 Stack用に設計されていますが、Raspberry Pi Picoでも簡単に扱えることがわかりました。
他にもディスプレイなど試したことはありますが、ケーシングがされているのと、ライブラリが用意されているので、プロトタイプング的にはさっと動かせるので良いですね。

[執筆したPico Wの書籍](https://amzn.to/3TnrS1G)では、[M5Unitのディスプレイ](https://www.switch-science.com/products/7233)の例も書いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/331e3584-89af-e784-bb31-bab04aeb328d.png)


また書面で紹介しているキーリマインダーの製作例では、ロードセルを使って鍵が置かれているかを判断していますが、今回使ったM5Unitの計量ユニットを使えばもうちょっと手軽に作れそうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/aefa1f52-7448-97cb-0119-bae5328a938f.png)