担当:リンゴスター( ̄▽ ̄)&SEGA(>З<)

☆目次

ぼくらのマシン。

これがぼくらのマシンです。

今回のマシーンはローヴァーボットのドライブベースとダブルバンパーを使い、マシーン製作の時間を大幅に短縮しました。

光センサーは非常に簡単に取り付け、複雑な構造には一切しませんでした。

授業中に、黒い線に沿って動くロボットのプログラムは完成していたので、タッチセンサーを含めたプログラムを考えるだけと比較的簡単にできました。

前回同様、本体の上には操縦士:メカ崎くんが搭乗しています。

ではそのプログラムを見てください。



プログラム1 「接触したら反転」(by SEGA) を書きたい

task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);    
 SetSensor(SENSOR_2,SENSOR_TOUCH);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 OnFwd(OUT_A+OUT_C);            //前進
 while(true){               //{}の中のことが起きたらその都度繰り返す
 if(SENSOR_1 < 40){            //もしセンサー1(線の左側にある光センサー)が黒線上にいるならば…
 OnFwd(OUT_C);              //右タイヤ前回転
 repeat(3){
 OnRev(OUT_A);              //左タイヤ後回転を
 Wait(5);                  5/100秒という短い時間で動かすことを繰り返すことで細かな曲がりを実現
 Off(OUT_A);
    }
 }
 if
 (SENSOR_3 < 40){             //もしセンサー3(線の右側にある光センサー)が黒線上にいるならば…
 OnFwd(OUT_A);              //左タイヤ前回転              
 repeat(3){
 OnRev(OUT_C);              //右タイヤ後回転 
 Wait(5);
 Off(OUT_C);
 }
 }
 if(SENSOR_2 == 1){            //センサー2(タッチセンサー)がモノに接触したら…
 OnRev(OUT_A+OUT_C);           //ちょっと下がる
 Wait(50);
 Off(OUT_A+OUT_C);
 OnFwd(OUT_A);              //180°回転
 OnRev(OUT_C);
 Wait(230);                
 Off(OUT_A+OUT_C);
 OnRev(OUT_A+OUT_C);           //ちょっと下がる(もしカーブで回転してすぐ前進すると線から外れた状態になることがあるから)
 Wait(50);
 Off(OUT_A+OUT_C);
 }
 else{
 OnFwd(OUT_A+OUT_C);           //while内の上記のことが発生しなければ前進
 }
 }}

プログラム2 「接触したら右側を追い越す」(by SEGA) を書きたい

task main()
{
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_2,SENSOR_TOUCH);
 SetSensor(SENSOR_3,SENSOR_LIGHT);
 OnFwd(OUT_A+OUT_C);           
 while(true){
 if(SENSOR_1 < 40){
 OnFwd(OUT_C);
 repeat(3){
 OnRev(OUT_A);
 Wait(5);
 Off(OUT_A);
    }
 }
 if
 (SENSOR_3 < 40){
 OnFwd(OUT_A);
 repeat(3){
 OnRev(OUT_C);
 Wait(5);
 Off(OUT_C);               //ここまでプログラム1と同じ
 }
 }
 if(SENSOR_2 == 1){            //もしタッチセンサーがモノに接触したら…
 OnRev(OUT_A+OUT_C);           //ちょっと下がる
 Wait(50);
 Off(OUT_A+OUT_C);
 OnFwd(OUT_A);              //その場で90°回転(右を向いた)
 OnRev(OUT_C);
 Wait(100);
 OnFwd(OUT_A+OUT_C);           //前進
 Wait(150);
 OnFwd(OUT_C);              //90°回転(前を向いた)
 OnRev(OUT_A);
 Wait(100);
 OnFwd(OUT_A+OUT_C);           //前進(モノの右側を通っていく)
 Wait(200);
 OnFwd(OUT_C);              //90°回転(左を向いた)
 OnRev(OUT_A);               
 Wait(100);
 OnFwd(OUT_A+OUT_C);            //前進(線に再び乗る)
 Wait(150);
 OnFwd(OUT_A);               //90°回転(前を向いた)回避終了。
 OnRev(OUT_C);
 Wait(100);
 Off(OUT_A+OUT_C); 
 }
 else{
 OnFwd(OUT_A+OUT_C);             
 }
 }}

プログラム3 「接触したら反転」(by リンゴスター) を書きたい

task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_TOUCH);    //センサー類を定義
	
	OnFwd(OUT_A+OUT_C);          //前進
	while(true)
	{
		if(SENSOR_3 < 40)      //もしセンサ−3(右側)が黒線の上に来たら
		{
			OnFwd(OUT_A);
			Off(OUT_C);	
			OnRev(OUT_C);        //右に修正
			Wait(5);	   //Waitを使うことで多少滑らかに
		}
		
		if(SENSOR_1 < 40)            //もしセンサー1(左側)が黒線の上に来たら
		{
			OnFwd(OUT_C);
			Off(OUT_A);
			OnRev(OUT_A);	   //左に修正	
			Wait(5);	
		}
		
		if(SENSOR_2 == 1)      //もしセンサー2が障害物に当たったら
		{
			OnRev(OUT_A+OUT_C);
			Wait(50);            //後ろに下がる
			OnFwd(OUT_A);
			Wait(100);
			OnRev(OUT_C);
			Wait(100);      //反転
			OnRev(OUT_A+OUT_C);
			Wait(50);      //後ろに下がる(最初に下がった際の誤差をなくすため)
		}
		
		else
		{
		OnFwd(OUT_A+OUT_C);
		}
		
	}
}

プログラム4 「接触したら右側を追い越す」(by リンゴスター) を書きたい

task main()
{
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_TOUCH);
	
	OnFwd(OUT_A+OUT_C);
	while(true)
	{
		if(SENSOR_3 < 40)
		{
			OnFwd(OUT_A);
			Off(OUT_C);	
			OnRev(OUT_C);
			Wait(5);	
		}
		
		if(SENSOR_1 < 40)
		{
			OnFwd(OUT_C);
			Off(OUT_A);
			OnRev(OUT_A);		
			Wait(5);	
		}              //ここまではプログラム3と同じ
		
		if(SENSOR_2 == 1)      //センサ−2に障害物が当たったら(仮に進行方向を↑とする)
		{
			OnRev(OUT_A+OUT_C); 
			Wait(20);      //後ろに下がる
			OnFwd(OUT_A);
			Wait(50);
			OnRev(OUT_C);
			Wait(50);      //右に90度回転(→を向く)
			OnFwd(OUT_A+OUT_C);
			Wait(100);      //移動(→)
			OnFwd(OUT_C);
			Wait(100);
			OnRev(OUT_A);
			Wait(100);      //左に90度回転(↑を向く)
			OnFwd(OUT_A+OUT_C);
			Wait(150);      //障害物を追い越し中(↑)
			OnFwd(OUT_C);
			Wait(100);
			OnRev(OUT_A);
			Wait(100);      //左に90度回転(←を向く)
			OnFwd(OUT_A+OUT_C);
			Wait(100);      //移動(←)
			OnFwd(OUT_A);
			Wait(100);
			OnRev(OUT_C);
			Wait(100);      //右に90度回転(↑を向く)
		}
		
		else
		{
		OnFwd(OUT_A+OUT_C);
		}
		
	}
}

工夫と課題と反省と

  • 工夫したとこ
    • なんといっても、マシーンの簡単化が今回の課題では重要だったと思います。前回は、複雑であったために製作で予想以上の時間がかかってしまい苦労しましたが、今回はローヴァーボットを使ったためプログラムに十分な時間を取ることができました。
    • シングルバンパーを用いても良かったが、光センサーとの固定がうまくいかず、強度不足になったため、大きいがダブルバンパーを使った。
    • 光センサーの間隔を調整することが可能で、間隔を狭くすればより正確にトレースし、広げれば複雑な線でもゆとりをもってトレースできるようにしました。
    • ぶつかったら反転するプログラムで、反転の最後に最初に下がったのと同じ時間下がることによって反転後の誤差をなくすことができました。
    • 片側のセンサーが黒い部分にのったとき、片方を前進、もう片方を停止や、片方前進、もう片方を後進にするのではなく、ちょうど中間にあたる片方前進、もう片方を停止→後進にすることにより、急なカーブや緩やかなカーブにも出来るだけ速い速度で通れるようにした。(リンゴスター)
    • カーブで曲がるときrepeatとwaitで細かに動いては止め、と動かすことできついカーブも難なく曲がったという工夫。(SEGA)
    • 一応、メカ崎くんの操縦席が目立つ位置に配置できた(^_^;)
  • 課題と反省
    • ライントレースのプログラムで、もっと滑らかで、かつキツイカーブを曲がれるプログラムを考えるべきだった。
    • 右側を追い越すプログラムも、小さい物体を回避するように設定したあったので、大きい物体のとき、追越したがまだぶつかるため、もう少し前進するというプログラムをいれれば、もっと良い動作ができた。
    • 写真を撮りそこね、具体的な説明ができなく残念です。次回からは必ず授業中に撮っておきたいです。

コメントをどうぞ!

  • プログラムを作成する上で工夫した点について、もっと具体的に説明しましょう。 -- 松本(教員)? 2006-12-15 (金) 15:46:14


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-16 (金) 22:48:45 (4573d)