• 検索結果がありません。

RobotCでの基本プログラミング

N/A
N/A
Protected

Academic year: 2021

シェア "RobotCでの基本プログラミング"

Copied!
14
0
0

読み込み中.... (全文を見る)

全文

(1)

2012年度 プロジェクト研究

L E G O

早稲田大学先進理工学部

電気・情報生命工学科

(2)

1. はじめに

LEGO MINDSTORMS とはレゴ社が MIT(米国マサチューセッツ工科大学)と共同開発した, ロボティクスの先駆的な製品であり,NXT(ロボットの頭脳に相当)と呼ばれるマイクロプロセ ッサが組み込まれたインテリジェントブロックを含むキットである(図1 参照).NXT には USB ポート,4つの入力ポート(センサ用),3つの出力ポート(モータ用),4つのボタン(オレン ジ:決定/ON,黒:クリア,グレー:左右セレクト)がある. 図1:NXT また,サーボモータ(図2 参照)と以下に示す各種センサ(図 3~6 参照)を使うことによって、 ロボットに複雑な動きをさせることが可能となる. 図2:サーボモータ 図3:タッチセンサ タッチセンサ 何かにぶつかって押されたり,離されたりしたことを感知 することができる.

(3)

図4:光センサ 光センサ 明暗を感じ取ることができ,周囲の光の強さの計測,色の ついた物体の表面が反射する光の強さの計測ができる. 図5:超音波センサ 超音波センサ 物体との距離をセンチメートルで計測できる(0~255± 3cm).物体へ放った超音波が物体に反射して戻ってくる時 間を計測することで距離を読み取る.そのため,球面を持 つもの,非常に小さいものなどの計測は困難な場合がある. 図6:音センサ 音センサ 音の大きさを感じ取ることができる.90dB までの音圧を計 測できる. 90dB:カラオケ室内 40dB:図書館 80dB:地下鉄車内 20dB:木の葉のふれあう音 60dB:普通の会話

2. NXT の使い方

図7 に示すような LEGO によるロボットが完成したら,次は NXT での制御を考える必要があ る.NXT で制御するためのプログラミングには MindStorm 用言語である robotC を用いる.ま た,プログラムの送信にはUSB ケーブルを使用する. 以下にrobotC の使い方を説明する. 図7:サンプル

(4)

① USB ケーブルをパソコンと NXT に接続する.デスクトップにある ROBOTC for Mindstorm1.10 アイコン(図 8)をダブルクリックし,robotC を起動する.

② NXT の電源を入れる.

③ 図9のような画面になれば robotC の起動は完了である.

④ 上部の robot→Download Firmware を選択し,NXT とパソコンの接続を確認する.NXT Bricks currently connected via USB 内のアドレスが図 10 のように表示されていれば接 続完了である.

⑤ プログラムを作成する場合は File→New で新しいファイルを作成するか,File→Open ですでに作成してあるファイル(filename.c)を開く.

⑥ プログラムができたら,File→Save でファイルを保存する.(Save As で名前指定 ※た だし,日本語では保存できないので注意してほしい)

⑦ Robot→Compile and Download program または F5 を押すことで,コンパイルできる. 図11 のような画面が表示されればコンパイル成功である.Start ボタンを押すことでプ ログラムを実行することができる.また,Step Into ボタンでは,プログラムを 1 行ずつ 実行ずることができる. ⑧ ⑦ができた時点でプログラムは NXT に書き込まれているので,USB ケーブルをはずし, パソコンなしで実行することもできる.その場合は,NXT の電源をいれ,My Files→ Software Files→実行したいファイル名→Run で実行することができる. 図9:robotC 起動画面 図8:robotC アイコン

(5)

task main() { コマンド 1; コマンド 2; } 図10:PC,NXT 間の接続状況 図11:プログラム実行画面

3. RobotC での基本プログラミング

ここでは robotC での基本的なプログラミングについて述べる.まず,robotC でのプログラムに おいては,必ず”task main( )”を含み以下のような書き方をする. コマンドは後ほど紹介する.RobotC では大文字小文字の区別があるので注意が必要である.また, robotC にはすでに登録されているコマンドがいくつかある.登録されているコマンドは特別な意 味を持ち,robotC 上では色が変わるのでプログラムの際に参考にするとよい.

(6)

motor[引数 1] = 数値; 引数1 に書かれたモータを数値の速度で動かす.モータは数値を負にすることで逆回 転にすることができる. (引数 1;motorA,motorB,motorC) wait10Msec(数値); 数値×10[msec]だけ同じ動作を繰り返す. (数値:自然数) wait1Msec(数値); 数値×1[msec]だけ同じ動作を繰り返す. (数値:自然数) task main() { motor[motorA] = 75; motor[motorB] = 75; wait1Msec(4000); motor[motorA] = -75; motor[motorB] = -75; wait1Msec(4000); } 3.1 モータ制御用コマンド lego を動かすためには,モータを駆動させなければならない.そのため,ここではモータを制 御するためのコマンドについて説明する. 以上が,モータ制御用のコマンドであるが,次にここで紹介したコマンドを組み合わせて使用し てみる.なお,この例ではモータをA と B に取り付けた LEGO を想定している. 【例3.1.1】4 秒間前進して,4 秒間後退するプログラム

(7)

// /* */ コメントアウト //以下に書かれたプログラムは無効になる(同じ行でのみ有効) /*と*/にはさまれたプログラムは無効になる #define 定数 数字 定数を数字として使用できるように定義する (定数:英数字,一般的には大文字) (数字:自然数) 注意:#define は task の前(プログラムの先頭)で使用する while(条件文){ } ( )内の条件が満たされている間,{ }内に書かれたコマンドが実行される. (条件文:等式,不等式など) 注意:条件文にtrue(もしくは 1)を入れておくと無限ループになる do{ } while(条件文) { }内に書かれたコマンドが実行された後,条件文が満たされていれば再び{ }内に書 かれたコマンドが実行される. (条件文:等式,不等式など) int 変数; 整数型の変数を定義する (変数:英文字,一般的には小文字)

注意:int は task の前(#define がある場合はその次)で使用する 最大で32 個まで使用可能

4. 構文用コマンド

LEGO に望ましい動きをさせるには,多少複雑なプログラムを組む必要がある.その際に,構 文用のコマンドが必要になる.構文用コマンドには,プログラムを短く見やすくするためのコマ ンドや”もし~したら,~しなさい”といった if 文(もしくは if-else 文)や,”~している間は,~ しなさい”といった while 文などの条件文などがある.以下に,構文用のコマンドのいくつかを挙 げる.ここに挙げるコマンドはモータ制御用のコマンドとは異なり,使用の際には他のコマンド と組み合わせることが重要となる.この章は,多少理解が難しいので読み飛ばして,実際に使用 する場面で改めて読み直してもよい.

(8)

break; 条件文を強制的に抜ける場合に使用する for(初期化文;継続条件文;再初期化文){ } ( )内の継続条件文が真である間は{ }内に書かれたコマンドが実行される.一般的に 継続条件文は,初期化文および再初期化文に基づいた条件文となる 例:for(i=0;i<10;i++) if(条件文 1){ } else if(条件文 2){ } else{ } ( )内の各条件が満たされていれば if(条件文 1 または 2)以下の{ }内に書かれたコマン ドが実行される.尚,else は省略可能である (条件文:等式,不等式など) until(条件文){ } (条件文)が満たされるまで{ }内に書かれたコマンドが実行される (条件文:等式,不等式など) 構文用のコマンド以外にも演算用の演算子もある.演算子には,=,+,-,*,/(代入,加減乗除) や+=,-=,*=,/=(左辺と右辺を演算した後,左辺に代入)がある.また,条件文には左辺が右辺 に対して==(等しい),<(小さい),<=(小さいか等しい),>(大きい),>=(大きいか等しい),!=(異な る)があり,&&(かつ)および||(または)を組み合わせることもできる.

5. センサ用コマンド

1つのNXT には最大4つまでセンサを使用できる.使用できるセンサの種類は前述したタッチ センサ,光センサ,超音波センサ,音センサである.センサを用いるプログラムを書く前には使 用するセンサを設定しなければならない.まずその方法を以下に示す.

・ Robot→Mortors and Sensors Setup をクリック

・ 図12 のようなウィンドウが表示されたら Sensors タブをクリック

・ S1~S4(入力ポート 1~4)に使用したいセンサに対応する Name と Type を入力して OK をクリック(各センサとの対応は次の表のようである)

センサ Name Type

タッチセンサ touchsensor Touch 光センサ lightsensor Light Active 超音波センサ sonarsensor SONAR

(9)

#pragma config(Sensor, S1, touchsensor, sensorTouch)

//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*// task main() { while(SensorValue(touchsensor) == 0) { motor[motorA] = 75; motor[motorB] = 75; } motor[motorA] = -75; motor[motorB] = -75; wait1Msec(1000); }

#pragma config(Sensor, S1, touchsensor, sensorTouch) #pragma config(Sensor, S2, sonarsensor, sensorSONAR)

//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*// 図12:Motrs and Sensor Setup ウィンドウ

例えば,ポート1 にタッチセンサを,ポート 2 に超音波センサを設定すると,自動的に という文が生成される.これでセンサの設定が完了する.この文を自分で打ち込んで入力すると エラーになるので注意. 以下では各センサを使ったプログラムの例を示す. 例5.1 直進していき,障害物にぶつかったときに 1 秒間後退するプログラム 解答:タッチセンサを使用する

(10)

#pragma config(Sensor, S3, lightsensor, sensorLightActive)

//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*// task main() { while(true) { if(SensorValue(lightsensor) < 45) //黒だったら { motor[motorB] = 75; //左旋回 motor[motorC] = 0; } else //白だったら { motor[motorB] = 0; //右旋回 motor[motorC] = 75; } } }

#pragma config(Sensor, S1, sonarsensor, sensorSONAR)

//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*// task main() { do { motor[motorA] = 75; //前進 motor[motorB] = 75; } while(SensorValue(sonarsensor) > 25); //25cm より大きい間,繰り返す } 例5.2 黒い線上をトレースするプログラム 解答:光センサを使用し,地面が黒だったら左へ,白だったら右へ移動するように設定 例5.3 直進していき,障害物の 25cm 手前で停止するプログラム 解答:超音波センサを使用する

(11)

time 数字[タイマ番号] = 数値;

タイマ番号のタイマのカウントを数値に初期化する(数字は 1,10,100) (例:time10[T2] = 11; タイマ番号 T2 を 110[Msec]に初期化)

wait1Msec(1000);

#pragma config(Sensor, S1, soundsensor, sensorSoundDB)

//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*// task main() { wait1Msec(1000); //誤動作防止 while(true) { motor[motorA] = 75; //前進 motor[motorB] = 75; if(SensorValue(soundsensor)>=50) //音が鳴ったら { motor[motorA] = 0; //停止 motor[motorB] = 0; wait1Msec(1000); //一秒待つ } } } 例5.4 音が鳴るまで直進,音が鳴ったら 1 秒停止を繰り返すプログラム 解答:音センサを使用する ※音センサを使うときには誤動作防止のため,プログラムの初めに をつける.

6. 高度なコマンド

今まで扱ってきたコマンドは,LEGO を制御するための基本的なコマンドである.RobotC に はより高度なコマンドが用意されており,LEGO をより複雑に動かすことが可能となっている. ここではそのうちのいくつかを挙げるが,ここに乗せていないコマンドは,文献[][]などを参考に されたい. タイマ NXT は 4 つのタイマ(タイマ番号 T1~T4)を内蔵している.これらのタイマの刻み時間は 1[Msec]である.

(12)

task main() { time100[T1]=0; //タイマ番号 T1 を 0 に初期化 until(time100[T1]>40) //T1 が 4 秒より経過するまで { motor[motorA]=75; //前進 motor[motorB]=75; } until(time1 [T1]>8000) //8 秒経過するまで { motor[motorA]=-75; //後退 motor[motorB]=-75; } } void 関数名(引数){ } { }内に書かれたコマンドを実行する関数を定義する.引数の使用も可能. (引数:int 引数名) 注意;引数はなくてもよい. 【例6.1】例 3.1 の 4 秒間前進して,4 秒間後退するプログラムをタイマを用いて考える. 関数 タスクの中でよく出てくるコマンド列(いくつかのコマンドの組)を,ひとつの関数としてまとめ ることができる.この関数はコマンドのように使用することができる. 【例 6.2】時間を引数として,LEGO が左右に曲がるための関数を作成し,また,作成した関数 をmain( )内で呼び出して使用するプログラム

void right_turn(int time) {

motor[motorA]=0;

motor[motorB]=40;//右旋回

wait1Msec(time);//(time)msec 待つ }

void left_turn(int time) { motor[motorA]=40;//左旋回 motor[motorB]=0; wait1Msec(time); } task main() { motor[motorA]=40;//前進 motor[motorB]=40; wait1Msec(3000);//3 秒待つ left_turn(1500);//関数実行 right_turn(1500); }

(13)

task main( ) { コマンド 1; コマンド 2; start task_name2 start task_name3 } task task_name2( ) { コマンド 3; } task task_name3( ) { コマンド 4; コマンド 5; } 複数のタスク 今まで扱ってきたプログラムでは1 つのタスクによって実行してきたが,NXT では複数のタス クを同時に実行させることができる.複数のタスクを扱う場合の書式は次のようになる.

main( )の中で start taskname とすることで,複数のタスクを実行させることができる.stop taskname とすることでタスクをとめることもできる.次に例を示す.

【例6.3】複数のタスクを用いた例(ロボットが黒線で囲まれた領域を探索するプログラム) #pragma config(Sensor, S1, lightsensor,

sensorLightActive)

//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*// #define THRESHOLD 45 task move() { motor[motorA]=50; motor[motorB]=50; } task check_light() { while(SensorValue(lightSensor)<=THRESHO LD) { StopTask(move); motor[motorA]=-50; motor[motorB]=-30; } } ;task main() { while(true) { StartTask(check_light); StartTask(move); } } こ の 例 で は , 前 進 す る プ ロ グ ラ ム(move( ))とライトセンサを調べ,後退するプログラム (check_light( ))が同時に動いている.check_light( )内で,条件が満たされると,move( )のタスク をやめ,次にロボットが少し回転するようにモータを動かすコマンドを実行する.

(14)

playtone(数字 1,数字 2) 数字1の周波数の音を数字2×1[Msec]の間鳴らす (数字:整数) 注意:周波数は49 以上に設定すること(48 以下だと音が出ない) playsound(引数 1 または数字) 引数1 で指定されたすでに決められている音を鳴らす (引数 1:Soundbeep,Downwordtone 等) (数字:0~9) nxtDisplayTextLine(数字,”文字”,引数) NXT 画面上に数字で行を指定し,” ”内に書かれた文字を表示させる.引数を伴う場 合は” ”内に%d を書き,引数に変数名を入力することで変数を表示させることができ る. その他のコマンド robotC で用意されているその他のコマンドについて述べる.これらは,LEGO を制御することに 直接関係はないので,余裕がある場合に使用してみていただきたい.

7. おわりに

本稿では,NXT の使用方法と robotC を用いた LEGO Mindstorms のプログラミングについて 簡単に説明した.より詳しい情報はWeb サイトなどにも載っているので必要に応じて各自で調べ ていただきたい.

図 4:光センサ  光センサ  明暗を感じ取ることができ,周囲の光の強さの計測,色のついた物体の表面が反射する光の強さの計測ができる.  図 5:超音波センサ  超音波センサ  物体との距離をセンチメートルで計測できる(0~255±3cm).物体へ放った超音波が物体に反射して戻ってくる時間を計測することで距離を読み取る.そのため,球面を持 つもの,非常に小さいものなどの計測は困難な場合がある. 図 6:音センサ  音センサ  音の大きさを感じ取ることができる. 90dB までの音圧を計測できる. 90dB:
図 11 のような画面が表示されればコンパイル成功である.Start ボタンを押すことでプ ログラムを実行することができる.また, Step Into ボタンでは,プログラムを 1 行ずつ 実行ずることができる.  ⑧  ⑦ができた時点でプログラムは NXT に書き込まれているので, USB ケーブルをはずし, パソコンなしで実行することもできる.その場合は,NXT の電源をいれ,My  Files→ Software Files→実行したいファイル名→Run で実行することができる.  図 9:robot
図 12:Motrs and Sensor Setup ウィンドウ

参照

関連したドキュメント

 毒性の強いC1. tetaniは生物状試験でグルコース 分解陰性となるのがつねであるが,一面グルコース分

Scival Topic Prominence

手動のレバーを押して津波がどのようにして起きるかを観察 することができます。シミュレーターの前には、 「地図で見る日本

図 21 のように 3 種類の立体異性体が存在する。まずジアステレオマー(幾何異 性体)である cis 体と trans 体があるが、上下の cis

光を完全に吸収する理論上の黒が 明度0,光を完全に反射する理論上の 白を 10

マニピュレータで、プール 内のがれきの撤去や燃料取 り出しをサポートする テンシルトラスには,2本 のマニピュレータが設置さ

マニピュレータで、プール 内のがれきの撤去や燃料取 り出しをサポートする テンシルトラスには,2本 のマニピュレータが設置さ

□ ゼミに関することですが、ゼ ミシンポの説明ではプレゼ ンの練習を主にするとのこ とで、教授もプレゼンの練習