Raspberry Pi Build HATでSpike primeのアクチュエータを動かしてみた

# はじめに

- Spike Primeのセットに含まれるセンサ＆アクチュエータむっちゃ高級だった。
- Raspberry Piみたいな高級な頭脳でなにかしたい。
- Raspberry Pi Build Hatを使ってメカを動かしてみる。

# 注意書き

本記事は下記の条件を満たす読者を想定しています。
何があっても自己責任にてお願いします。

- Raspberry Piのネットワークの設定やPython3のインストールは既に完了している。
- Pythonのコードが何となく目追いできる。
- 万が一貴重なラズパイが破損しても「しょうがない」の一言で割り切れる。


# Raspberry Pi Build Hatについて

RaspberryPi Fundation公式のHAT。
2022/11/4(金)確認にて、Switchscienceさん等で入手可能。

:::note warn
注意ポイントとして、**アクチュエータ類を動かすためには8V±10%の電源が必要。** 一応SwitchScienceさんで購入できるけど、今回は1.2Vのニッケル水素電池を6本直列にして7.2Vで動かしてみる。
:::

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

https://www.switch-science.com/products/7635?_pos=2&_sid=f711d2fd4&_ss=r

<details>　<summary>電源を確保する方法について</summary>
今回は単3 1.2Vののニッケル水素電池を6本使って7.2Vを作る。

:::note alert
1.5Vを出力する乾電池を使うと公称値に対して電圧オーバーして故障・破損する可能性があります。
:::

また、電池とBuild HatをつなぐにはDCプラグ付きバッテリースナップを使う。Build Hatのジャックは下記の規格(2.1mm バレルジャック)なため、同じDCプラグを用意する。

- 内径：2.1mm
- 外径：5.5mm
- 極性：センタープラス

### 電池ボックス

https://akizukidenshi.com/catalog/g/gP-10611/

### DCプラグ付きバッテリースナップ

https://akizukidenshi.com/catalog/g/gP-07357/

あるいはこういう手段もあり
[２．１ｍｍ標準ＤＣプラグ⇔スクリュー端子台](https://akizukidenshi.com/catalog/g/gC-08847/)

また、1.5Vの単三電池を使う場合はこれをつかってもいいかも。
[スイッチサイエンス 単三電池5本を2.1mmDCプラグで出力できる電池ボックス](https://www.switch-science.com/products/3312)


</details>

# 使ったもの

入手先は一例です。多分もっと安いところはあると思う。

| 物品名  | スペック  | 入手先  |
|:-:|:-:|:-:|
| Raspberry Pi 4B  | メモリ8GBモデル  | [スイッチサイエンス](https://www.switch-science.com/products/6370)  |
| SDカード  | microSDHC class10 64GB | ヨドバシとか。  |
| Raspberry Pi Build Hat  | -  | [スイッチサイエンス](https://www.switch-science.com/products/7565?_pos=1&_sid=f711d2fd4&_ss=r)  |
|  電池ボックス | 単３×６本　Ｂスナップ・背中合わせ  |  [秋月電子通商](https://akizukidenshi.com/catalog/g/gP-10611/)  |
| ２．１ｍｍＤＣプラグ付バッテリースナップ  |  横型 | [秋月電子通商](https://akizukidenshi.com/catalog/g/gP-07357/)  |
| ニッケル水素充電池(LADDA) 6本  | 単3 1.2V 2400 mAh  | [IKEA](https://www.ikea.com/jp/ja/p/ladda-rechargeable-battery-hr06-aa-1-2v-50504692/)  |
| LEGO Spike Prime(45678)  |   | [Amazon](https://amzn.asia/d/bR1aoUB)  |

Spike Primeに関して、本記事の内容を試してみたいだけであればこちらで最低限分を揃えるのもありかも？
[LEGO エデュケーション スパイク プライム 拡張セット (45681)](https://amzn.asia/d/9oOdDFw)

# 組み立てた結果

ラズパイ側に電源は不要。Raspberry Pi Build HATから給電できるはず。
基本は差し込めばいいだけなので説明は特になし。
（今回はモーターをPortD、カラーセンサをPortAに差し込みました。）

![314332089_5754617934645400_8061674615646940945_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/2cebd222-c315-3411-7cae-adda81f60f13.jpeg)



# 動作環境

| 対象 | スペック |
|:-:|:-:|
| Raspberry Pi OS | 64bit, Debian version: 11 (bullseye)　  |
| python  | 3.9.2  |
| python build hat<br/>(Raspberry pi Build HAT python Library)  | 0.5.11  |

その他モジュールは下記の通りです。

```python:pip freeze
buildhat==0.5.11
colorzero==2.0
gpiozero==1.6.2
pyserial==3.5
```


## Raspberry pi Build HAT Python Libraryについて

ライブラリのインストール方法や使用方法はこちらにまとまっている。

https://d2air1d4eqhwg2.cloudfront.net/media/files/64e49959-a923-4218-b0e4-605f6a409c54.pdf

https://github.com/RaspberryPiFoundation/python-build-hat

:::note alert

Build Hatを使うためにはシリアルポートを有効にする必要があるが、この時シリアル経由でシェルへログインできるようにする旨の選択で必ず**No(いいえ)**を選択する。逆にハードウェアシリアルポートについては有効にするため*Yes(はい)*を選択する必要がある。

(シリアル経由でシェルへログインできる設定をするとBuild Hatライブラリが動作しない。）

![スクリーンショット 2022-11-05 15.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/e7de27f5-581e-3db4-2c95-fdd9b3851d53.png)

![スクリーンショット 2022-11-05 15.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/7575893c-8c0c-1f79-f215-695b2b3fb846.png)

![スクリーンショット 2022-11-05 15.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/d4231686-5979-5254-73c7-5378e9be3559.png)

また、非rootユーザーが使えるように`/dev/serial0`の権限を変更する必要もあるため注意。

```shell:権限変更（もともとは644のはず）
sudo chmod 666 /dev/serial0
```

:::






# センサー値をとってみる。

カラーセンサを使ってみる。ほぼほぼサンプルコード使いまわし。
動作に成功するとライトが点灯してセンサー値が出力されるはず。

```python:ColorSensor.py
from buildhat import ColorSensor

color = ColorSensor('A')

print("HSV=", color.get_color_hsv())
print("RGBI=", color.get_color_rgbi())
print("Ambient=", color.get_ambient_light())
print("Reflected=", color.get_reflected_light())

print("Wait color red")
color.wait_until_color("red")
print("Detect color red!")

while True:
    c = color.wait_for_new_color()
    print("Detect new color:",c)
```



# アクチュエータを動かしてみる

モーターを動かしてみる。

```python:motor.py
from buildhat import Motor

motor = Motor('D')

def handle_motor(speed, pos, apos):
    print("Motor", speed, pos, apos)

motor.when_rotated = handle_motor
# 最高速は100
motor.set_default_speed(50)
motor.run_for_degrees(360)

```

# アクチュエータを動かしてみる
LEGOブロックの色に応じてモータの角度を変える。
正味11行でこれを実現できるってすごい。

```python:colorselect.py
from buildhat import Motor,ColorSensor

motor = Motor('D')
color = ColorSensor('A')

while True:
    c = color.wait_for_new_color()
    print("Detect new color:",c)
    if(c=="red"):
        motor.run_to_position(0)
    elif(c=="blue"):
        motor.run_to_position(-90)
    elif(c=="yellow"):
        motor.run_to_position(90)
```

<iframe width="560" height="315" src="https://www.youtube.com/embed/JcaBFa2EfUk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# まとめ

- 物品を揃えるのと環境構築が少しダルいかもしれない。
- ワンセット揃えると楽。シリアル通信などに関するダルい初期化処理がないから非ハード屋でもさっさとコードがかける。
- 公式のブロックプログラミング環境で抽象化されて見えなかった値が見えたりするのでおもしろい。
- ~~LEGO関係は財布に痛い。（おい）~~