第3 章

BricxCC
統合開発環境

本章では，B r i c x C C の開発環境についての構築方法と基本的な環境設定，それに主な機能群について紹介します．この BricxCC の機能に何があるかを知っているだけでも効率アップにつながります．まずは，ここに記述されている内容を一読しておいてください．

3-1

BricxCC のプログラミング開発環境構築

まず，BricxCC を利用するための PC 上の環境構築の説明を行います．ここでは，BricxCC のインストールから，立ち上げ時の操作，および BricxCC の画面説明について紹介していきます．このインストールは，Windows PC 上の環境構築となるので，正しい手順に沿って作業を進めていってください．

（ 1 ） BricxCC のインストール
それでは，BricxCC のインストールを行ます．PC をインターネットに接続し，以下の「 Bricx
Command Center3.3 」サイトにアクセスしてください．
http://bricxcc.sourceforge.net/
アクセスすることで図 3-1-1 に表示された画面が出てきます．BricxCC をインストール開始する

拡張NBC/NXC
ファーム・ウェア

図 3-1-1
Bricx Command Center 3.3 のWeb サイト
BricxCC最新バージョン・サイト
第3 章

BricxCC 統合開発環境

25

第4 章

ロボットを動かす

本章では，P C 上で簡単なプログラムを作成し，ロボットを動かすまでの流れを説明していきます．ここでは，2-3 節で説明した NXT ロボットの 3 輪車モデル Tribot（トリボット）を使い，両輪のモータ（アクチュエータ）を動かし，前進・後退するプログラムの作成事例を紹介します．このモータは，NXT ロボットにとっては出力機能となります．
ここでは，プログラムの作成から，コンパイル，エラーが出たときのデバッグ（プログラムのミスを見つけて修正すること），再コンパイル，そして NXT ロボットへのプログラムのダウンロード，さらにプログラムを実行するまでの一連のプロセス（過程・工程）を学んでいきます．
また，完成したプログラムを修正し，N X T が新たな動きをする，より複雑に動かすにはどうするかを学んでいきましょう．
プログラムが理解できるようになれば，どんどん先に進んでみてください．さらに課題で実力を確認してみてください．プログラム作成が楽しくなるには，自らが独創的に考え，思うようにロボットが動かせるようになることです．
「よく考える」ことこそ，プログラム作成では重要で，将来のための自らの財産と思って，トレーニングを積んでください．

4-1

ロボットの前進と後退

ここでは初心者向けに，簡単にロボットを前進させたり，後退させたりするプログラムの作成から，コンパイル，ダウンロードなどについて説明していきます（図 4-1-1 ）．

（ 1 ） BricxCC を使って NXC プログラムの作成
それでは，PC 上の BricxCC を立ち上げ，NXC プログラムを作成していきます．リスト 4-1-1 に記述してあるプログラムを作成してみてください．このプログラムは，ロボットを 2 秒前進させ，その後 2 秒後退させる単純なプログラムです．
前進 2 秒

図 4-1-1
ロボットの前進と後退

44Ⅱ．基礎編

後退 2 秒ファイル名

リスト4-1-1

前進と後退のプログラム

1. task main()
2. {3.

OnFwd(OUT_AC,75);

4.

Wait(2000);

5.

OnRev(OUT_AC,75);

6.

Wait(2000);7.

Off(OUT_AC);

プログラム
エディタ画面8. }図 4-1-2

エディタ画面上の NXC コーディング

作成手順としては，まず B r i c x C C を立ち上げ，図 4-1-2 にあるメニュー・バーの「 F i l e 」から「 New 」を選択し，プログラム・エディタ画面でプログラムを作成していきます．
次に，プログラム内容について詳細な説明をしていきます．
まず，1 行目の「 task 」は，タスク（仕事）と呼び，2 行目と 8 行目の中括弧（波括弧）「 { 」と「 } 」内に一つひとつのステートメント（文）を定義していきます．
「 task main() 」の「 main 」（メイン）はタスク名で，NXC プログラム中で最初に実行するタスクとなり，開発するプログラム内に必ずこの「 task main() 」（メイン・タスク）が一つのみ定義する必要があります【注意：この「 task main() 」は標準 C 言語の「 void main() 」にあたる】．次の 3 行目「 OnFwd(OUT_AC,75); 」の「 OnFwd 」は，あらかじめ NXC に組み込まれた内部関数で，モータを駆動させるものです．ここではカンマで区切られた二つの引数（パラメータ）を設定しています．最初の引数「 OUT_AC 」は，後で説明する出力ポート A と C を両方定義したもので，両輪のモータを設定していることを意味します．次の「 75 」は，モータのパワーを設定する数値パラメータとなります．次の 4 行目の「 Wait(2000); 」は，2 秒間待機（継続）を意味します．この「 Wait 」も NXC の内部関数となります．
それでは，ここでの内部関数をまとめておきます．
【内部関数】
前進 ： OnFwd(出力ポート, パワー);後退 ： OnRev(出力ポート, パワー);
停止 ： Off(出力ポート);
待機 ： Wait(継続時間);

第4 章

ロボットを動かす45ここでの引数となる出力ポートとパワーは，次のような具体的な設定となります．
出力ポート：NXT 本体の上部にある接続コード記号（ A，B，C の三つを指す）
OUT_A，OUT_B，OUT_C，
OUT_AB，OUT_AC，OUT_BC，OUT_ABC の 7 通り
パワー：モータの動力の設定パワー（単位はなし）
0 〜 100（ -100 〜 0 の設定も可能）（ 2 ） NXC プログラムの保存とコンパイル
作成したプログラムは，ファイル名を付けて保存しておく必要があります（ファイルの拡張子は「 nxc 」となる）．メニュー・バーの「 File 」から「 Save as」を選択して，ファイル名を付けて，保存してください【注意：ファイル名が付けられていない場合，コンパイル・エラーが出ることがある】．
次に PC と NXT 本体との接続が必要となります．この接続は，USB ケーブルによるものか，無線による Bluetooth 機能を使うかのいずれかとなります．初心者は USB ケーブルにて接続する方法をお勧めします．ケーブルを接続してから，メニュー・バー「 Tools 」é「 Find Brick 」で NXT 接続設定を行ってください．接続されたかどうかは，同じ「 Tools 」の「 Find Brick 」がグレー表示されているか，ステータス・バーに接続された情報が表示されるかで確認できます．正しく接続されている場合には，ステータス・バーの接続名に「 USB0 」（ USB ケーブルの場合）などか「 BTH 」（ Bluetooth の場合）の表示のいずれかと NXT の名前（ NXT 名）が表示されます（図 4-1-2 参照）．
次にコンパイルを行います．このコンパイルは，メニュー・バー「 Compile 」é「 Compile 」を選択して実行します．または，ファンクション・キー「 F5 」を押すか，アイコン・メニューの中の「」を選択してもコンパイルを行うことができます．
【コンパイル】（以下の方法のいずれか）① メニュー・バー「Compile」é 「Compile」② ファンクション・キー「F5」③ アイコン・メニュー「」

エディタ画面の下にコンパイル・エラーが発生した場合には，コーディングになんらかの文法的な間違いがあることが考えられます．またはファイル名を付けていない場合もエラーが表示される場合があります．
よくあるエラーとしては，処理文の終わりのセミコロン「 ; 」の抜けや，中括弧「{ 」や「 } 」の抜444444444

け，内部関数やコーディングのスペル・ミスなどが考えられます．また，2 バイトの空白文字（全角スペース）が入っている場合には，エラーを見つけ出すのが難しく，よく初心者にありがちなエラーとなります（参考：全角スペースを 2 文字の半角スペースに変換する場合には，BricxCC のエデ
ィタ上で「 Ctrl+R 」キーを押し，「 Replace text 」（文字列の変換）画面を表示させ置換する）．
本章の終わりの「 COLUMN 4-1

プログラムのデバッグ」には，デバッグしやすい環境設定についてまとめてあるので参考にしてください．
46

Ⅱ．基礎編

（ 3 ） NXT ロボットへのプログラムのダウンロード
正しくプログラムがコンパイルされたら，次は NXT 本体にプログラムをダウンロードします．前
述したように，BricxCC 画面のステータス・バーに，PC とNXT が正しく接続されているかどうかを確認してください．また未接続の場合には，接続名に「 no port 」と表示されます．この場合には，USB ケーブルが未接続か，NXT の電源が Off の状態などが考えられるので，確認・修正し，メニュー・バーの「 Tods 」é「 Find Brick 」もしくは「 Shift ＋ ctrl ＋ F3 」で再接続を実行してください．
そ れ で は N X T にプ ロ グ ラ ムをダ ウ ン ロードす る た め に，メ ニュー・バー「 C o m p i l e 」é「 Download 」を選択するか，ファンクション・キー「 F6 」を押します．または，アイコン・メニューの「」を選択します．
【ダウンロード】（以下の方法のいずれか）① メニュー・バー「Compile」é 「Download」② ファンクション・キー「 F 6」
③ アイコン・メニュー「」【注意：NXT 本体に，プログラムやファイルなどを 64 個以上保存しようとしたり，256K バイト以上のファイル容量を保存しようとしたりすると，新たなプログラムのダウンロードはできなくなる．
この場合にはメニュー・バー「 Tools 」é「 NXT Explorer 」（ NXT エクスプローラ）で，NXT 本体の中の不要なファイルを削除するか，PC に移動する】（ 4 ） NXT ロボットのプログラム実行
それではN X T にダウンロードされたプログラムを実行してみましょう．U S B ケーブルが接続されている場合やBluetooth が接続されている場合には，メニュー・バーの「 Compile 」é「 Run 」を選択するか，ファンクション・キー「 F7 」を押します．またはアイコン・メニューの「」を選択します．

ここで USB ケーブルを引き抜いた状態でも実行できます．この場合には，NXT 本体のディスプレイ上の「 My Files 」を選択し，「 Software Files 」の中から，PC 側で付けたファイル名を表示させて実行（オレンジ）ボタンを押します．
【プログラムの実行】（以下の方法のいずれか）■USBケーブルかBluetooth接続状態の場合① メニュー・バー「Compile」é 「Run」② ファンクション・キー「 F 7」
③ アイコン・メニュー「」■USBケーブルを切り離した場合④ NXTの【実行】（オレンジ）ボタンを数回押す思ったとおりに前進と後退ができたでしょうか．
第4 章

ロボットを動かす

47

第5 章

ロボットを複雑に動かす

前章では，簡単なプログラミングとして，N X T ロボットの前進と後退，それに停止について学びました．本章では，N X T ロボットを少し複雑に動かしてみましょう．例えば，旋回させたり，渦巻き状に動かしたり，正方形上に動かしたりしてみましょう．さらに，初歩的な段階での，センサの使い方や，N X T 本体のディスプレイ機能やサウンド機能についても学んでいきます．応用編
では，より高度な使い方を紹介しているので，部分的にのぞいてみてはいかがでしょうか．
ここでは，Ｃ言語の基本制御（コントロール）を行う文（ステートメント）を学んでいきます．この基本制御の中の繰り返し文は，プログラム処理を繰り返すときに使うもので，ロボットを複雑に動かすことができるようになります．
また，ここではプログラムの見やすさを学びます．プログラムは，自分自身が関係したり，場合によってはほかの人が関係したりして，時間が経った後でも利用することがあります．このためにプログラムの見やすさは重要な意味をもちます．この方法として，コメントの記述方法や，中括弧「 { …… } 」を使った入れ子の表現，それに各行の段下げを行うインデントについて学びます．
それでは，NXT ロボットの動きをまず想定し，どうプログラミングしていくかを学んでいきましょう．
プログラミング作業は，想定した動きを実現化する作業となります．モノづくりでは，この想定・計画するものを初期段階で図化したり文書化したりします．これが設計段階と呼ばれ，ときにみんなで議論し，知恵を絞って，具体化していく作業となります．場合によっては，試行錯誤といったことも行いながら作業を進めていくこともあります．ここでは，一部フローチャートを記載しています．このフローチャートは，設計の初期段階での図化，つまり「見える化」の作業となり，プログラム設計の一つの手法となります．

5-1

ロボットの旋回（簡単なプログラミング）

前述したロボット T r i b o t の片方の車輪を一時停止したり，逆回転で動かすことで，ロボット自体を回転させたり，旋回させたりすることができます．
このことで，ロボットの動きに，直進，左旋回，直進といった動きを与えてみましょう（図 5-11 ）．どういったプログラムになるでしょうか．
すでに，第 4 章で学んできた内容で，ここでのプログラムはできます．トライしてみてください．
回答は一つとは限りません．リスト 5-1-1 にその例のプログラムを記載しておきます．
それでは，プログラムをコンパイルし，NXT 本体にプログラムをダウンロード・実行してみまし54Ⅱ．基礎編

④ 停止

② 左旋回

③ 直進
① 直進

図 5-1-1

左旋回直進
リスト5-1-1

直進＋左旋回＋直進のプログラム

1.

task main()

2.

{

3.

OnFwd(OUT_AC,75);

4.

Wait(1000);5.

Off(OUT_C);

6.

Wait(1000);

7.

OnFwd(OUT_AC,75);

8.

Wait(1000);9.
10.

Off(OUT_AC);

}
}}

① 直進

② 左旋回

③ 直進
④ 停止}

ょう．②の左旋回はどうなりましたか．どの程度左旋回したでしょうか．また，タイルやカーペッ
ト，畳などの違う床材の上で，どのように旋回するかも見てみましょう．床面が異なると，必ずしも同じ回転角度で旋回していないのがおわかりでしょうか．つまり，回転角度を思ったとおりにするには，いろいろと試行錯誤の調整が必要で，特に②の中の「 Wait 」の待機時間の数値を変えることになります．
その他，モータ・パワーの大きさやバッテリ状態によっても，回転角度は変わることがあるので注意してください（第８章で紹介する N X C の高度なモータ制御関数群を使えば，精度を高めた回転角度が制御できるようになる）．

5-2

繰り返しの動き（わかりやすいプログラミング）

ここでも，先に図 5-2-1 にある NXT ロボットの動きを見てもらい，どうプログラミングしていくかを考えていきましょう．この図を見て，どのようなことが必要か，どうすれば解決できるか．常に考える習慣を身に付けてプログラミングするようにしてください．いきなりプログラムを作成す
第5 章

ロボットを複雑に動かす55

リスト7-5-3

暗くなると音発生

1. #define LIMLIGHT 70
2. task main()
3. {4.

SetSensorLight(S3,false);

5.

while(true)

6.

{
if(SENSOR_3<LIMLIGHT)

7.
8.
9.

PlayTone(262,100);// 暗くなると音を出す}

10. }リスト7-5-4

光センサ値に合わせた速度処理

1. task main()
2. {3.

SetSensorLight(S3,false);

4.

while(true)

5.

{

6.
7.

OnFwd(OUT_AC,SENSOR_3);}
図 7-5-1

8. }光センサで取れた動的グラフの表示て棒グラフを描いています．
また，このグラフを動的にするために，14 行目と 15 行目とで，値を一つずつずらし，新たな光センサ値を最終配列値の「 dx[9] 」に設定しています．
それでは，実際に動かして動的になるかどうかを確認してみてください．
このプログラムは，いろいろと応用が効くので，ほかのセンサでも使いまわしてどうなるか試してみてください．また，22 行目の待機時間も少し変更したらどうなるかも試してみてください．

7-6

カラー・センサを使いこなす

カラー・センサは，すでに表 7-2-5 で紹介したように，色識別（カラー判定）機能と，光センサと同じ光測定機能の二つの測定値が取り出せます．また，カラー・センサには，3 色（赤，緑，青）のLED が付いていて，全 LED の点灯と消灯，それに単独の LED の点灯の切り替えができ，全 LED点灯のみ色識別を行い，その他は光測定となります．色識別の機能は，6 色（黒：1，青：2，緑：3，黄：4，赤：5，白：6 ）を区別します．ただ，中間色や混合色だと，識別が正しくできない場合があります．
第7 章

センサを制御する

105

第8 章

高度なモータ制御

モータは駆動部品の一つで，ロボットを動かす上で欠かせない出力装置です．ロボットをより高度で複雑に動かすには，いろいろと高機能なモータを使う必要があります．例えば，瞬時に回転させたり，速度を一定にしたり，また回転角度や回転数で制御したり，さらに複数モータの同期（シンクロ）をとって動かしたりするモータが必要となる場合があります．これらの機能を使って，センサを使った倒立ロボットや正確に移動するロボットなどが実現できるようになります．
2-1 節で紹介したように，標準の NXT 製品には，高性能な光エンコーダを内蔵するアクチュエータと呼ばれる動力部品が 3 個付属しています．このアクチュエータは，回転角度を制御したり，互いの同期をとったりすることができます．このことで正確な回転・距離移動や複雑な制御などが可能となります．
NXC でもこのアクチュエータを制御する関数群が多く用意されていて，簡単な前進・後退・停止から，両輪の同期，正確な距離移動，それに複雑な PID 制御ができるようになっています．
本章では，これらNXC の関数群でも簡単に操作・制御できるいくつかの関数群を紹介しましょう．
特に正確な移動距離の制御ができれば，直角に曲がる方法や，円を描くことができるようになります．ただし，注意事項として，バッテリが少なくなったり（パワー不足）した場合や，床の材質が滑りやすかったり摩擦が多かったりした場合には，直角に曲げたり，円を描いたりすることは難しくなります．その点を気にしながら，プログラミングを進めていってください．
この章でも Tribot（トリボット）を使って説明していきます．

8-1

調整機能をもつモータ制御（ OnFwdReg ）第 4 章では，二つのパラメータ（出力ポートとパワー）でモータを制御する「 OnFwd 」と「 OnRev 」
を紹介しました．この関数群では，床の材質などによっては，左右のモータが同じような動きをせずに，右にずれたり，左にずれたりし，直線で動かすことが難しかったと思います．
ここでは，NXC が用意しているモータ制御関数のうち，モータを調整する制御機能の「 OnFwdReg 」と「 OnRevReg 」について紹介しましょう．
この二つの関数は，モータの調整（ Regulate ）を取りながら制御していく関数で，以下の引数（出力ポート，パワー，調整）をもったものとなります．

114

Ⅲ ．応用編【調整機能をもつモータ制御関数】
OnFwdReg(出力ポート, パワー, 調整);// モータ前進の調整制御

OnRevReg(出力ポート, パワー, 調整);// モータ後退の調整制御

ここで調整は，「出力ポートの調整モード定数」で以下のとおり．
OUT_REGMODE_IDLE：調整なし

OUT_REGMODE_SPEED：スピード調整OUT_REGMODE_SYNC：同期調整

この関数の引数で，出力ポートとパワーは，すでに 4-1 節で説明してきました．ここでは，調整に関する引数について三つの調整パラメータ「 OUT_REGMODE_IDLE 」，「 OUT_REGMODE_SPEED 」，「 OUT_REGMODE_SYNC 」を紹介します．
まず「 OUT_REGMODE_IDLE 」は，アイドリング（ idle ）状態のことで，モータの調整をしない機能となります．次の「 OUT_REGMODE_SPEED 」は，スピードを調整する制御で，実際にはパワーを一定に保つように制御する機能となります．つまり，前の「 OUT_REGMODE_IDLE 」では，動いている状態のパワーは指定した値ではなく，近い値で動きますが，この「 OUT_REGMODE_SEPPE 」は，指定されたパワーで制御を保ちます．
また，「 O U T _ R E G M O D E _ S Y N C 」は，指定された出力ポートにおいて，複数のモータの同期（ Synchronize ）を取って制御します．例えば，出力ポートに「 OUT_AC 」としていた場合には，出力ポート A と C に接続されたモータの回転数は同じ状態になるよう同期を取りながら動きます．
それでは，これらの三つのパラメータの違いを，以下のモータ状態表示関数を使って，プログラムを作成し確認してみましょう．
【モータの状態表示関数】
char MotorActualSpeed(出力ポート);// モータのスピード値取得

long MotorRotationCount(出力ポート);// モータの回転数取得

long MotorTachoCounter(出力ポート);// モータの回転速度値取得

リスト 8-1-1 のプログラムで調整パラメータを変更させながら値がどう変わるかを観察してみてください．

8-2

同期をとるモータ制御（ OnFwdSync ）次に，複数のモータの同期を取る制御関数「 OnFwdSync 」を紹介します．この制御関数は，複数のモータが常に同じ回転数や回転比率になるように調整しながら前進したり，後退したりします．
このことで，よりまっすぐ前進・後退ができるようになります．
第8 章

高度なモータ制御115

このPDFは，CQ出版社発売の「知的LEGO Mindstorms NXTプログラミング入門」の一部見本です．
内容・購入方法などにつきましては以下のホームページをご覧下さい．
内容
http://shop.cqpub.co.jp/hanbai/books/18/18951.htm
購入方法
http://www.cqpub.co.jp/hanbai/order/order.htm