Pybricks Codeでモーターやセンサーの制御プログラムを作る

[前回](https://qiita.com/inachi/items/b2a351f5a3ed28654293)の続きで、Pybricks Codeを使って簡単な制御プログラムを作成する例を示します。

# ファイルの新規作成

新規ファイルを作成するには左ペインの上にある + 記号をクリックします。

![スクリーンショット 2023-12-13 21.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/dd5ccc75-e258-bdb4-8b53-a9d1f729a56e.png)

ファイル名を入力して「Create」ボタンをクリックします。 


![スクリーンショット 2023-12-13 22.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/5adad794-faba-3fc0-7f57-457bc2b509bd.png)

「Use a Template」が有効になっていれば、指定のハブ用のテンプレートが展開されたファイルが作成されます。

![スクリーンショット 2023-12-13 22.03.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/bb4b558c-231a-82e8-0015-03033ed6d56c.png)

テンプレートでインポートされるのは次のものです。ハブによって違うのは、ハブ用のクラスぐらいですから、ハブのクラス名を変更するだけで、他のハブにも大部分流用できます。

* TechnicHub -- 選択したハブ用のクラスです<br>オブジェクトは変数 `hub` に設定されます 
* Motor -- モーターのクラスです
* Button, Color, Direction, Port, Side, Stop -- モータやセンサーに指定するパラメータ値
* DriveBase -- 車体の走行制御のためのクラス
* wait, StopWatch -- 時間に関する関数、クラス

ハブ用のクラスには次のものがあります。

| ハブ | ハブ用のクラス | 備考 |
|-----|-------------|-----|
| ラージ　ハブ | PrimeHub |   |
| Robot Inventer Hub | InventerHub | PrimeHub と名前は違うだけ |
| スモール ハブ | EssentialHub |  |
| Technic ハブ | TechnicHub |  |
| City ハブ | CityHub | |
| Boost ハブ | MoveHub | |

# ハブの LED をLチカ

ハブ自体の制御例として、Lチカのコードを示します。

```python
from pybricks.hubs import TechnicHub
from pybricks.parameters import Color
from pybricks.tools import wait

# ハブを初期化
hub = TechnicHub()

# ライトの点灯と消灯を繰り返す
while True:
    hub.light.on(Color.RED)  # ハブのLEDを赤色に点灯
    wait(1000)  # 1秒待機

    hub.light.off()  # ハブのLEDを消灯
    wait(500)  # 0.5秒待機
```

コードを入力しらた Bluetooth アイコンをクリックしてハブに接続します。

![スクリーンショット 2023-12-13 22.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/9e38089f-6346-dd71-6ef6-bfb90f0c3239.png)

接続できたら Run アイコンをクリックします。スクリプトをバイトコードにコンパイルした後にハブに転送され、実行が開始されます。Run 指示するのはメインとなるスクリプトにしてください。その他の依存スクリプトはインポート関係から自動的に判定して転送されます。

スクリプトが一度転送されたら、Pybrick Code なしで、スタンドアローンで実行できます(ハブのボタンを２回押します)。

実行を中断するには Stop アイコンを押します。スタンドアローンで動作している場合はハブのボタンを押すことで中断できます。長押しで電源断となります。

なお、各ハブの内蔵機能APIの詳細は[ここ](https://pybricks-api-ja.readthedocs.io/ja/latest/hubs/index.html)を参照してください。

# 入出力ポート

ハブにはセンサーやモーターを繋げる「ポート」が複数用意されています。ポートの仕様は、Pybricks Codeがサポートするハブで共通しているので、センサーやモーターをハブ間で使いまわせます。

![スクリーンショット 2023-12-13 22.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/da4e121d-91c1-d0f1-269b-218c58593431.png)

ポートのピン構成は次のようになっています。

| ピン | ラベル | 機能 |
|----|-----|-----|
| 1 | M1 | モータ出力用 |
| 2 | M2 | モータ出力用 |
| 3 | GND | グラウンド |
| 4 | VCC | 3.3V |
| 5 | D1 | UART(ハブ→デバイス) |
| 6 | D2 | UART(デバイス→ハブ) |

# モーターの制御例

ポートに繋いだモーターを制御する例を示します。
モータのAPIはどのハブでも共通なので、次のコードはどのハブでも実行できます。

```python
from pybricks.pupdevices import Motor
from pybricks.parameters import Port
from pybricks.tools import wait

# ポート A に繋いだモーターの初期化。
example_motor = Motor(Port.A)

# モーターを時計回りに 500°/s で動作させる。
example_motor.run(500)

# ３秒待機。
wait(3000)

# モーターを反時計回りに 500°/s で動作させる。
example_motor.run(-500)

# ３秒待機。
wait(3000)
```

![IMG_7217.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/fd86fd23-1132-aaef-1668-893ac6a9466e.jpeg)

モーターのAPIの詳細は[ここ](https://pybricks-api-ja.readthedocs.io/ja/latest/pupdevices/motor.html)を参照してください。

# センサーの制御例

ポートに繋いだセンサーの例として、カラーセンサーを取り上げます。

```python
from pybricks.pupdevices import ColorSensor
from pybricks.parameters import Port
from pybricks.tools import wait

# ポート A に繋いだカラーセンサーを初期化。
sensor = ColorSensor(Port.A)

while True:
    # 色と反射光を読み取る。
    color = sensor.color()
    reflection = sensor.reflection()

    # 計測した色をと反射光を表示。
    print(color, reflection)

    # 値が読み取れたか分かるよう、少し待機。
    wait(100)
```

※ print()関数による表示は Pybricks Codeのコンソール領域で確認してください。

![IMG_7218.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/5631ff97-bb38-89c9-f245-71f9ee5e0724.jpeg)

カラーセンサーAPIの詳細は[ここ](https://pybricks-api-ja.readthedocs.io/ja/latest/pupdevices/colorsensor.html)を参照してください。

# 次はマルチタスク制御

次回はマルチタスク制御について書く予定です。