2018a/Member 目次

課題

缶を指定された場所に運ぶロボットを作り、プログラミングする。 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMission3&openfile=2018a-mission3.png

フィールド

ルール

ロボット

全体

ロボ3.1.jpg

下の缶

ロボ3.2.jpg

真ん中の缶

ロボ3.4.jpg

上の缶

ロボ3.3.jpg

プログラム

下のRCX

#define LOWPOWER 1
#define HIGHPOWER 6
#define B 39    //黒
#define W 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 catch_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 CATCH_UE 11   //上の缶を掴ませる
#define STAY 12     //止まらせる
#define RELEASE 13   //上の缶を放させる
#define GO_TRACE 14&  //トレースに戻る
#define PUSH 15   //真ん中の缶を落とさせる
#define 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 <= B && blackN == 1){//T字路判断
   stay;
blackN++;
}
  stay;Wait(30);   //一時停止
}
catch_sita;Wait(60);Off(OUT_B);  //下の缶を掴む
SendMessage(CATCH_UE);Wait(800); //上の缶を掴む命令を出す
while(Message() == GO_TRACE) 
{SendMessage(STAY);
 stay;Wait(50);
 OnFwd(OUT_AC);Wait(300);stay;
 ClearMessage();
 }
}

上のRCX

#define LOWPOWER 2
#define catch_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 CATCH_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()==CATCH_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); //トレース再開
}

まとめ

結果

反省点

感想


添付ファイル: fileロボ3.5.jpg 136件 [詳細] fileロボ3.4.jpg 103件 [詳細] fileロボ3.3.jpg 146件 [詳細] fileロボ3.2.jpg 117件 [詳細] fileロボ3.1.jpg 124件 [詳細]

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