1.ロボットの作成
左右にモータを1つずつ使用したロボットを作成します。
例として、ここではNXT付属のロボット組立て図に記載されたロボットを用います。(p8〜22参照)

例として、ここではNXT付属のロボット組立て図に記載されたロボットを用います。(p8〜22参照)

2.ロボットを直進させる
次にプログラムを作成します。
ここでは4秒前進してから、4秒後退して止まるプログラムを作成します。 RobotCを起動して、次のプログラムを作成してください。ここでは作成プログラムを motor1.c とします。
このプログラムの解説をします。
コンパイルとダウンロードを参考にプログラムをダウンロードし、 プログラムを動かすを参考にプログラムを動作させて下さい。
プログラムどおりに動作しましたか? おそらく直進するはずなのに曲がってしまったと思います。 これは左右のモータの個体差により実際に動かすスピードが異なっているからです。 従って、直進させる場合は左右のモータでそれぞれスピードを調整する必要があります。
これでロボットを前進・後退させることができました。またプログラムのコンパイルなども分かったと思います。
ここでは4秒前進してから、4秒後退して止まるプログラムを作成します。 RobotCを起動して、次のプログラムを作成してください。ここでは作成プログラムを motor1.c とします。
motor1.c
task main(){ motor[motorB] = 100; motor[motorC] = 100; wait1Msec(4000); motor[motorB] = -100; motor[motorC] = -100; wait1Msec(4000); motor[motorB] = 0; motor[motorC] = 0; return; } |
このプログラムの解説をします。
motor[motorB] = 100
wait1Msec(4000)
この文はNXTの出力ポートBのモータのパワーを100に指定する命令です。
[ ]内をmotorAにすると出力ポートAが、motorCにすれば出力ポートCのモータのスピードが指定できます。
また代入する値を変えることでパワーを変えることができます。 指定できる値は-100〜100までで、+側で正回転,−側で逆回転,0でブレーキ(停止)となります。
[ ]内をmotorAにすると出力ポートAが、motorCにすれば出力ポートCのモータのスピードが指定できます。
また代入する値を変えることでパワーを変えることができます。 指定できる値は-100〜100までで、+側で正回転,−側で逆回転,0でブレーキ(停止)となります。
wait1Msec(4000)
4000msec = 4sec 動作を待機させます。
コンパイルとダウンロードを参考にプログラムをダウンロードし、 プログラムを動かすを参考にプログラムを動作させて下さい。
プログラムどおりに動作しましたか? おそらく直進するはずなのに曲がってしまったと思います。 これは左右のモータの個体差により実際に動かすスピードが異なっているからです。 従って、直進させる場合は左右のモータでそれぞれスピードを調整する必要があります。
これでロボットを前進・後退させることができました。またプログラムのコンパイルなども分かったと思います。
3.ロボットが曲がる
次にロボットが曲がるプログラムを作成します。
ここでは正方形に曲がるプログラムを作成します。正方形に曲がるには『 前進→右折→前進→… 』という繰り返しが必要になります。 この場合はfor文が有用です。また90度曲がるために何秒間モータを回せばいいのかが重要となります。 このような場合にはマクロを用いると便利です。
それでは次のプログラムを作成してください。ここでは作成プログラムをmotor2.cとします。
おそらくこのプログラムでは90度曲がらないと思います。モータの個体差や床の摩擦、電池の消耗などに依るからです。 この場合、wait1Msec()の引数を変えるのではなく、あらかじめ定義した定数(マクロ)を変える方が一般的です。 マクロを使用することで、プログラムの調整が容易になり、また見やすくなります。
ここでは正方形に曲がるプログラムを作成します。正方形に曲がるには『 前進→右折→前進→… 』という繰り返しが必要になります。 この場合はfor文が有用です。また90度曲がるために何秒間モータを回せばいいのかが重要となります。 このような場合にはマクロを用いると便利です。
それでは次のプログラムを作成してください。ここでは作成プログラムをmotor2.cとします。
motor2.c
#define TURN_TIME 220 #define MOVE_TIME 750 task main(){ int i; for(i=0;i<4;i++){ motor[motorB] = 100; motor[motorC] = 100; wait1Msec(MOVE_TIME); motor[motorB] = -100; motor[motorC] = 100; wait1Msec(TURN_TIME); } } |
おそらくこのプログラムでは90度曲がらないと思います。モータの個体差や床の摩擦、電池の消耗などに依るからです。 この場合、wait1Msec()の引数を変えるのではなく、あらかじめ定義した定数(マクロ)を変える方が一般的です。 マクロを使用することで、プログラムの調整が容易になり、また見やすくなります。
4.課題
3.のプログラムを直進できるように左右のパワーを調整し、同時に90度曲がるようにMOVE_TIMEとTURN_TIMEを調整して、
50cmの正方形を描いて走行するようにしなさい。