いくつかロボットを作ってみた
ダンシングロボット
まずは1つ目。ダンシングロボットです。左手の所に音センサがついてて、周囲で一定以上の音が鳴ったら、踊り出します (実はただ動いているだけ)。
#define THRES 50 // タッチセンサが押されたらメロディーを流すタスク task touch_melody() { while(true) { if (get_touch()) { PlaySound(soundFastUpwardTones); wait1Msec(100); PlaySound(soundUpwardTones); } } } // メインタスク task main() { init_sensor(); StartTask(touch_melody); while(true) { while(get_sound() < THRES); do { // 音が鳴ったときの行動 go_forward(30); arm_up(); wait1Msec(100); } while (get_sound() > THRES); motor_stop(); arm_stop(); } }
ロボット用のプログラミング言語では、マルチタスクなプログラムが簡単に書けるので、ちと試してみました。音センサでの音チェックはメインのタスクで、タッチセンサが押されたらメロディーを流す処理は別のタスクで行っています。
モータ制御とセンサ制御を平行して行う場合は、マルチタスクが便利です。
壁回避ロボット
お次は、タッチセンサとソナーセンサで壁際を回避するロボットです。前方のソナーで前にある障害物との距離を調べてます。それと、後方のタッチセンサで衝突を感知してます。
task main() { int dir = FORWARD; // go forward at first int num = 0; init_sensor(); // sensor setup while (true) { if (dir == FORWARD) { go_forward(SPEED); // go forward until sonar sensor detects an obstacle while (get_sonar() >= SN_TH); PlaySound(soundBeepBeep); wait1Msec(200); go_backward(SPEED); wait1Msec(500); random_turn(); wait1Msec(500); // next direction is backward dir = BACKWARD; num++; } else if (dir == BACKWARD) { go_backward(SPEED); // go forward until touch sensor detects an obstacle while (!get_touch()); PlaySound(soundLowBuzz); wait1Msec(100); go_forward(SPEED); wait1Msec(500); random_turn(); wait1Msec(500); // next direction is forward dir = FORWARD; num++; } else if (num >= 10) { break; } } }
前回どっちに走ってたか覚えてて、タッチかソナーで壁を感知するたびに、方向を入れ替えてるんですけど、もっとプログラムをすっきりできるんだけどなー。まーいいか。