2017a/Member

課題について

詳しくは課題2を参照。コースは、E地点直進コース。

ロボットの説明

全体 全体

今回は出来るだけコンパクトにするために、タイヤを2つだけにした。このおかげで、細かい動きが出来るようになった。また、旋回もしやすくなったので、きついペアピンも問題なく曲がる事が出来た。光センサを出来るだけ地面に近くなるように工夫した。タイヤと光センサとの距離が、近すぎても遠すぎてもうまく行かなかったので、ちょうど良い設置位置を見つけるのに苦労した。

全体 全体

後輪を外した代わりに、後ろの部分に支柱を付けた。なめらかに動かすために、支柱の下部に半球の部品を付けた。

プログラムの説明

マクロ

マクロは以下のように定義した。

#define THRESHOLD 42
//直角用
#define HIPOWER 7  
#define LOWPOWER 1   
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go set_power_H; OnFwd(OUT_AC);
#define l1 set_power_L;OnFwd(OUT_C); OnRev(OUT_A);//左旋回
#define l0 set_power_L;OnFwd(OUT_C); Off(OUT_A);//左折
#define r0 set_power_L;OnFwd(OUT_A); Off(OUT_C);//右折
#define r1 set_power_L;OnFwd(OUT_A); OnRev(OUT_C);//右旋回
//その他用
#define r3 Off(OUT_AC);Wait(1);OnFwd(OUT_A);OnRev(OUT_C);//右旋回
#define r2 Off(OUT_AC);Wait(1);OnFwd(OUT_A);//右折
#define l3 Off(OUT_AC);Wait(1);OnFwd(OUT_C);OnRev(OUT_A);//左旋回
#define l2 Off(OUT_AC);Wait(1);OnFwd(OUT_C);//左折
#define teisi Off(OUT_AC);PlaySound(SOUND_DOWN);Wait(100);//一時停止

光センサのしきい値は42とした。直角用のマクロは、曲がりやすくするために速度を落とした。ほかの部分のマクロは、一回ごとに動きを止めることにより、無駄な動きを出来るだけ減らした。

サブルーチン

サブルーチンは以下のように定義した。

sub AEF_FQ_QR_SG_TH_RS_PE_EA(){int a=0;            //AEF_FQ_QR_SG_TH_RS_PE_EA間
  while(a < 20){
   if (SENSOR_2 > THRESHOLD +7) {       //白なら右旋回
     r3;   
   } else if (SENSOR_2 > THRESHOLD +3) {//白っぽいなら右折
     r2;      
   } else if (SENSOR_2 > THRESHOLD -3) {//灰色なら直進
     go;  
   } else if(SENSOR_2 > THRESHOLD -7)  {//黒っぽいなら左折
     l2;  
   } else{                              //黒なら左旋回
     l3; a++;
   }
     Off(OUT_AC);
   }}
sub F_Q_S_G_H_R_E(){                              //センサが白を識別するまで左旋回
   while(SENSOR_2 < THRESHOLD ){
   l1;
   }}
sub R_T_S(){                                      //交差点直進
   while(SENSOR_2 < THRESHOLD ){
    go;
   }
   int c=0;
  while(c < 20){
   if (SENSOR_2 > THRESHOLD +7) {
     r3;   
   } else if (SENSOR_2 > THRESHOLD +3) {
     r2;      
   } else if (SENSOR_2 > THRESHOLD -3) {
     go;  
   } else if(SENSOR_2 > THRESHOLD -7)  {
     l2;  
   } else{
     l3; c++;
   }
     Off(OUT_AC);
   }
  while(SENSOR_2 < THRESHOLD ){
   l1;
   }}
sub RS_SP_TT_TR(){int d=0;                       //RS_SP_TT_TR間
  while(d < 4){
   if (SENSOR_2 > THRESHOLD +7) {
     r3;   
   } else if (SENSOR_2 > THRESHOLD +3) {
     r2;      
   } else   {
     go;  d++;
   } 
     Off(OUT_AC);
   }}
sub GH(){int f=0;                               //きついペアピン
  while(f < 270){
   if (SENSOR_2 > THRESHOLD +7) {
     r1;   
   } else if (SENSOR_2 > THRESHOLD +3) {
     r0;      
   } else if (SENSOR_2 > THRESHOLD -3) {
     go;  
   } else if(SENSOR_2 > THRESHOLD -7)  {
     l0;  
   } else{
     l1; f++;
   }
     Off(OUT_AC);
   }}
sub A(){                    //A内進入
   while(SENSOR_2 < THRESHOLD ){
   go;
   }
   Off(OUT_AC);
   }

このプログラムは、ロボットがラインの左側をなぞるように組み立てた。サブルーチンにも書いてあるようにコースをいくつかのゾーンに分けて組み立てた。センサの識別は5段階に分けたおかげで、綺麗に線をなぞることが出来た。特に難しかったところは、RS_SP_TT_TR間であり、交差点進入時に車体が線に対して少し斜めっているため、そこの部分は黒の識別のカウンタを減らして対応した。交差点の識別は、コースを分けたおかげで意外とスムーズに出来た。

メインプログラム

task main()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);
 AEF_FQ_QR_SG_TH_RS_PE_EA();
 PlaySound(SOUND_UP);                       //F
 F_Q_S_G_H_R_E();
 AEF_FQ_QR_SG_TH_RS_PE_EA();
 teisi;                                     //Q
 F_Q_S_G_H_R_E();
 AEF_FQ_QR_SG_TH_RS_PE_EA();                
 PlaySound(SOUND_UP);                       //R 
 R_T_S();
 RS_SP_TT_TR();                             
 PlaySound(SOUND_UP);                       //S
 F_Q_S_G_H_R_E();
 AEF_FQ_QR_SG_TH_RS_PE_EA();
 PlaySound(SOUND_UP);                       //G
 F_Q_S_G_H_R_E();
 GH();
 PlaySound(SOUND_UP);                       //H
 F_Q_S_G_H_R_E();
 AEF_FQ_QR_SG_TH_RS_PE_EA();
 teisi;                                     //T
 R_T_S();
 RS_SP_TT_TR();
 teisi;                                     //T
 R_T_S();
 RS_SP_TT_TR();
 teisi;                                     //R
 F_Q_S_G_H_R_E();
 AEF_FQ_QR_SG_TH_RS_PE_EA();
 PlaySound(SOUND_UP);                       //S
 R_T_S();
 RS_SP_TT_TR();
 PlaySound(SOUND_UP);                       //P
 AEF_FQ_QR_SG_TH_RS_PE_EA();
 teisi;                                     //E
 F_Q_S_G_H_R_E();
 AEF_FQ_QR_SG_TH_RS_PE_EA();
 A();
 PlaySound(SOUND_DOWN);                     //A
}

マクロとサブルーチンを活用したおかげで、メインプログラムは簡潔にすることが出来た。このプログラムはタイマなどを使用していなく、また、旋回時にもわざと速度を落としているので、電池の電圧低下の影響をほぼ受けないようにすることに成功した。

反省と感想

ロボットについては、初期の四輪駆動から二輪車の二輪駆動にしたおかげで、動きをなめらかにすることが出来たのでうれしかった。それと同時に四輪駆動では、ペアピンは難しいということが実感できた。プログラムについては、はじめはサブルーチンを使わないでプログラムを作っていたので途中で挫折した。その後、サブルーチンを使ったら、あっさり完成し、簡潔にまとめることに成功したので驚いた。今回の課題で、サブルーチンの素晴らしさをとても感じることが出来た。この課題が出来たときの達成感はとても気持ちよかったので、この調子で次の課題もサブルーチンを上手に活用して頑張りたい。


添付ファイル: filerobo15.jpg 253件 [詳細] filerobo14.jpg 259件 [詳細] filerobo13.jpg 102件 [詳細] filerobo12.jpg 97件 [詳細] filerobo11.jpg 218件 [詳細] filerobo10.jpg 220件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-14 (月) 09:53:40