課題3について

詳しくは2017a/Mission3

ロボットについて

はじめはアーム部分にタイヤを取り付け、そのタイヤを回転さえることによって空き缶を持ち上げるというロボットを作ったが、これだと安定して持ち上げることができないということがわかり、アームと上下する部分を別にした。ぎざぎざした長い棒とぎざぎざした円板をかみ合わせ、モーターを動かしてアームを上下させた。

プログラミング

定義

#define go_forward OnFwd(OUT_AC);//前進
#define turn_right OnFwd(OUT_A);//右折
#define turn_left OnFwd(OUT_C);//左折
#define migisenkai OnFwd(OUT_A); OnRev(OUT_C);//右旋回
#define hidarisenkai OnFwd(OUT_C); OnRev(OUT_A);//左旋回
#define power(s) SetPower(OUT_AC,s); //モーターの出力が変更可能
#define sound1 PlaySound(SOUND_UP);
#define sound2 PlaySound(SOUND_DOWN);Wait(100);
#define GO(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC);//前進時間変更可能
#define SIGNALGRAB 100
#define SIGNALBACK 200
#define back(u) OnRev(OUT_AC); Wait(u); Off(OUT_AC);//後退時間変更可能

サブルーチン sub trace2()//交差点の判断などは課題兇了と同様 {

   ClearTimer(0); 
   while (FastTimer(0)<=25){
       if (SENSOR_1 > 49){//右旋回
           migisenkai; ClearTimer(0);
       } else if (SENSOR_1 > 44){//右折
           turn_right; ClearTimer(0);
       } else if (SENSOR_1 > 40){//前進
           go_forward; ClearTimer(0);
       } else if (SENSOR_1 > 36){//左折
           turn_left; ClearTimer(0);
       } else if (SENSOR_1 > 33){//左旋回
           hidarisenkai;//タイマをリセットしない
       }
   }
   Off(OUT_AC);

}

sub hidari1() {

   sound1;
   go_forward;
   Wait(20);
   hidarisenkai;
   Wait(40);
   turn_left;
   Wait(30);

}

sub hidari2() {

   sound2;
   go_forward;
   Wait(20);
   hidarisenkai;
   Wait(40);
   turn_left;
   Wait(30);

}

タスクメイン task main() {

   SetSensor(SENSOR_1, SENSOR_LIGHT);
   power(4);//モーターの出力を調整。課題兇了は0であったが、0の場合では出力が足りなかったので、前回の課題のときよりも出力を高めた。
   ClearMessage();
   GO(100);//スタート枠から前進
   trace2();//A-F区間
   hidari1();//Fを左折
   trace2();//F-Q区間
   hidari2();//Qを左方向
   trace2();//Q-R区間
   hidari1();//Rを左折し、Tに向かう
   trace2();//R-T
   GO(200);//前進してゴールの中に入る
   SendMessage(SIGNALGRAB);//ゴールの位置に到着したことを知らせる。アーム側はこれを受け取ったらアームを動かして缶がゴールの領域に入るようにする
   while(true){
       until (Message() == SIGNALBACK);//SIGNALBACKを受信するまで待つ
       back(300);//後退する
   }

}

アームのプログラム †

定義部分

#define grab OnFwd(OUT_C); Wait(100); Off(OUT_C);//アームで缶をつかむ
#define relese OnRev(OUT_C); Wait(100); Off(OUT_C);//アームで缶を離す
#define rift_up OnFwd(OUT_A); Wait(700); Off(OUT_A);//リフトを持ち上げる
#define rift_down1 OnRev(OUT_A); Wait(200); Off(OUT_A);//リフトを次の缶の高さまで下げる 
#define rift_down2 OnRev(OUT_A); Wait(300); Off(OUT_A);//リフトを次の缶のつかむ高さまで下げる。つまりはじめの高さまで下げる
#define SIGNALGRAB 100
#define SIGNALBACK 200
#define grab2(s) OnFwd(OUT_C); Wait(s); Off(OUT_C);//缶を掴む時間変更可能
#define relese(t) OnRev(OUT_C); Wait(t); Off(OUT_C);//缶を離す時間変更可能

タスクメイン task main() {

   SetSensor(SENSOR_1,SENSOR_TOUCH);//センサー1にタッチセンサ
   ClearMessage();
   int count;//変数を定義
   count=0;
   while (count<1){//countが1未満の時ループに入る
       ClearMessage();//Messageの値を0に初期化
       if (Message() == SIGNALGRAB){//SIGNALGRABを受信したらcountに1が足される。受信したらループを抜け出す。
           count++;
       } else count = 0;//そうでなければcountは0
       
   }
   grab2(50);//缶をゴール内にまとめるためにアームを動かす
   relese(70);//大きめにアームを開いて缶を完全に離す
   SendMessage(SIGNALBACK);//後退するように伝える。

まとめ

今回の課題はとても難しかった。ロボットを作るのにかなりの時間を費やしてしまい、プログラミングを考える時間が余りとれなかった。結果、本番では思い通りの動きができなかった。残念だったが楽しんで取り組めたので良かった。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-14 (月) 21:40:56 (740d)