2008a/MemberOnly/進行状況A

課題3懐中電灯に向かってブロックを投げるロボット

〜簡向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。
懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。

ロボット本体

一つ目のモーターをタイヤを動かすことに使い
もう一つのモーターをブロックを投げることに使いました。
初代ロボット

080702_1733~01.JPG
080702_1734~02.JPG

タイヤもブロックを投げるための装置も大きすぎたので小さくしました。

横から.jpg

プログラム

プログラム1

全方向から懐中電灯の方向を探しだし、懐中電灯に向けてブロックを投げる。懐中電灯は動かさない。

int max ;
int stop_time ;
task main()
  {
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   max = 0 ;
   ClearTimer(0);
   
 while(Timer(0) <= 39){         //ロボットを右回転で一周させる
 OnFwd(OUT_A);            
 if(max > SENSOR_2)
 {
   max = SENSOR_2 ;            //センサーの値の最大値を測る
   stop_time = Timer(0) * 10 ;  } }       //最大値を更新したらその秒数を記録する
 OnFwd(OUT_A);
 Wait(stop_time);            //記録した秒数だけ回転する
 Off(OUT_A);
 OnRev(OUT_C);             //ブロックを投げる
 Wait(20);
 Off(OUT_C);
}

プログラム2

懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めればブロックを投げる。

int Stop ;
int change ;
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
Stop = 0 ;
change = SENSOR_2;
Wait(300);
while(Stop <= 0)
{

記録した値よりセンサーの値が小さい(暗くなったとき)

光源が遠ざかったと判断

前進する

センサーの値を記録する

0.5秒待つ(光源の変化をみるため)

if(SENSOR_2<change){
repeat(5){
OnFwd(OUT_A);
Wait(20);
OnRev(OUT_A);
Wait(20);
Off(OUT_A);}
change = SENSOR_2 ;
Wait(50);
}

記録した値よりセンサーの値が大きかった(光源を動かす速度<ロボットが進む速度の)時

センサーの値を記録

0.5秒待つ

if(SENSOR_2>change){
Off(OUT_A);
change = SENSOR_2 ;
Wait(50);
}

記録した値とセンサーの値が同じ時

光源が止まったと判断

ブロックを投げる

プログラムを終了させる

if(change == SENSOR_2) {
OnRev(OUT_C);
Wait(30);
Off(OUT_C);
Stop = 1 ; }
}
}

プログラム3

懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば50cmの距離まで近づいてブロックを投げる。

ロボット本体はこのプログラムを作ることを考えずに作ってしまったので、センサーは光センサー1つしか付いていません。
また50cmを図るためにセンサーに50cmの触覚(?)のようなものを付けたと仮定します。

int Stop ;
int change ;
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_1,SENSOR_TOUCH);
Stop = 0 ;
change = SENSOR_2;
Wait(300);
while(Stop <= 0)
{

タッチセンサーが押されたとき(光源に近づきすぎてしまったとき)

3秒待って光源が遠ざかるのを待つ

if(SENSOR_1==1)
{Wait(300);}

記録した値よりセンサーの値が小さい(暗くなったとき)

光源が遠ざかったと判断

前進する

センサーの値を記録する

0.5秒待つ(光源の変化をみるため)

if(SENSOR_2<change){
repeat(5){
OnFwd(OUT_A);
Wait(20);
OnRev(OUT_A);
Wait(20);
Off(OUT_A);}
change = SENSOR_2 ;
Wait(50);
}

記録した値よりセンサーの値が大きかった(光源を動かす速度<ロボットが進む速度の)時

センサーの値を記録

0.5秒待つ

if(SENSOR_2>change){
Off(OUT_A);
change = SENSOR_2 ;
Wait(50);
}

記録した値とセンサーの値が同じ時

光源が止まったと判断

タッチセンサーが押されるまで進む

ブロックを投げる

プログラムを終了させる

if(change == SENSOR_2) {
Whil(SENSOR1==0)
{OnFwd(OUT_A);
Wait(20);
OnRev(OUT_A);
Wait(20);
Off(OUT_A);}
OnRev(OUT_C);
Wait(30);
Off(OUT_C);
Stop = 1 ; }
}
}

工夫したところ

ロボットのギアがかみ合わないところがあったので、シャフトにゴムを巻いて間を詰めました。

苦労した所

前回と同じようにロボット本体を作るのにかなり苦労しました。

コメント

コメントをどうぞ

  • ロボットの写真を見る限り、左右に曲がるのはとても難しいようなので(タイヤの横方向への摩擦が大きくなる)もう少し旋回しやすくなるよう工夫してみてください。 -- 松本 2008-07-08 (火) 09:04:55

プログラムだけでも良いので、課題3をやって見てください。I


添付ファイル: file横から.jpg 328件 [詳細] file080702_1733~01.JPG 297件 [詳細] file080702_1734~02.JPG 304件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-15 (金) 13:15:24