実践ロボットプログラミング
LEGO Mindstorms NXT で目指せロボコン！

WEB：http://robot-programming.jp/
著者：藤吉弘亘，藤井隆司，鈴木裕利，石井成郎
E-mail：support@robot-programming.jp

■LEGO Mindstorms NXTについて

RCX vs. NXT

RIS

NXT

発売時期

1998年

2006年

CPU

H8（8 bit）

ARM7（32 bit）

クロック周波数

16MHz

48MHz

RAM

32KB

64KB

フラッシュメモリ

なし

256KB

転送方法

赤外線通信

USB/Bluetooth

ポート数

入力:3 出力:3

入力:4 出力:3駆動

電池

電池／バッテリーパック

LEGOロボット構成• 入力：タッチセンサ（２個）ライトセンサ、超音波センサ、サウンドセンサ• 出力：モータ（3個）

プログラミング環境

NXT-SW

NXC

■プログラムを作成するにはプログラム実行までの流れ

1. PC上でプログラム(NXT-SW)を作成
2. USB経由でロボットへダウンロード
3. ロボット上でプログラムを実行

NXT-SW• NXT-SW‒ ブロックを並べてプログラムを作成࡞࡯ࡊࡉࡠ࠶ࠢࠨ࠙ࡦ࠼ࡉࡠ࠶ࠢ

㐿ᆎὐࡢ࡯ࠢࠛ࡝ࠕ

■音を鳴らしてみよう

音を鳴らすプログラムのPAD(p.30)• 音を鳴らすアルゴリズム

処理の流れNXT-SWプログラム (p.32: sound.rbt)

■プログラムを実行してみようプログラムの転送

ダウンロードして実行：転送した後、自動的に実行

NXTウインドウ：
NXTウインドウの表示

一部実行：
選択した部分を転送して実行

ダウンロード：プログラムを転送

停止：
実行しているプログラムを停止

プログラムの実行

Runボタン
Stopボタンプログラムの実行• 実行時の注意‒ ロボットの動作より作成したプログラムのアルゴリズムが実現できているか確認‒ ロボットが目的に応じた動作をしないときは、ロボッ
トの動きをよく観察しデバッグすること‒ NXT本体の空きメモリが足りなくなったら不要なファイルを消す

■ロボットの組み立て

ロボットの組み立て(p.39)

Mindstorms組み立て説明書の8-22ページを参考にローヴァーボット型ロボットを作成⿥㖸ᵄ࠮ࡦࠨ 28-31ページ

40-45ページ ࠲࠶࠴࠮ࡦࠨ24-27ページ
ࠨ࠙ࡦ࠼࠮ࡦࠨ࡜ࠗ࠻࠮ࡦࠨ32-35ページ

ローヴァーボット型ロボット

■ロボットを前進させるには(モータ制御1)

モータの接続• NXTの出力ポートAとCにモータを接続

左のモータ：OUT̲C
右のモータ：OUT̲A

前進プログラムのPAD• 10秒前進するアルゴリズム

処理の流れモータ制御によるロボットの前進 (p.42: forward.rbt)

■ロボットを回転させるには (モータ制御2)

回転• ロボットを右に回転させるには

順方向

逆方向

右回転プログラムのPAD• 右回転するアルゴリズム
右回転

前進

10秒間保持停止

処理の流れ
Cのモータ順回転
Aのモータ逆回転2秒間保持停止

モータの制御２ (p.45: rotation.nxc)

ロボットを90度回転させるには• 90度回転させるには？
→保持させる時間とモーターパワーを調節する0.5秒に変更

一周するには？

回転回転

前進

前進

前進

回転
回転
前進

一周するプログラムのPAD (p.47)

一周

4回繰り返す前進

10秒間保持停止

処理の流れ
Cのモータ順回転
Aのモータ逆回転

0.5秒間保持停止

プログラム（一周）• 一周するには→前進と回転を4回繰り返せばよい

■■

演習問題4-5 (p.49) ■■• スパイラルや星形の軌跡を描くロボットの動きを実現

■障害物回避(タッチセンサ)

タッチセンサ

タッチセンサの原理
対象物にぶつかりタッチセンサが押されると中のプッシュスイッチが押されスイッチがＯＮとなる

タッチセンサの接続• NXTの入力ポート１タッセンサを接続タッチセンサによる障害物回避
1. 常にロボットを前進→無限ループの利用

2. タッチセンサが押されたら，障害物と判定→

3. 衝突と判定したら，一定時間後退し，右回転．
その後1. に戻る

条件分岐

PADによるアルゴリズムの図示 (p.50)

条件分岐：スイッチブロック

条件を満たす（真）と上段を実行
それ以外は下段を実行

タッチセンサによる障害物回避 (p.52: touch.rbt)

タッチセンサによる障害物回避 (p.52: touch.rbt)

■障害物回避(超音波センサ)

超音波センサによる障害物回避超音波センサ

超音波センサの測定原理
超音波を発信し、対象物で反射した超音波を受信し、この音波の発信から受信までの時間を計測することで対象物までの距離を計測

超音波センサの接続• NXTの入力ポート4に超音波センサを接続

超音波センサによる障害物回避
1. 常にロボットを前進→無限ループの利用

2. 障害物との距離が30cmより小さいとき，右回転，その後1. に戻る→後退する動作を必要としない

超音波センサによる障害物回避のPAD

超音波センサによる障害物回避 (p.56: usonic.nxc)

超音波センサによる障害物回避 (p.56: usonic.nxc)

■サウンドセンサによる制御

サウンドセンサ• サウンドセンサの出力‒ 音のない状態を0として0〜100までの値

サウンドセンサによる制御のPAD

サウンドセンサによる制御 (p.58: mic.nxc)

待機ブロックの種類① 時間ブロック ：設定した時間だけ待機② タッチブロック：設定した条件をタッチセンサが満たすまで待機③ 照明ブロック ：設定した条件をライトセンサが満たすまで待機④ 音ブロック：設定した条件をサウンドセンサが満たすまで待機⑤ 距離ブロック ：設定した条件を超音波センサが満たすまで待機■ライントレース

ライトセンサ• 赤色LEDの反射光の量を数値で表す

ライトセンサ

ライトセンサの原理
発光ダイオードの光が対象物にぶつかり反射する。その反射の光量をフォトダイオードが検知し計測する

ライトセンサの接続• NXTの入力ポート3にライトセンサを接続ライントレースの考え方• 白(明るい)ところでは右回転，黒(暗い)ところでは左回転ライントレースのPAD• 白(明るい)ところでは右回転，黒(暗い)ところでは左回転をするプログラムのアルゴリズム

ライトセンサによるライントレース (p.62: line-tracer.rbt)

ライトセンサによるライントレース (p.62: line-tracer.rbt)

ライントレースの改良

カラーセンサ（LEGO社）• 赤・青・緑の照明を照射して、反射光を読み取るカラーセンサ（LEGO）によるモータ制御

無限ループ

ポート3のカラーセンサで黄色を判断して分岐3

カラーセンサ（HiTechnic社）

センサ

発光ダイオード

カラーセンサの原理
発光ダイオードの光が対象物にぶつかり反射する。その反射の光をセンサが検知し計測する

カラーセンサ（HT）によるモータ制御

Mode: Passive(光源を使用0-17)
Passive(光源を使用しない0-17)
Raw(光源を使用、読み取り値)

無限ループ

ポート3のカラーセンサで黄色を判断して分岐カラーセンサ比較
LEGO社

HT社

色の値（0-17）
赤色の値
緑色の値
青色の値
白色の値

■ディスプレイ表示

テキストの表示• 超音波センサの値を液晶ディスプレイに表示‒ デバッグに重要超音波センサ値を表示

超音波センサ値を表示 (p.67: display-text.rbt)

超音波センサ値を表示 (p.67: display-text.rbt)

データワイヤとデータハブ
データワイヤの色と意味
黄：数値
緑：ロジック（正偽値）
オレンジ：テキスト（文字）図形の表示図形を表示 (p.70: display̲ﬁg.rbt)

図形を表示 (p.70: display̲ﬁg.rbt)

■■

演習問題5-1■■• 障害物までの距離が小さくなるほど大きくなる円を表示

■マイブロックマイブロック化(p.74)①マイブロック化したい複数のブロックをドラッグにより選択②”マイブロック作成”というボタンを押す③マイブロックの名前やアイコンを決定マイブロックの利用(p.74)

カスタムパレットからマイブロックをワークエリアにドロップマイブロック間のデータのやりとり(p.75)
マイブロックへの入力：ライトセンサ2とライトセンサ３の値
マイブロックの出力 ：テキスト（平均値）
マイブロック

■並列タスクPADによる並列タスクの図示• 並列タスクシングルタスク• シングルタスクと並列タスク→ライントレースと障害物回避を同時に行うには並列タスク化する

PADによる並列タスクの図示• 並列タスク並列タスク (p.84: parallel̲task1.rbt)

プログラムの並列化：シーケンスビームを並行に並べる

並列タスクにおける問題• 命令の衝突（コンフリクト）‒ タスクAがタスクBの実行を妨害‒ 同時にモータを制御セマフォ（信号灯）

セマフォ（信号灯）

セマフォ（信号灯）

セマフォ（信号灯）

セマフォによる並列タスクのコンフリクトを回避セマフォによるコンフリクト回避セマフォによるコンフリクト回避 (p.90: parallel̲task2.rbt)

セマフォによるコンフリクト回避 (p.90: parallel̲task2.rbt)

セマフォによるコンフリクト回避 (p.90: parallel̲task2.rbt)

■See you CU-Roboocon !