2018a/Member

課題3

〜空き缶を分別して所定の場所に運べ〜

ロボット

1.下の缶を押さえる 2.上の缶を押さえる 3.上の缶を少し持ち上げる 4.真ん中の缶を抜く5.上の缶を下ろす 6.運ぶ 7.1〜5を繰り返す

という動作をさせ、課題を達成させようとした。そのため、ロボットの主なパーツは6か所に分かれている。

実際に完成したロボットの写真、主なパーツの説明は以下

ロボットの写真 正面
ロボットの写真 真横

各パーツの説明

_爾隆未魏,気┐襯僉璽

  △寮橘未縫癲璽拭爾鯆樟椶弔韻討い襦

  光センサーもこの部分と一体となっており、ライントレースするときに大回りになってしまうことを避けている。

  また、地面に向かって伸びている黒い曲がったパーツは、このロボットの重心が若干前方にあるため、ロボットを支える役割を果たしている。

 

移動パーツ

  ほぼマニュアルに書いてあったものと同様。全体的に缶との高さを合わせるために若干高くしてある。

 

真ん中の缶を押し倒すパーツ

  RCX本体同士を支える四本の支柱の間に差し込む形で設置している。斜め上を向いているのは缶との高さを合わせるためである。

  モーターは後ろ側についていて、直接押し出す部分のレールにつなげている。

  この時、出し過ぎたり、戻しすぎたりしないようにレールの前後にストッパーのようなものをつけている。

 

ぞ紊隆未鬚弔むパーツ

  レールを敷いて横倒しにしたモーターが動くようにしている。

  ブロックの裏と表が混じっているが、これはモーターが左右に動きやすくするためで、穴あき2×8ブロックなどの穴の部分を利用して作っている。

 

ゴ未鮖ち上げるためのパーツ

  ほぼマニュアルにあったキャタピラと一緒だが、正立したモーターに対して垂直の方向にキャタピラが向くようにしている。

 

Δもり

  全体的に前によった重心を後ろに持っていくための部分。ルール上良いかはわからないが中には使い終わった電池が入っている。

プログラム

させたかった動作はロボットの説明上部に書いた通りであるが、ロボットを完成させるのに時間がかかってしまったため、1点でも取りに行くという目標に途中で変更し、プログラムを書き直した。

実際に使用したプログラムは以下

下のRCX

/*値定義*/
#define LOWPOWER 1
#define HIGHPOWER 6
#define BLACK 39        /*黒の閾値*/
#define WHITE 40        /*白の閾値*/
/*動作定義*/
#define turn_r OnFwd(OUT_A);OnRev(OUT_C);SetPower(OUT_AC,HIGHPOWER);  /*右旋回*/
#define turn_l OnFwd(OUT_C);OnRev(OUT_A);SetPower(OUT_AC,HIGHPOWER);  /*左旋回*/
#define go OnFwd(OUT_AC);SetPower(OUT_AC,LOWPOWER);                /*直進*/
#define grip_sita Off(OUT_B);SetPower(OUT_B,LOWPOWER);OnFwd(OUT_B);  /*下の缶を掴む*/
#define release Off(OUT_B);SetPower(OUT_B,LOWPOWER);OnRev(OUT_B);  /*下の缶を放す*/
#define stay Off(OUT_AC);                                /*静止*/
/*通信用定義*/
#define GRIP_UE 11        /*上の缶を掴ませる*/
#define STAY 12        /*静止させる*/
#define RELEASE 13        /*上の缶を放させる*/
#define GO_TRACE 14        /*トレース動作に戻る*/
#define PUSH 15        /*真ん中の缶を落とさせる*/
#define LIFT_DOWN 16        /*上の缶を下ろさせる*/
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
ClearMessage(); 
int blackN = 0;                /*T字路の判断に使用*/    
   while(blackN <= 1){

       if(SENSOR_1 >= WHITE && SENSOR_3>= WHITE){    /*ライントレース開始*/
           go;

       }else if(SENSOR_3 <= BLACK && blackN == 0){    /*曲がり角の判断*/
           go;Wait(50);        /*少し進んでから右折させる*/
           stay;Wait(50);
           turn_r;
           Wait(125);
           blackN++;        /*黒に入った回数をカウント*/

       }else if(SENSOR_3 <= BLACK && blackN == 1){    /*T字路の判断*/
           stay;
           blackN++;        

       }
       stay;Wait(30);        /*一時停止*/
   }
   grip_sita;Wait(60);Off(OUT_B);        /*下の缶を掴む*/
   SendMessage(GRIP_UE);Wait(800);        /*上の缶を掴む命令を出す*/
   while(Message() == GO_TRACE){  /*少し進んでからライントレースを再開する予定だった*/
   SendMessage(STAY);        
   stay;Wait(50);    
   OnFwd(OUT_AC);Wait(300);stay;    /*直進させて2つ目の缶タワーにぶつける*/
   ClearMessage();  /*while文を抜ける*/
   }
}

上のRCX

/*値定義*/
#define LOWPOWER 2
/*動作定義*/
#define grip_ue OnFwd(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100);     /*上の缶を掴む*/
#define release OnRev(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100);Off(OUT_C);  / *上の缶を放す*/
#define lift_up OnFwd(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(100);Off(OUT_A);   /*上の缶を上げる*/
#define lift_down OnRev(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(200);Off(OUT_A); /*上の缶を下ろす*/
#define push OnFwd(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B);   /*真ん中の缶を落とす*/
#define reload OnRev(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B);   /*缶を落とす機構を戻す*/
#define stay Off(OUT_AC);        /*静止*/                            
/*通信用定義*/
#define GRIP_UE 11        /*上の缶を持ち上げる*/
#define STAY 12        /*静止する*/
#define RELEASE 13        /*上の缶を放す*/
#define GO_TRACE 14        /*トレース動作に戻させる*/
#define PUSH 15        /*真ん中の缶を落とす*/
#define LIFT_DOWN 16        /*上の缶を下ろす*/
task main(){
ClearMessage();
int CT1=0;        /*缶タワー1に対する動作の区別に使用*/
   while(CT1 == 0){
       if(Message()==GRIP_UE){            
           grip_ue;        /*上の缶を掴む*/
           stay;Wait(50);
           CT1++;            /*缶タワー1に対する操作の終了*/

       }else{
           stay;            
       }
   }
   lift_up;                /*上の缶を持ち上げる*/    
   stay;Wait(50);
   push;                    /*缶を押し倒す*/
   Wait(50);
   reload;                /*落とすのに使った部分を戻す*/
   stay;Wait(50);
   lift_down;                /*上の缶を下ろす*/
   SendMessage(GO_TRACE);        /*トレースを再開してもらう*/
}

反省点など

本番ではライントレースの時点で失敗してしまった。おそらく、黒い部分に入った回数で動作を変えさせようとしたうえ、右折を秒数指定でさせたため、二つの光センサーが両方とも黒い部分に入ってしまったためだと思われる。電池や明るさなどのコンディションによってロボットが違った動きをするということを考慮するべきだった。交差点の判断の仕方も、前回の課題の反省を活かすことができず、勉強不足を痛感した。

また、RCX本体の通信部分が、このロボットは空間図形的に垂直であることに、ロボットを組み立て終わってから気が付いた。これによってロボット同士の通信がほぼ運頼みになってしまっていた。きちんと考えて作るべきだった。

上の缶を持ち上げる部分も、つかむ部分も、コンベア型だと安定していない。グループ内で意見がまとまるのが遅かったのも原因の一つではないかと感じている。


添付ファイル: fileIMG_3713.JPG 13件 [詳細] fileIMG_3663.JPG 10件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-09 (木) 01:22:05 (378d)