Raspberry Pi 5 でLEGO Mindstorms NXTを操作する

## 目的
LEGO Mindstorms NXTを入手してWindowsから黒線をトレースするプログラムは動くようになった。
Raspberry Piから繋げる方法がないか探しているとNXT-Pythonというモジュールを見つけたので、Raspberry PiからBlueToothを使ってワイヤレスでNXTへ接続して動かすことが出来るか試してみた。

## 環境
本体　　　　　　: Raspberry Pi 5
メモリ　　　　　: 8GByte
言語　　　　　　: Python
ライブラリ　　　: [NXT-Python](https://github.com/LEGO-Robotics/NXT-Python)
LEGO Mindstorms : [NXT 2.0](https://www.lego.com/ja-jp/service/help-topics/article/lego-mindstorms-nxt-software-downloads)
ソース　　　　　: [https://github.com/roxa-delphi/LEGO/tree/main](https://github.com/roxa-delphi/LEGO/tree/main)

## Pythonの仮想環境を作る
```
% python -m venv lego
% source lego/bin/activate
```
## NXT-Pythonのインストール
```
% python -m pip install --upgrade nxt-python
```

## USBを使ってNXTへ接続する
NXT-PythonがUSBへアクセスするための許可を設定する
```
% sudo cp 60-libnxt.rules /etc/udev/rules.d/
% sudo udevadm control --reload
% sudo udevadm trigger
```
Raspberry PiとNXTをUSBで接続して、nxt-test コマンドを実行して接続できることを確認した。

## BlueToothで接続するための設定
python3-bluez モジュールをインストールして、仮想環境で使用するための設定を行う
```
% sudo apt install python3-bluez
% cd lego/lib/python3.11/site-packages
% ln -s /usr/lib/python3/dist-packages/bluetooth
```
nxt-test コマンドを実行するとBleetoothのアドレスが分かるので、
```
% nxt-test
Finding brick...
NXT brick name: NXT
Host address: 00:16:53:0F:59:9F
Bluetooth signal strengths: (0, 0, 0, 0)
Free user flash: 55844
Protocol version 1.124
Firmware version 1.31
Battery level 7644 mV
Play test sound...done.
```
.nxt-python.confファイルを作る。
```
[default]
host = 00:16:53:0F:59:9F
```
BlueToothのPINコードの設定をする
```
% bluetoothctl
# agent DisplayYesNo
Agent is already registered
# default-agent
Default agent request successful
# scan on
Discovery started
[CHG] Device 00:16:53:0F:59:9F RSSI: -41
# scan off
# pair 00:16:53:0F:59:9F
Attempting to pair with 00:16:53:0F:59:9F
Request PIN code
[agent] Enter PIN code: 1234
[CHG] Device 00:16:53:0F:59:9F Bonded: yes
[CHG] Device 00:16:53:0F:59:9F Paired: yes
Pairing successful
[CHG] Device 00:16:53:0F:59:9F Connected: yes
[CHG] Device 00:16:53:0F:59:9F Connected: no
# connect 00:16:53:0F:59:9F
Attempting to connect to 00:16:53:0F:59:9F
[CHG] Device 00:16:53:0F:59:9F Connected: yes
[CHG] Device 00:16:53:0F:59:9F UUIDs: 00001101-0000-1000-8000-00805f9b34fb
[CHG] Device 00:16:53:0F:59:9F ServicesResolved: yes
Failed to connect: org.bluez.Error.NotAvailable br-connection-profile-unavailable
# trust 00:16:53:0F:59:9F
Changing 00:16:53:0F:59:9F trust succeeded
[CHG] Device 00:16:53:0F:59:9F ServicesResolved: no
[CHG] Device 00:16:53:0F:59:9F Connected: no
# exit
```
LEGOのモーターをBポートに繋いで、前に1回転し、後ろに1回転動かすようにプログラムして動作確認をする。
ソースは　[https://github.com/roxa-delphi/LEGO/blob/main/motor2.py](https://github.com/roxa-delphi/LEGO/blob/main/motor2.py)
```
% python motor2.py
```
これでUSBなどのケーブルを繋がずに、BlueToothを使ってワイヤレスでRaspberry PiからNXTを操作できるようになった。

## Linus Atorf’s MotorControl を使ってみる
NXT-Pythonから使える、モーターを楽に使うためのライブラリを使ってみる。
[https://github.com/schodet/MotorControl](https://github.com/schodet/MotorControl) から MotorControl22.rxe をダウンロードして、このファイルをNXTへ転送する。
```
% nxt-push MotorControl22.rxe
```
## 黒い線をトレースして動く[ライントレーサー](https://github.com/roxa-delphi/LEGO/blob/main/linetrace.py)を作る
LEGOは、
NXTからポートBを右モーターへ、ポートCを左モーターへ繋ぐ。
カラーセンサーをポート3に繋ぐ。
ソースは [https://github.com/roxa-delphi/LEGO/blob/main/linetrace.py](https://github.com/roxa-delphi/LEGO/blob/main/linetrace.py)
センサーで取り込んだ色が黒のときは右回転、黒以外のときは左回転するようにプログラムした。
```
% python linetrace.py
```
![linetrace.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/ce14ea40-f36f-4dc7-961b-7d5042ff09ac.gif)


Raspberry PiからワイヤレスでNXTを制御できるようになった。