[[2012b/Member/blackcat/Mission1/programBBB2]]

*課題1 [#a58ec2cc]
図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 

    1人目
        スタート地点から出発し、スタート地点外のすぐ近くに置かれたピンポン玉をつかむ。
        ピンポン玉をつかんだら速やかにスタート地点の境界の黒線に戻り、そこから黒線に沿って動いてゴール地点を目指す。
     ただしT字路では、直進、右折、左折を正しく判断させること。また、曲線部中央の障害物に接触しないようにすること。
        ゴール地点に到達したら、ゴールエリア外からピンポン玉をゴールにシュートする。 
     ただし、どうしてもエリア外からのシュートが難しい場合は、エリア内からシュートした後、エリアから出てもよい。
    2人目
        上の動作でスタートとゴールを逆にして同様の動きをするプログラムを作成せよ。ロボット本体は共通のものを使うとする。
1人目

1.スタート地点から出発し、スタート地点外のすぐ近くに置かれたピンポン玉をつかむ。

2.ピンポン玉をつかんだら速やかにスタート地点の境界の黒線に戻り、そこから黒線に沿って動いてゴール地点を目指す。

※ただしT字路では、直進、右折、左折を正しく判断させること。また、曲線部中央の障害物に接触しないようにすること。

3.ゴール地点に到達したら、ゴールエリア外からピンポン玉をゴールにシュートする。 

※ただし、どうしてもエリア外からのシュートが難しい場合は、エリア内からシュートした後、エリアから出てもよい。

2人目

1.上の動作でスタートとゴールを逆にして同様の動きをするプログラムを作成せよ。ロボット本体は共通のものを使うとする。

課題1のコース
# http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2012b%2FMission&openfile=2012b-mission1.png 

※上図は2012年度後期の課題ページの図を使わせてもらいました。


*メンバー [#n6c88ad6]
・blackcat …このページの製作者。スポーツ平凡。勉強平凡。好きなものは、のらねこ。パラジクロロベンゼン。コーヒー牛乳。嫌いなものは、くも。雨。


・yoshi …スペック不明。ロボットの形を決めたのは彼であり、この形を見る限り奇才な気がする。


*ロボット解説 [#pf29ad9d]

&ref(2012b/Member/blackcat/Mission1/P1000118s.jpg,50%,ロボット);


これが本番用のロボットです。

見た目少しキリギリスとかカマドウマとか、そういう昆虫に似ている気がします。

しかし、こいつには恐るべき能力があります。


&ref(2012b/Member/blackcat/Mission1/P1000115s.jpg,50%,ロボット);

これがロボット本体を横から見たものです。

ここまでは普通のロボットと違わないですが・・・

&ref(2012b/Member/blackcat/Mission1/P1000116s.jpg,50%,ロボット);

シャキーン!

どうでしょうか?

そうです。このロボットはお腹の部分から手が大きく伸びるタイプのロボットなのです。

その最大の利点は・・・

&ref(2012b/Member/blackcat/Mission1/P1000121s.jpg,50%,ロボット);

前を向いたまま高速でボールをかっさらっていくことです。
それだけです。

お腹の部分にボールを取り込んだまま走行します。

ゴールしたときのシュートのことなどまるで頭にありません。

必然的にシュート時は、回転して遠心力で半ば強引にボールを吹き飛ばします。

そのため、シュート能力はかなり低いです。バッテリー次第です。

続いて、もう片方の側面は・・・

&ref(2012b/Member/blackcat/Mission1/P1000117s.jpg,50%,ロボット);

こんな感じです。

あまりパッとしませんね。

次は内部構造を見てみましょう。

&ref(2012b/Member/blackcat/Mission1/P1000120s.jpg,50%,ロボット);

図から読み取れるように、モーターの力が、取り込んだボールを押し出す機構を動かし、

また、歯車を通して外側の手にも力を与えます。

これは、なかなかおもしろい構造だと思います。

発案者の相方に感謝しています。

しかし、最大の欠点は、内部がかなりもろいということです。

発案者曰く、適当に組み立てていったら、いらないパーツがついていたり、無理をしているパーツができてしまったらしく、かなり壊れやすいです。

デリケートです。取り扱い注意ですね。

*プログラム [#h68d3c07]
 #define SPEED_H 45
 #define SPEED_L 35
 #define THRESHOULD 47 //しきい値(黒か白か見分けるための値)
 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
 #define go_forward OnRL(SPEED_H,SPEED_H);
 #define turn_left1 OnRL(SPEED_L,-SPEED_L);
 #define turn_left0 OnRL(SPEED_L,-20);
 #define turn_right0 OnRL(-20,SPEED_L);
 #define turn_right1 OnRL(-SPEED_L,SPEED_L);
 #define STEP 1
 #define nMAX 140
 #define short_break Off(OUT_BC);Wait(1000);
 #define CROSS_TIME 350
 #define cross_line OnRL(SPEED_H,0);Wait(CROSS_TIME);
 #define shoot OnRL(-50,50);Wait(1000);Off(OUT_BC);OnRL(50,50);\
   Wait(1500);Off(OUT_BC);OnFwd(OUT_A,300);Wait(250);Off(OUT_A);  //シュート
上は定義一覧です。
 #define SO 392
 #define RA 440
 #define SI 494
 #define DO 523
 #define RE 587
 #define MI 659
 #define MII 685
 #define FA 698
 #define FAA 740
これらは音の周波数です。音楽を作るために定義しました。
task play_music()
{
  while (true) {
    PlayTone(RA,400);Wait(500);
    PlayTone(SI,400);Wait(500);
    PlayTone(DO,1200);Wait(1500);
    PlayTone(SI,400);Wait(500);
    PlayTone(DO,650);Wait(800);
    PlayTone(MII,800);Wait(1000);
    PlayTone(SI,1600);Wait(2000);
    PlayTone(MI,400);Wait(500);
    PlayTone(FA,1300);Wait(1500);
    PlayTone(SO,400);Wait(500);
    PlayTone(RA,650);Wait(800);
    PlayTone(DO,800);Wait(1000);
    PlayTone(SO,1600);Wait(2000);
    PlayTone(MI,600);Wait(700);
    PlayTone(FA,1000);Wait(1200);
    PlayTone(MI,400);Wait(500);
    PlayTone(FA,800);Wait(1000);
    PlayTone(DO,400);Wait(500);
    PlayTone(SI,1300);Wait(1500);
    PlayTone(DO,180);Wait(230);
    PlayTone(DO,180);Wait(230);
    PlayTone(DO,180);Wait(230);
    PlayTone(SI,400);Wait(500);
    PlayTone(FA,230);Wait(300);
    PlayTone(FA,500);Wait(600);
    PlayTone(SI,400);Wait(500);
    PlayTone(SI,1300);Wait(1500);
    PlayTone(RA,400);Wait(500);
    PlayTone(SI,400);Wait(500);
    PlayTone(DO,1300);Wait(1500);
    PlayTone(SI,400);Wait(500);
    PlayTone(DO,700);Wait(800);
    PlayTone(MII,800);Wait(1000);
    PlayTone(SI,1600);Wait(2000);
    PlayTone(MI,400);Wait(500);
    PlayTone(FA,1300);Wait(1500);
    PlayTone(SO,400);Wait(500);
    PlayTone(RA,650);Wait(800);
    PlayTone(DO,800);Wait(1000);
    PlayTone(SO,1600);Wait(2000);
    PlayTone(MI,400);Wait(500);
    PlayTone(FA,650);Wait(800);
    PlayTone(DO,230);Wait(300);
    PlayTone(SI,700);Wait(800);
    PlayTone(SI,230);Wait(300);
    PlayTone(DO,320);Wait(400);
    PlayTone(RE,230);Wait(300);
    PlayTone(RE,400);Wait(500);
    PlayTone(MII,320);Wait(300);
    PlayTone(DO,650);Wait(800);
    PlayTone(DO,400);Wait(500);
    PlayTone(SI,400);Wait(500);
    PlayTone(RA,800);Wait(1000);
    PlayTone(SI,650);Wait(800);
    PlayTone(SO,800);Wait(1000);
    PlayTone(RA,1600);Wait(2000);
   }
 }
これは天空の城ラピュタの「君をのせて」という歌です。

小学校のころ、リコーダーで演奏したのを思い出しながら作りました。

しかし、音楽センスのない私には不向きだったようで何か呪いの歌のように聞こえます。

 task main()
 {
  SetSensorLight(S1);
  int nOnline=0;       //続けて黒になった回数(カウンタ)
  int nCurve=0;        //急カーブの回数
  long t0 = CurrentTick();

  OnRL(-SPEED_L,SPEED_H);
  Wait(300);
  Off(OUT_BC);
  OnRev(OUT_A,30);
  Wait(500);
  Off(OUT_A);
  OnRL(2*SPEED_H,SPEED_H);
  Wait(350);
  Off(OUT_BC);

上はボールを確保して出発するまでのプログラムです。
  
  while (CurrentTick() - t0 < 10000) {  //10秒経過するまで右側通行//
    if(SENSOR_1 < THRESHOULD - 13) {
      turn_right1;
    } else {
      if (SENSOR_1 < THRESHOULD - 7){
        turn_right0;
      } else if (SENSOR_1 < THRESHOULD + 7){
        go_forward;
      } else if (SENSOR_1 < THRESHOULD + 15){
        turn_left0;
      } else {
        turn_left1;
        }
      Wait(STEP);
     }
  }
  if (CurrentTick() - t0 == 10000) {    //10秒経過したら左側通行//
    cross_line;
    t0 = CurrentTick();
  while (nCurve < 2) {    //交差点は一回目普通に通過//
    if(SENSOR_1 < THRESHOULD - 13) {
      turn_left1;
      nOnline++;
      if (nOnline == nMAX) {
      nCurve++;
      nOnline=0;
      PlaySound(SOUND_CLICK);
      Off(OUT_BC);
      Wait(300);
      OnRL(SPEED_H,-SPEED_H);
      Wait(500);
        }
    } else {
      if (SENSOR_1 < THRESHOULD - 7){
        turn_left0;
      } else if (SENSOR_1 < THRESHOULD + 7){
        go_forward;
      } else if (SENSOR_1 < THRESHOULD + 15){
        turn_right0;
      } else {
        turn_right1;
	}
      nOnline=0;
      }
      Wait(STEP);
    }
  }
  while (nCurve >= 2) {                    //交差点二回目がきたらシュート//
    while (nOnline < nMAX) {
      if(SENSOR_1 < THRESHOULD - 13) {
        turn_left1;
    	  nOnline++;
      } else {
        if (SENSOR_1 < THRESHOULD - 7){
          turn_left0;
        } else if (SENSOR_1 < THRESHOULD + 7){
          go_forward;
        } else if (SENSOR_1 < THRESHOULD + 15){
          turn_right0;
        } else {
          turn_right1;
          }
        nOnline=0;
         }
       Wait(STEP);
       }
     short_break;
     PlaySound(SOUND_LOW_BEEP);
     shoot;              //シュート//
     PlaySound(SOUND_FAST_UP);
     Wait(300);
     OnRL(SPEED_H,SPEED_H);
     Wait(2000);
     Off(OUT_BC);
     Wait(300);
     start play_music;
     }
   }
 }

・交差点はラストのシュートまでなるべく通らないように工夫しました。

・電池が元気なうちはこのプログラムで十分だが、時がたつに連れシュート率は格段に下がる。

・音楽は頑張ったのにあまり出来はよろしくない。
*まとめ [#xce024d9]

**工夫した点 [#u04ce925]
・交差点の判断は難しいのでなるべく通らないようにしたこと

・シュートしたら音楽が祝ってくれるようにしたこと

**反省点 [#ae60aa00]
・あまりシュートが入らないこと(構造の問題、電池による回転数うんぬんにも大きく左右される)

・コースの黒色にムラが多いこと

・シュートする機構を作ることにほとんど携わっていないこと

・作った音楽がひどいこと(音楽センスのなさを感じる)

・コースの脱線が多いこと

**感想 [#uc2309b9]
はじめてロボットを組み立てたり、プログラムを組んだりしたので、楽しかったのですが、正直、途中からあまりついていけていませんでした。そのかわり、相方は、なかなかいいプログラムを作ってきて、いろいろ教えてくれたのでとても助かりました。しかし、やはりプログラムは自分で考えて作るべきなので教えてもらってばかりじゃいけないなと思いました。プログラムや機構の精度はまだ全然なので、次はもっときちんとした精度の高いものが作り出せるように、今回の経験を活かしていけたらいいなと思います。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS