SPIKE プライムは、ブロックでも Python でも動かせます。ロボサイエンスでは Pybricks を使い、Python という文字のプログラムで動かします。理由は3つです。細かく決められること、Pico と通信できること、文字のまま保存できること。Pybricks の入れ方と、モーターを1回転させる最初のプログラムまで進みます。
Pybricks とは ― SPIKE を Python で動かす
Pybricks は、ハブの中に入れるファームウェアです。入れかえると、ハブは Python のプログラムで動くようになります。
プログラムはブラウザの上で書けます。専用のアプリとしてパソコンに入れて、そこから動かすこともできます。書いたプログラムは、Bluetooth か USB でハブへ送ります。
| ブロック | Python |
|---|---|
| ずっと | while True: |
| もし 〜 なら | if 〜: |
| 1 秒待つ | wait(1000) |
| 変数を 10 にする | x = 10 |
ブロックの「はさむ形」は、Python では字下げで表します。行の頭を下げた部分が、その中身です。
理由1 細かく決められる ― 速さ・止め方・加速
Pybricks では、モーターの動きを数値で決めます。
| 決めるもの | 書き方 | 意味 |
|---|---|---|
| 速さ | motor.run(360) | 1秒に360度。1秒で1回転 |
| 回す角度 | motor.run_angle(360, 90) | 90度だけ回して止まる |
| 止め方 | then=Stop.HOLD | その位置を保つ。押されても戻る |
| then=Stop.BRAKE | ブレーキをかけて止める。押されても戻らない | |
| then=Stop.COAST | 力を抜く。惰性で止まる | |
| 加速 | motor.control.limits() | 速さの上限、加速のきつさ、力(トルク)の上限を決める |
速さの単位は「1秒に何度回るか」です。パーセントではないので、進む距離を計算で出せます。タイヤの直径が分かれば、何度回せば何 cm 進むかが決まります。
止め方のちがいは、止まったあとのモーターを手で回すと分かります。HOLD は回せず、COAST は軽く回ります。
理由2 Pico と通信できる ― UARTDevice
Pybricks には UARTDevice があります。これを使うと、ハブのポートがシリアル通信の口になります。
from pybricks.iodevices import UARTDevice
from pybricks.parameters import Port
uart = UARTDevice(Port.C, baudrate=115200) # ポート C をシリアル通信に使う
data = uart.read(1) # 1バイト受け取る
つなぐ相手は Raspberry Pi Pico です。Pico でセンサーを読んで計算し、結果だけを SPIKE へ送る。シリアル通信の回でやったメインとサブの分担が、SPIKE と Pico のあいだでもできます。
これで、LEGO のセンサーにないものを SPIKE につなげます。配線とプログラムは、別の回でやります。
理由3 文字で保存できる ― コピーして、使い回せる
Python のプログラムは、ただの文字です。だからコピーが簡単です。必要なところを選んで、別のプログラムに貼りつけるだけで使えます。
いちばん効くのは関数です。「1マス進む」「線をたどる」のように一度作った関数を、次のロボット、次の大会のプログラムへそのまま持っていけます。作るたびに、使える部品が増えていきます。
| できること | 役に立つ場面 |
|---|---|
| コピーして貼りつける | 前に作った関数を、新しいプログラムで使う |
| VS Code で開く | GitHub に保存して、版を残せる。仲間とも共有できる |
| 前の版とくらべる | 動かなくなったとき、どこを変えたかが1行単位で分かる |
| コメントを書く | その数字にした理由を、数字の横に残す |
もう1つあります。Python で覚えた変数・関数・while・if は、Pico のプログラムでもそのまま使う考え方です。書き方は少しちがいますが、組み立ては同じです。
Pybricks を入れる ― ファームウェアを書きかえる
パソコンのブラウザは Chrome か Edge を使います。
| やること | |
|---|---|
| 1 | code.pybricks.com ↗ を開く |
| 2 | 左の歯車を押し、Firmware の Install Pybricks Firmware を選ぶ |
| 3 | Select hub type:SPIKE プライムのハブを選ぶ |
| 4 | Accept licenses:ライセンスに同意する |
| 5 | Configure options:ハブに名前を付ける |
| 6 | Install:画面の手順どおりにハブを更新モードにして、USB ケーブルでつなぐ。一覧からハブを選ぶと、書きこみが始まる |
名前は、ほかのハブと区別できるものにします。教室では同時に何個も動くので、名前が同じだと、どれが自分のハブか分かりません。
Pybricks を入れているあいだ、LEGO の純正アプリではそのハブを動かせません。元に戻すときは、同じ画面の歯車の中にある Restore Official LEGO Firmware を使います。
はじめてのプログラム ― モーターを1回転させる
ポート A にモーターを1個つなぎます。ハブの電源を入れ、画面の Bluetooth のボタンを押して、自分のハブを選びます。
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Stop
from pybricks.tools import wait
hub = PrimeHub()
motor = Motor(Port.A) # ポート A のモーター
motor.run_angle(360, 360) # 1秒に360度の速さで、360度回す
wait(1000) # 1秒待つ
motor.run_angle(360, -360, then=Stop.COAST) # 逆へ1回転。止めたら力を抜く
▶ のボタンを押すと、プログラムがハブへ送られて動きます。
| 行 | やっていること |
|---|---|
| from 〜 import 〜 | 使う部品を呼び出す。毎回、いちばん上に書く |
| hub = PrimeHub() | ハブを使えるようにする |
| motor = Motor(Port.A) | ポート A のモーターに motor という名前を付ける |
| run_angle(360, 360) | 1つめが速さ、2つめが角度 |
| run_angle(360, -360, …) | 角度をマイナスにすると、逆に回る |
止まったあとのモーターを手で回してみます。1回めのあとは回せず、2回めのあとは軽く回ります。then= を書かなければ Stop.HOLD になるからです。
送ったプログラムはハブに残ります。パソコンから離しても、ハブの中央のボタンを押せばもう一度動きます。
動かないときに見るところ ― 症状から原因を引く
| 症状 | 原因 | 対処 |
|---|---|---|
| Bluetooth のボタンを押しても何も出ない | ブラウザが対応していない | Chrome か Edge で開く |
| 一覧に自分のハブが出ない | 電源が入っていない。またはほかのパソコンにつながっている | ハブの電源を入れなおす |
ENODEV と出て止まる | そのポートにモーターがつながっていない | Port.A と、実際にさしたポートを合わせる |
IndentationError と出る | 字下げがそろっていない | 行の頭の空白を、上の行とそろえる |
NameError と出る | 名前のつづりがちがう。または import を書いていない | エラーに出た行と、いちばん上の import を見る |
| 純正アプリからつながらない | Pybricks が入っている | 純正のファームウェアに戻す |
ロボカップジュニア2027 に向けて、レスキュー(災害救助)とサッカーの2種目に取り組みます。プログラミングと電子工作の経験は問いません。