はじめに
- Spike Primeのセットに含まれるセンサ&アクチュエータむっちゃ高級だった。
- Raspberry Piみたいな高級な頭脳でなにかしたい。
- Raspberry Pi Build Hatを使ってメカを動かしてみる。
注意書き
本記事は下記の条件を満たす読者を想定しています。
何があっても自己責任にてお願いします。
- Raspberry Piのネットワークの設定やPython3のインストールは既に完了している。
- Pythonのコードが何となく目追いできる。
- 万が一貴重なラズパイが破損しても「しょうがない」の一言で割り切れる。
Raspberry Pi Build Hatについて
RaspberryPi Fundation公式のHAT。
2022/11/4(金)確認にて、Switchscienceさん等で入手可能。
注意ポイントとして、アクチュエータ類を動かすためには8V±10%の電源が必要。 一応SwitchScienceさんで購入できるけど、今回は1.2Vのニッケル水素電池を6本直列にして7.2Vで動かしてみる。
電源を確保する方法について
今回は単3 1.2Vののニッケル水素電池を6本使って7.2Vを作る。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/
あるいはこういう手段もあり
2.1mm標準DCプラグ⇔スクリュー端子台
また、1.5Vの単三電池を使う場合はこれをつかってもいいかも。
スイッチサイエンス 単三電池5本を2.1mmDCプラグで出力できる電池ボックス
使ったもの
入手先は一例です。多分もっと安いところはあると思う。
物品名 | スペック | 入手先 |
---|---|---|
Raspberry Pi 4B | メモリ8GBモデル | スイッチサイエンス |
SDカード | microSDHC class10 64GB | ヨドバシとか。 |
Raspberry Pi Build Hat | - | スイッチサイエンス |
電池ボックス | 単3×6本 Bスナップ・背中合わせ | 秋月電子通商 |
2.1mmDCプラグ付バッテリースナップ | 横型 | 秋月電子通商 |
ニッケル水素充電池(LADDA) 6本 | 単3 1.2V 2400 mAh | IKEA |
LEGO Spike Prime(45678) | Amazon |
Spike Primeに関して、本記事の内容を試してみたいだけであればこちらで最低限分を揃えるのもありかも?
LEGO エデュケーション スパイク プライム 拡張セット (45681)
組み立てた結果
ラズパイ側に電源は不要。Raspberry Pi Build HATから給電できるはず。
基本は差し込めばいいだけなので説明は特になし。
(今回はモーターをPortD、カラーセンサをPortAに差し込みました。)
動作環境
対象 | スペック |
---|---|
Raspberry Pi OS | 64bit, Debian version: 11 (bullseye) |
python | 3.9.2 |
python build hat (Raspberry pi Build HAT python Library) |
0.5.11 |
その他モジュールは下記の通りです。
buildhat==0.5.11
colorzero==2.0
gpiozero==1.6.2
pyserial==3.5
Raspberry pi Build HAT Python Libraryについて
ライブラリのインストール方法や使用方法はこちらにまとまっている。
センサー値をとってみる。
カラーセンサを使ってみる。ほぼほぼサンプルコード使いまわし。
動作に成功するとライトが点灯してセンサー値が出力されるはず。
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)
アクチュエータを動かしてみる
モーターを動かしてみる。
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行でこれを実現できるってすごい。
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)
まとめ
- 物品を揃えるのと環境構築が少しダルいかもしれない。
- ワンセット揃えると楽。シリアル通信などに関するダルい初期化処理がないから非ハード屋でもさっさとコードがかける。
- 公式のブロックプログラミング環境で抽象化されて見えなかった値が見えたりするのでおもしろい。
LEGO関係は財布に痛い。(おい)