目的
LEGO Mindstorms NXTを入手してWindowsから黒線をトレースするプログラムは動くようになった。
Raspberry Piから繋げる方法がないか探しているとNXT-Pythonというモジュールを見つけたので、Raspberry PiからBlueToothを使ってワイヤレスでNXTへ接続して動かすことが出来るか試してみた。
環境
本体 : Raspberry Pi 5
メモリ : 8GByte
言語 : Python
ライブラリ : NXT-Python
LEGO Mindstorms : NXT 2.0
ソース : 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
% python motor2.py
これでUSBなどのケーブルを繋がずに、BlueToothを使ってワイヤレスでRaspberry PiからNXTを操作できるようになった。
Linus Atorf’s MotorControl を使ってみる
NXT-Pythonから使える、モーターを楽に使うためのライブラリを使ってみる。
https://github.com/schodet/MotorControl から MotorControl22.rxe をダウンロードして、このファイルをNXTへ転送する。
% nxt-push MotorControl22.rxe
黒い線をトレースして動くライントレーサーを作る
LEGOは、
NXTからポートBを右モーターへ、ポートCを左モーターへ繋ぐ。
カラーセンサーをポート3に繋ぐ。
ソースは https://github.com/roxa-delphi/LEGO/blob/main/linetrace.py
センサーで取り込んだ色が黒のときは右回転、黒以外のときは左回転するようにプログラムした。
% python linetrace.py
Raspberry PiからワイヤレスでNXTを制御できるようになった。