いくつかロボットを作ってみた

ダンシングロボット

まずは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();
	}
}

ロボット用のプログラミング言語では、マルチタスクなプログラムが簡単に書けるので、ちと試してみました。音センサでの音チェックはメインのタスクで、タッチセンサが押されたらメロディーを流す処理は別のタスクで行っています。

モータ制御とセンサ制御を平行して行う場合は、マルチタスクが便利です。

すもうロボット

あ、これはLEGOではないし、プログラム書いたわけでもないです^^; ラジコン操作ですから。
こういうのをプログラムで戦うようにしたいな。


壁回避ロボット

お次は、タッチセンサとソナーセンサで壁際を回避するロボットです。前方のソナーで前にある障害物との距離を調べてます。それと、後方のタッチセンサで衝突を感知してます。


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;
  	}
  }
}

前回どっちに走ってたか覚えてて、タッチかソナーで壁を感知するたびに、方向を入れ替えてるんですけど、もっとプログラムをすっきりできるんだけどなー。まーいいか。

次は・・・

次は、もっと見た目におもしろいものを作るか。
ロボコンみたいなゲームを企画して、学生だけのロボコンをやってみたいな。