2016a/Member

目次

はじめに

課題は2課題の交差点コースを使い、紙コップを運び重ねることである。 詳しい内容は 2016年度前期 課題3

ロボットの説明 

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

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

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

紙コップ積み重ねロボット

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

モーターは1課題と同じようにボールねじを基にする減速機の形をしている。

出力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

紙コップ運搬ロボット

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

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

プログラミングの説明

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

課題が困難だったので、みんなでプログラムを書いたが、大体のプログラミングをしたのは確かkefusukeである。

積み重ねロボットのプログラミング

積み重ねロボットは出力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つ目の紙コップを重ねる
}

運搬ロボットのプログラミング

交差点が多いのでライントレースに戻るめに様々な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;                                           //後退の時間

サブ

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

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;
}

マイン

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); //円に向かう
}

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

結果

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

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

反省・感想

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

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

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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-13 (土) 00:31:41 (1103d)