#contents
*課題 [#sf52f212]
ピンポン玉と紙コップを別々に回収して所定の場所に運ぶ
#ref(2017b/Member/shun/Mission3/2017b-mission3.png,40%,ロボット)

*ロボットの説明 [#zfe090b6]
**紙コップをつかみ、引き上げる機構 [#dcaf72d1]
紙コップをつかむのにモーターを一つ、紙コップを引き上げるのにモーターを一つ使用した。
#ref(2017b/Member/shun/Mission3/IMG_1910.JPG,20%,ロボット)
**紙コップの位置を調節する機構 [#b7b8400a]
紙コップを光りセンサーで感知し、右旋回、直進することで紙コップの位置を調節した。
#ref(2017b/Member/shun/Mission3/IMG_1911.JPG,20%,ロボット)
**光センサーの位置 [#s24b6cf7]
前と下に光センサーをつけ、紙コップの有無の判断とライントレースを可能にした。
#ref(2017b/Member/shun/Mission3/IMG_1914.JPG,20%,ロボット)
**本体の取り付け [#la8145e9]
#ref(2017b/Member/shun/Mission3/IMG_1917.JPG,20%,ロボット)
上の写真のように二つの本体をつけても通信することが出来なかったため、下の写真のようにして通信を出来るようにした。
#ref(2017b/Member/shun/Mission3/IMG_1916.JPG,20%,ロボット)
*プログラミング [#gc4237a9]
***主な定義(土台) [#ya3644a6]
 #define GO_AHEAD 10  
 #define MOTION_END 20 
 #define OWARI 30
 #define CYOI 40    //通信の定義
 #define mae(w) ;OnRev(OUT_AC);Wait(w);Off(OUT_AC);     //前進
 #define zennsinn  OnRev(OUT_AC);
 #define usiro(g)  OnFwd(OUT_AC);Wait(g);Off(OUT_AC);     //後退
 #define SHIKIICHI 870  //コップを感知する閾値
 #define migisennkai(s) set_power_L;OnFwd(OUT_A);OnRev(OUT_C);Wait(s);Off(OUT_AC);    //右旋回
 #define hidarisennkai(n) set_power_L;OnFwd(OUT_C);OnRev(OUT_A);Wait(n);Off(OUT_AC);    //左旋回

 #define shikiichi 48
 #define turn_left1 set_power_L;OnFwd(OUT_A);OnRev(OUT_C);     //左旋回
 #define turn_right1 set_power_L;OnRev(OUT_A);OnFwd(OUT_C);     //右旋回
 #define turn_left2 set_power_L;Off(OUT_A);OnRev(OUT_C);    //左折
 #define turn_right2 set_power_L;Off(OUT_C);OnRev(OUT_A);    //右折

 #define LOWPOWER 1
 #define HIGHPOWER 4
 #define set_power_H SetPower(OUT_AC,HIGHPOWER);
 #define set_power_L SetPower(OUT_AC,LOWPOWER);








***一つ目のコップのピンポン玉を運ぶ [#x78bed59]
A地点からスタートしてライントレースをし、前につけた光センサーにより一つ目のコップを見つける。その後右旋回して、再びライントレースでB地点まで行き、X地点を目指す。
 sub line_l()     //紙コップ付近に行く
 {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
    while(FastTimer(0)<=550){
       if(SENSOR_2 < shikiichi -7){
         turn_right2;
        } else if (SENSOR_2 < shikiichi -4 ){
         turn_right2;
        } else if (SENSOR_2 < shikiichi -1){
          zennsinn;
        } else if (SENSOR_2 < shikiichi ){
          turn_left2;
        } else {
           turn_left2;
         }
     }
       PlaySound(SOUND_CLICK);
       Off(OUT_AC);
 }

 sub line_ll()     //3秒間のライントレース               
 {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
    while(FastTimer(0)<=300){
       if(SENSOR_2 < shikiichi -7){
         turn_right1;
        } else if (SENSOR_2 < shikiichi -4 ){
         turn_right2;
        } else if (SENSOR_2 < shikiichi -1){
          zennsinn;
        } else if (SENSOR_2 < shikiichi ){
          turn_left2;
        } else {
           turn_left1;
         }
     }
       PlaySound(SOUND_CLICK);
       Off(OUT_AC);
 }

 sub line_k()
 {
    SetSensor(SENSOR_2,SENSOR_LIGHT);     //交差点までのライントレース
    ClearTimer(0);
    while(FastTimer(0)<=25){
       if(SENSOR_2 < shikiichi-6){
         turn_right1;
        } else if (SENSOR_2 < shikiichi -4){
          turn_right2;
          ClearTimer(0);
        } else if (SENSOR_2 < shikiichi -1){
          zennsinn;
          ClearTimer(0);
        } else if (SENSOR_2 < shikiichi ){
           turn_left2;
          ClearTimer(0);
        } else {
           turn_left2;
          ClearTimer(0);
         }
     }
       PlaySound(SOUND_CLICK);
       Off(OUT_AC);
 }

***2つ目のコップのピンポン玉を運ぶ [#vf0e4541]
ピンポン玉を置いたあと再びB地点に戻る。その後ライントレースにより障害物に近づく。光センサーにより障害物を発見し、後退する。そして右に方向を変え、直進し、コップを発見し次第止まり、コップを取る。コップ取得後は右旋回をしてX地点を目指す。

 sub line_lll()      //コップ付近までのライントレース
 {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
   while(SENSOR_1 < SHIKIICHI -40){  
       if(SENSOR_2 < shikiichi -7){
         turn_right1;      
        } else if (SENSOR_2 < shikiichi -4 ){
         turn_right2;
        } else if (SENSOR_2 < shikiichi -1){
          zennsinn;
        } else if (SENSOR_2 < shikiichi ){
          turn_left2;
        } else {
           turn_left2;
         }
    
    }
       PlaySound(SOUND_CLICK);
       Off(OUT_AC);
 }

 sub shougaibutsu()     //障害物を探す
 {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
  while(SENSOR_1 < SHIKIICHI -130){
       mae(10);
   }
  Off(OUT_AC);
  Wait(100);
  usiro(200);
  Wait(300);
  ClearMessage();
  SendMessage(OWARI);
 }


 sub search3()      //2つ目のコップを探す
 {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
  while(SENSOR_1 < SHIKIICHI -40){
       mae(10);      
      }
  Off(OUT_AC);
  Wait(100);
  hidarisennkai(20);
  Wait(100);
  mae(30);
  Wait(300);
  ClearMessage();
  SendMessage(OWARI);
 }

***3つ目のコップのピンポン玉を運ぶ [#d79a7fe1]
ピンポン玉を置いたあと、左旋回をし、その後、直進と右旋回を少しずつ繰り返すことにより、コップを探し、一時停止でコップを取り、右旋回でX地点を目指す。
 sub search4()     //3つ目のコップを探す
 {
  SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
  while(SENSOR_1 < SHIKIICHI -40){
       mae(020);
       migisennkai(010);
      }
  Off(OUT_AC);
  Wait(100);
  hidarisennkai(20);
  Wait(100);
  mae(30);
  Wait(300);
  ClearMessage();
  SendMessage(OWARI);
 }


**タスクメイン(土台) [#h6d8acf2]
 task main()
 {
   SetSensor(SENSOR_1,SENSOR_LIGHT);
  SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
   mae(050);
   line_l();
   Wait(100);
   mae(40);
   SendMessage(CYOI);//1
   Wait(50);
   mae(30);
   migisennkai(250);
   line_ll();  
   line_k();
   hidarisennkai(140);
   SendMessage(CYOI);//2
   ClearMessage();
   until(Message() == CYOI);//3
   mae(160);
   Wait(100);
   ClearMessage();
   SendMessage(CYOI);//4       1つ目のピンポン玉完了
   until(Message() == CYOI);//4.5
   usiro(180);
   ClearMessage();
   hidarisennkai(100);
   line_lll();
   shougaibutsu();
   migisennkai(60);
   search3();
   mae(030);
   Wait(100);
   SendMessage(CYOI);//5
   until(Message() == CYOI);//6
   SendMessage(CYOI);//7
   migisennkai(150);
   mae(050);
   SendMessage(CYOI);//8     2つ目のピンポン玉完了
   ClearMessage();
   until(Message() == CYOI);//9
   usiro(060);
   Wait(50);
   ClearMessage();
   hidarisennkai(120);
   mae(300);
   migisennkai(050);
   mae(060);
   search4();
   Wait(50);
   mae(020);
   migisennkai(040);
   mae(020);
   SendMessage(CYOI);//10
   until(Message() == CYOI);//11
   ClearMessage();
   usiro(100);
   migisennkai(180);
   mae(080);
   SendMessage(CYOI);//12
   until(Message() == CYOI);//13
   ClearMessage();
   mae(130);
   SendMessage(CYOI);//14      3つ目のピンポン玉完了
   until(Message() == CYOI);//15
   ClearMessage();
   usiro(100);
   migisennkai(280);
   mae(030);
   SendMessage(CYOI);//16      コップを離す
   until(Message() == CYOI);//17
   usiro(070); 
*結果 [#lff97104]
基本点30点、技術点19.7点、合計49,7点
1位になることができた。
*感想 [#e6adaef4]
今回の課題は今までで一番難しく、時間も少なかったため大変だった。
この授業で初めてプログラミンロボットをつくり、動かすことが出来たので、とても良い経験になった。

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