[[2016a/Member]]

目次

#contents

*はじめに [#u3a169c9]

課題は2課題の交差点コースを使い、紙コップを運び重ねることである。
詳しい内容は
[[2016年度前期 課題3:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission3]] 

*ロボットの説明 [#u3a169c9]

今回は、2つのグループで紙コップを運ぶロボット、紙コップを重ねるロボットに分け、ロボットを2台を作った。

最初は、2つのキットから一つのロボットを作りたかったが、腕は重すぎ、タイヤが回れなくなってしまい、最後的に、2つのロボットに分けることにした。

http://s019.radikal.ru/i624/1608/62/b27a76594233.jpg
http://s012.radikal.ru/i319/1608/57/fff3951dfa82.jpg

**紙コップ積み重ねロボット [#p2a9f681]

紙コップを重ねるロボットは2つのモーターを使っているようにしてみた。

モーターは[[1課題:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FLAtiko%2FMission1]]と同じようにボールねじを基にする減速機の形をしている。

出力Aのモーターでアームを開閉し、出力Cのモーターでアームを上下している。

青い線のところは使ったモーターである。

http://i066.radikal.ru/1608/3f/8b0d71f0d38c.jpg

もっと詳しいモーターの画面は以下である。

http://s019.radikal.ru/i604/1608/8f/30b184ed08b5.jpg
http://s018.radikal.ru/i520/1608/62/fc353de70ae9.jpg

http://s017.radikal.ru/i426/1608/05/f4d50aa48420.jpg
http://s14.radikal.ru/i187/1608/c4/0ac4df28f76a.jpg

http://s010.radikal.ru/i314/1608/6a/2329e6f7bb07.jpg

**紙コップ運搬ロボット [#hfa1d109]

紙コップを運ぶロボットはほかのグループの2課題のベースとしている。

http://s014.radikal.ru/i329/1608/55/8676ec19c91a.jpg

*プログラミングの説明 [#h92c4e55]

2台のロボットを作ったので紙コップを運ぶプログラムと紙コップを重ねるプログラムを作った。

課題が困難だったので、みんなでプログラムを書いたが、大体のプログラミングをしたのは確か[[kefusuke:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Fkefusuke%2FMission3]]である。

**積み重ねロボットのプログラミング [#pc495f80]

積み重ねロボットは出力Aのモーターでアームを開閉し、出力Cのモーターでアームを上下しているという風に動いているから

プログラムは白いコップを光センサーで感知し、ゆっくりで動作するである。

 #define nigiru OnFwd(OUT_A);Wait(move_timeA);Off(OUT_A); //アームを閉じる
 #define hanasu OnRev(OUT_A);Wait(350);Off(OUT_A);        //アームを開く
 #define arm_up OnFwd(OUT_C);Wait(move_timeB);Off(OUT_C); //アームを下げる
 #define arm_down OnRev(OUT_C);Wait(500);Off(OUT_C);      //アームを上げる
 #define s_arm_down OnRev(OUT_C);Wait(200);Off(OUT_C);    //アームを少し下げる 
 int move_timeA;                                          //アームを閉じる時間
 int move_timeB;                                          //アームを上げる時間
 
 task main()
 {
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  int n=0;                                  //紙コップを持ち上げた回数を数えるカウンター                
  move_timeA=400;                           //アームを閉じる時間を4秒に設定
  move_timeB=800;                           //アームを上げる時間を8秒に設定
  
  while(n<=4){
     if(SENSOR_1>50){                        
         s_arm_down; hanasu; arm_down;        //紙コップを重ねる                   
         nigiru; move_timeB=move_timeB+80;   //アームを閉じる(1回ごとに+0.8秒する)
         arm_up; move_timeA=move_timeA+1;    //紙コップを持ち上げる(1回ごとに+0.01秒する)
         n++;                               //カウンターを+1する
     }
  }
 s_arm_down;hanasu;arm_up;Off(OUT_A);       //6つ目の紙コップを重ねる
 }

**運搬ロボットのプログラミング [#h3c6e036]

交差点が多いのでライントレースに戻るめに様々なdefineやサブを書いたが、

そんなに難しくしなくて良かったと思います。

 #define THRESHOLD 42                                     //閾値
 #define gofw OnFwd(OUT_AC);Wait(5);                      //直進
 #define turn_left Off(OUT_A); OnFwd(OUT_C);              //左折
 #define senkai_left OnFwd(OUT_C);OnRev(OUT_A);Wait(63);  //交差点左旋回
 #define turn_right OnFwd(OUT_A); Off(OUT_C);             //右折
 #define senkai_right OnFwd(OUT_A);OnRev(OUT_C);Wait(60); //交差点右旋回
 #define senkai OnFwd(OUT_A);OnRev(OUT_C);Wait(90);       //180度旋回
 #define STEP 1                                           //一回の判定で進む時間  
 #define B_up OnFwd(OUT_B);Wait(80);Off(OUT_B);           //出力Bの腕を上げる
 #define B_down OnRev(OUT_B);Wait(80);Off(OUT_B);         //出力Bの腕を下げる
 #define back OnRev(OUT_AC);Wait(move_time);Off(OUT_AC);  //後退
 #define tyousei_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);  //角度調整のための左旋回 
 #define tyousei_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);  //角度調整のための右旋回
 #define watasu OnFwd(OUT_AC);Wait(120);Off(OUT_AC);OnRev(OUT_AC);Wait(50);Off(OUT_AC);Wait(2000); //積み重ねロボとの接触調整
 int move_time;                                           //後退の時間


***サブ [#a72a7838]

以上言った通りに交差点が多く、違う方向に行ってしまう可能性があるので、普通のライントレースにタイマーを付けるようにした。

 void line_follow(int t)
  { 
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   ClearTimer(0);
 
  while (Timer(0)<t) {
    if (SENSOR_2 < THRESHOLD){  
        turn_left;                
    } else {                  
        turn_right;            
    }
    Wait(STEP); 
  }Off(OUT_AC);
 }

直進する

 sub crossing_fwd()
 {
  SetSensor(SENSOR_2, SENSOR_LIGHT);
  int n=0;
  while(n<10){
    if (SENSOR_2 < THRESHOLD){  
        turn_left;n++;             
    } else {                    
        turn_right;n=0;              
    }
   Wait(STEP); 
  }Off(OUT_AC);Wait(100);gofw;
 }

止まる

 sub crossing_stop()
  {
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   int n=0;
   while(n<10){
    if (SENSOR_2 < THRESHOLD){  
        turn_left;n++;             
    } else {                    
        turn_right;n=0;              
    }
   Wait(STEP); 
  }Off(OUT_AC);Wait(100);
 }

交差点を右へ曲がる

 sub crossing_right()
 {
  SetSensor(SENSOR_2, SENSOR_LIGHT);
  int n=0;
  while(n<10){
    if (SENSOR_2 < THRESHOLD){  
        turn_left;n++;             
    } else {                    
        turn_right;n=0;              
    }
   Wait(STEP); 
  }Off(OUT_AC);Wait(100);senkai_right;OnFwd(OUT_AC);Wait(30);
 }

交差点を左へ曲がる

 sub crossing_left()
 {
  SetSensor(SENSOR_2, SENSOR_LIGHT);
  int n=0;
  while(n<10){
    if (SENSOR_2 < THRESHOLD){  
        turn_left;n++;             
    } else {                    
        turn_right;n=0;              
    }
    Wait(STEP); 
  }Off(OUT_AC);Wait(100);senkai_left;
 }


***マイン [#vc04959b]

 task main()
 {
 move_time=50;           //後退の時間を0.5秒に設定
 line_follow(105);
 tyousei_l(30);          //急カーブ手前の角度調整
 crossing_left();        //Pを左折
 line_follow(50);
 crossing_right();       //Sを右折
 crossing_stop();        //Cで停止
 tyousei_r(20);          //紙コップを取るための角度調整
 back;                   //1つ目の紙コップを取るための後退                  
 B_down;
 senkai;
 line_follow(50);
 crossing_left();        //Sを左折
 line_follow(50);
 crossing_fwd();         //Pを直進
 line_follow(25);
 tyousei_l(40);          //急カーブ手前の角度調整
 crossing_fwd();         //Rを直進
 tyousei_r(15);          //紙コップを渡す場所の調整
 watasu;
 tyousei_l(25);          //旋回前の調整
 senkai;
 B_up;
 repeat(2)
 {
 OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進
 line_follow(50);
 crossing_fwd();          //Pを直進
 crossing_left();         //Sで左折
 crossing_stop();         //Dで停止
 tyousei_r(20);           //紙コップを取るための角度調整
 back;                    //1つ目の紙コップを取るための後退     
 B_down;
 senkai;
 crossing_right();        //Sを右折
 crossing_fwd();          //Pを直進
 line_follow(25);
 tyousei_l(40);           //急カーブ手前の角度調整
 crossing_fwd();          //Rを直進
 tyousei_r(15);           //紙コップを渡す場所の調整
 watasu;
 tyousei_l(25);           //旋回前の調整
 senkai;
 B_up;
 OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進
 line_follow(20);
 crossing_fwd();          //Pを直進
 crossing_right();        //Sを右折
 crossing_stop();         //Cで停止
 tyousei_r(20);           //紙コップを取るための角度調整
 back;move_time=move_time-25; //3つ目、5つ目の紙コップを取るとき後退時間を-0.25秒している 
 B_down;
 senkai;
 line_follow(50);
 crossing_left();         //Sを左折
 line_follow(50);
 crossing_fwd();          //Pを直進
 line_follow(25);
 tyousei_l(40);           //急カーブ手前の角度調整
 crossing_fwd();          //Rを直進
 tyousei_r(15);           //紙コップを渡す場所の調整
 watasu;
 tyousei_l(25);           //旋回前の調整
 senkai;
 B_up;
 }
 OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進
 line_follow(50);         
 crossing_fwd();          //Pを直進     
 crossing_left();         //Sを左折
 crossing_stop();         //Dで停止
 tyousei_r(20);           //紙コップを取るための角度調整
 back;
 B_down;
 senkai;
 crossing_right();        //Sを右折
 crossing_fwd();          //Pを直進
 line_follow(25);
 tyousei_l(40);           //急カーブ手前の角度調整
 crossing_fwd();          //Rを直進     
 tyousei_r(15);           //紙コップを渡す場所の調整
 watasu;
 senkai;
 line_follow(15);
 crossing_right();        //Rを右折
 OnFwd(OUT_AC);Wait(200);Off(OUT_AC); //円に向かう
 }

サブルーチンなどをたくさん使った結果はメインタスクは重くなってしまった。

*結果 [#uc87b7d1]

紙コップを運ぶロボットか紙コップを重ねるロボットかプログラムがどこか間違い、コップを重ねるのができなく、基本点は0点になった。

しかし、技術点が10,2点だったおかげで、全体順位は4位であった。

*反省・感想 [#cb1d80ec]

時間が足りなく、より良いロボットやプラグラムが作れなかった。
時間が足りなく、より良いロボットやプログラムが作れなかった。

そんなにたくさん時間がかからないと思った。

紙コップを重ねるロボットに満足するが、紙コップを運ぶロボットを違う形でしたほうがよかったと思う。

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