[[ロボティクス入門ゼミ]]

[[2006a/MemberOnly/進行状況C]]

[[2006a/C5/ロボコン]]

[[2006a/C5/ロボコン/本体編]]

[[2006a/C5/ロボコン/プログラム編]]

[[2006a/C5/ロボコン/プログラム編/右]]

[[2006a/C5/ロボコン/プログラム編/左]]

**プログラム [#pcb9e600]
このプログラムはロボコンが終了した後にロボコンでの動きの問題点を想像で(実際に動かしたりなどの試しなしに)製作したものです。


 #define arm_up OnFwd(OUT_B);Wait(80);  //腕を上げる
 #define arm_down OnRev(OUT_B);Wait(80); //腕を下ろす
 #define R_turn_90 OnFwd(OUT_C);OnRev(OUT_A);Wait(85);  //右に90°旋回
 #define L_turn_90 OnRev(OUT_C);OnFwd(OUT_A);Wait(85); //左に90°旋回
 #define R_turn_180 OnFwd(OUT_A);OnRev(OUT_C);Wait(170); //180°回転
 #define light until((SENSOR_2<40)&&(SENSOR_3<40));  //光センサーが黒線を感知するまで
 #define touch until(SENSOR_1==1);  //缶に触れるまで
 #define go OnFwd(OUT_A+OUT_C);  //直進
 #define back OnRev(OUT_A+OUT_C);  //後退
 #define go_line  go light line_number=line_number+1;  //線を1本感知するまで直進
 #define back_line  back light line_number=line_number+1; //線につくまで後退
 #define message ClearMessage();while(Message() !=0  {SendMessage(1);Wait(50);} until(Message() !=0);  //メッセージを送信、受信
 
 int line_number;  //線の本数を変数とします 
 sub GO()    //上同様何度も使うのでサブルーチンにしました
 {
 go
 Wait(50);   //少しだけ直進、1本目の線を過ぎる
 Off(OUT_A+OUT_C);
 Wait(1);
 go
 light   //2本目の線に達したら
 R_turn_90 //右に90°回転
 go_line  
 go  
 Wait(10);
 go_line //直進し2本線を過ぎるまで進み続ける
 }
 
 sub BACK() //行き同様サブルーチンにしました(ほとんど行きと同じ全身が後退になっただけ)
 sub BACK() //以前のものと変えたのはここだけです。帰りに場所の不足で曲がりきれなかったためにそれを補うように一応プログラムしました。
 { 
 OnRev(OUT_C);OnFwd(OUT_A);Wait(42);
 OnRev(OUT_C);OnFwd(OUT_A);Wait(42);  //缶をつかんだ状態でのはじめに約45°旋回
 back
 until((SENSOR_2<40)
 OnRev(OUT_C);OnFwd(OUT_A);Wait(42);
 back_line
 
 until((SENSOR_2<40)  //センサー2のみが黒線の上に来るまで後退
 OnRev(OUT_A);Wait(42);  //機体をはじめのと垂直になるようにそろえる
 L_turn_90  //左に90°旋回する
 back_line  //1本目の黒線まで後退
 back
 Wait(10);
 back_line  //2本目の黒線まで後退
 }
 
 task main()
 {
 SetSensor(SENSOR_1,SENSOR_TOUCH); //センサー1をタッチセンサーとします
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー2,3を光センサーとします
 
 line_number=0;
 GO();
 until(line_number==2);  //線が2本になったら
 R_turn_90  //右に90°旋回
 go
 touch //缶に触れるまで直進
 arm_down //腕を下ろす
 
 BACK();
 L_turn_90 //受け渡し場所の前まできたら90°左旋回
 back //後退(前進)する
 Wait(50);
 
 message //メッセージの作業が済んだら
 go //少し下がって
 Wait(50);
 R_turn_180 //180°回転
 arm_up
 go
 Wait(50); //腕を上げ、缶を渡す
 back
 Wait(50);  //少し下がり
 R_turn_180 //180°回転
 
 GO();
 until(line_number==6); //1回目と同じ動作
 OnRev(OUT_C);
 Wait(85); //少し小さめに右寄りに回転
 go
 touch
 arm_down
 
 BACK();
 L_turn_90
 back Wait(50);
 
 message
 go
 Wait(50);
 R_turn_180
 arm_up
 go
 Wait(50);
 back
 Wait(50);
 R_turn_180   //1回目と同じ
 
 GO();
 until(line_number==10); //1回目、2回目と同じ
 OnFwd(OUT_A);Wait(85); //今度は少し大きめに左よりに回転
 go
 touch
 arm_down
 
 BACK();
 L_turn_90
 back
 Wait(50);
 
 message
 go
 Wait(50);
 R_turn_180
 arm_down
 go
 Wait(50);  //1,2回目と同じ
 }

**課題と反省 [#fb00614b]
先にも書いておきましたが、このプログラムは試運転も何もなく、調整なしのためこれでしっかりと動けるかどうか分かりません。しかし、ロボコンで失敗した点はこの考え方で改善できていると思います。出来ればここまでのプログラムをロボコン前までに完成させて、更に試運転し調整も完全な状態でロボコンに出したかったです。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS