[[中学生向け夏季講座の資料として作成したガイド:http://yakushi.shinshu-u.ac.jp/robotics-jr/robotics-jr.html]]もご参考に。NQC (RIS, 旧マインドストーム用)とNXC (NXT, 現行モデル用)の両言語を並行して説明しています。(2012-08-24追記) 以下は相当不十分な内容なので、 http://yakushi.shinshu-u.ac.jp/robotics-jr/robotics-jr.html をぜひ参考に。 NXT付属の説明書に載っているロボットを使って基本的なプログラミングを学習しましょう。 目次 #contents * センサーを使わないプログラム [#f9e7c53e] ** はじめてのプログラム [#e9d55f61] 2本のスラッシュ(//)の後はコメント文と呼ばれ、プログラムとして実行されるわけではないが、プログラムの説明を書くことができる。 task main () { OnFwd(OUT_AC,75); // AとCのモータを75%のパワーで前転 Wait(3000); // プログラムの実行を3000ms(=3秒間)停止 Off(OUT_AC); // AとCのモータを停止 } モータ出力は、OUT_A, OUT_B, OUT_C, OUT_AB, OUT_AC, OUT_BC, OUT_ABC,のいずれかを指定する。 NQCでは可能だった OUT_A+OUT_C のような指定方法は使えない。 モータ出力は0から100まで調整できる。出力をマイナスにすると逆転する。 Waitの引数は1/1000秒単位で指定する。 ** 旋回もさせよう [#dfe21f44] task main () { OnFwd(OUT_AC,75); Wait(3000); OnRev(OUT_A,75); // Aのモータを75%のパワーで後転 Wait(500); // 0.5秒間旋回 Off(OUT_AC); } 左右のモータを逆に回すとその場で旋回する。 ** 使って必要な数値を最初に定義してしまおう [#z2954f0c] 最初に数値を定義しておけば、タスクの中で「この数値なんだっけ」と困ることも少ない。 #define MOVE_TIME 3000 // MOVE_TIMEという名の定数(=3000)を定義 #define TURN_TIME 500 // TURN_TIMEという名の定数(=500)を定義 #define MOTOR_POWER 75 // MOTOR_POWERという名の定数(=75)を定義 task main () { OnFwd(OUT_AC,MOTOR_POWER); Wait(MOVE_TIME); OnRev(OUT_A,MOTOR_POWER); Wait(TURN_TIME); Off(OUT_AC); } ** repeatを使った繰り返し [#tae29ec0] 同じ命令を繰り返す場合には、命令をコピー・ペーストせずに repeat を使おう。 #define MOVE_TIME 3000 #define TURN_TIME 500 #define MOTOR_POWER 75 task main () { repeat(4){ // 以下の命令を4回繰り返す OnFwd(OUT_AC,MOTOR_POWER); Wait(MOVE_TIME); OnRev(OUT_A,MOTOR_POWER); Wait(TURN_TIME); } Off(OUT_AC); } ただし、repeatの () の中は定数でなければならないので、繰り返し回数が状況によって変化する場合は、後で説明する forループや whileループを使う。 ** マクロを使って一連の動きも最初に定義しよう [#ia9448f2] 定数だけでなく、一連の命令も最初に定義しておけば簡単に何度でも使える。 #define MOVE_TIME 3000 #define TURN_TIME 500 #define MOTOR_POWER 75 #define TURN_LEFT OnRev(OUT_A,MOTOR_POWER); OnFwd(OUT_C,MOTOR_POWER); Wait(TURN_TIME); Off(OUT_AC); task main () { repeat(4){ OnFwd(OUT_AC,MOTOR_POWER); Wait(MOVE_TIME); TURN_LEFT // 上で定義した一連のコマンド群に置き換えられる } Off(OUT_AC); } ** マクロは引数(ひきすう)を取ることができる [#zf1abb34] #define MOVE_TIME 3000 #define TURN_TIME 500 #define MOTOR_POWER 75 #define GO_FORWARD(t) OnFwd(OUT_AC,MOTOR_POWER); Wait(t); Off(OUT_AC); // 引数のあるマクロ #define TURN_LEFT OnRev(OUT_A,MOTOR_POWER); OnFwd(OUT_C,MOTOR_POWER); Wait(TURN_TIME); Off(OUT_AC); task main () { repeat(4){ GO_FORWARD(MOVE_TIME); // このように引数を取ることもできる TURN_LEFT; } Off(OUT_AC); } mainタスクがシンプルになってきた。 ** 変数を使ってみる [#rb8ea910] // 3つの大きさの違う正方形を描いて動く #define TURN_TIME 500 #define MOTOR_POWER 75 #define GO_FORWARD(t) OnFwd(OUT_AC,MOTOR_POWER); Wait(t); Off(OUT_AC); // 引数のあるマクロ #define TURN_LEFT OnRev(OUT_A,MOTOR_POWER); OnFwd(OUT_C,MOTOR_POWER); Wait(TURN_TIME); Off(OUT_AC); task main () { int move_time=100; // 整数型の変数 move_time を定義して初期値を100にする repeat(3){ // repeat は入れ子にできる repeat(4){ GO_FORWARD(move_time); TURN_LEFT; } move_time += 100; // move_time の値を100増やす // move_time=move_time+100; と同じ } Off(OUT_AC); } ** repeatの代わりforループを使ってみる [#ic90de34] #define MOVE_TIME 3000 #define TURN_TIME 500 #define MOTOR_POWER 75 #define GO_FORWARD(t) OnFwd(OUT_AC,MOTOR_POWER); Wait(t); Off(OUT_AC); // 引数のあるマクロ #define TURN_LEFT OnRev(OUT_A,MOTOR_POWER); OnFwd(OUT_C,MOTOR_POWER); Wait(TURN_TIME); Off(OUT_AC); task main () { for (int i=0; i<4; i++) { // ループ変数 i を i=0 から1づつ増やして(i++) // i<4 の条件が満たされている間、繰り返す GO_FORWARD(MOVE_TIME); TURN_LEFT; } Off(OUT_AC); } ** 関数を使ってみる [#y61dbfca] *センサーを使ってみる [#pff032b0] // task main () // { // SetSensorColorFull(S1); // ポート1にカラーセンサ (フルカラーモード) // SetSensorTouch(S2); // ポート2にタッチセンサ // SetSensorLight(S3); // ポート3に光センサ // SetSensorLowspeed(S4); // ポート4に超音波センサ // // Wait(1000); // // long t0, time; // // t0=CurrentTick(); // // while(CurrentTick() - t0 < 10000 ){ // // ClearScreen(); // TextOut(0,LCD_LINE2,"Touch"); // NumOut(60,LCD_LINE2,SensorValue(S2)); // // TextOut(0,LCD_LINE3,"Light:"); // NumOut(60,LCD_LINE3,SensorValue(S3)); // // TextOut(0,LCD_LINE4,"US:"); // NumOut(60,LCD_LINE4,SensorUS(S4)); // // Wait(100); // } // }