目次 #contents *課題3 ロボコン [#wade5c2b] **目的 [#d0f69384] 自分たちで作ったロボットで空き缶を運び中身の入っている缶の上に積み上げる。 ~人間がやれば安易にできる作業だがボタン1つで勝手にやってくれるロボットを使ってやることによって達成感を得る。 **ルール [#sa416954] #ref(ロボ image.png) -フィールドは上の図のようになっていて、左側にある空き缶を右側の中身が入っている缶の上に置く -ロボットは左下にあるスタート地点に置き、そこからスタートする -時間無制限だけれども明らかに走行不可の場合はその時点で終了 -ロボット所持者は競技のときは見守ることしかできない(ただし1回だけ再スタート可) ~他、採点方法等の詳しいルールは[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/?2012a%2F%A5%ED%A5%DC%A5%B3%A5%F3]] を参照してください。 *ロボット紹介 [#p337977f] 全体写真 #ref(20120727_183443.jpg) ~今回のロボットは非常に大きくそれに比例するように重たくなっているので、RCX本体をなるべく低い位置に置くことによって重心を下げ、稼働時の転倒を防止した。 ~アーム部分 その1 #ref(20120727_183502.jpg) ~赤丸の部分に缶を持ち上げる際に滑り落ちないように滑り止めとして黒いゴムを利用している。 ~アーム部分 その2 #ref(20120727_185015.jpg) ~空き缶がアーム圏内に入ったらロボットが認識できるように光センサーを利用した。 ~また、モーター1つでアームの開閉ができるように工夫した。 ~アーム部分 その3 #ref(20120727_185028.jpg) ~空き缶をアームでつかみ持ち上げたまま右側エリアに運ぶ仕様になっていて、中身の入っている缶の場所に来たことをロボットに把握させるため下にタッチセンサーが付いている。 ~そしてこのタッチセンサーによって缶がアームの真下にあるのを認識させる。 ~シャフト稼働部分 その1 #ref(20120727_183532.jpg) ~モーターによって上下に動きアームでつかんだ缶を上げたり下げたりすることができる。 ~シャフト稼働部分 その2 #ref(20120727_183955.jpg) ~後ろについている回転センサーにより、正確に上げたり下げたりすることができる。 ~ロボット下部 #ref(20120727_183640.jpg) ~下向きについている光センサーによってラインをトレースする。 **プログラム紹介 [#i903fb4e] *プログラム紹介 [#i903fb4e] ~タイヤを動かすプログラム #define THERSHOLD 30 #define go_st OnFwd(OUT_A); OnFwd(OUT_C); #define go_ri OnFwd(OUT_A); OnRev(OUT_C); #define go_le OnFwd(OUT_C); OnRev(OUT_A); #define go_ba OnRev(OUT_A); OnRev(OUT_C); #define BLACK 38 #define WHITE 38 #define SIGNALON1 11 // アーム動作開始を知らせるメッセージ緑 #define SIGNALON2 21 // アーム動作完了を知らせるメッセージ緑 #define SIGNALON3 31 // アーム動作開始を知らせるメッセージ黒 #define SIGNALON4 41 // アーム動作完了を知らせるメッセージ黒 #define ReMessage2 32 // SIGNALON3の返事 #define RUN_SECTION2 100 //第4セクションの時間 int cross; //黒線をまたぐ回数 sub count() { if ((SENSOR_1 < THERSHOLD) && (SENSOR_3 < THERSHOLD)) {go_st;cross = cross++;} else if(SENSOR_1>THERSHOLD && SENSOR_3<THERSHOLD){ //3だけ黒線の上 OnFwd(OUT_A); OnRev(OUT_C); }else if(SENSOR_1<THERSHOLD && SENSOR_3>THERSHOLD){ //1だけ黒線の上 OnFwd(OUT_C); OnRev(OUT_A); }else if(SENSOR_1>THERSHOLD && SENSOR_3>THERSHOLD){ //両方黒線の外 OnFwd(OUT_AC); }} task line_1st() //90度回転:(L,R)=(B,B) 右に旋回:(L,R)=(B,W) 左に旋回:(L,R)=(W,B) 後ろに直進:(L,R=(W,W) { if ((SENSOR_1 < BLACK) && (SENSOR_3 > WHITE)) { go_le; } else if ((SENSOR_1 > WHITE) && (SENSOR_3 < BLACK)) { go_ri; } else if ((SENSOR_1 < BLACK) && (SENSOR_3 < BLACK)) { go_ri; Wait(180); //90回転させる 回転センサーをつかったほうがいいかも Off(OUT_AC); stop line_1st; //このタスクを止める } else if ((SENSOR_1 > WHITE) && (SENSOR_3 > WHITE)) { go_ba; } } task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_2, SENSOR_TOUCH); SetSensor(SENSOR_3, SENSOR_LIGHT); SetPower(OUT_A,3); SetPower(OUT_C,3); ClearMessage(); ClearTimer(0); while(cross < 1){ count() }//最初の黒線を無視する while (Message() != SIGNALON1) { //真ん中が反応するまで左側の円の上を通る if ((SENSOR_1 < THERSHOLD) && (SENSOR_3 < THERSHOLD)) {go_st;cross = cross++;} if(SENSOR_1>THERSHOLD && SENSOR_3<THERSHOLD){ //3だけ黒線の上 OnFwd(OUT_A); OnRev(OUT_C); }else if(SENSOR_1<THERSHOLD && SENSOR_3>THERSHOLD){ //1だけ黒線の上 OnFwd(OUT_C); OnRev(OUT_A); }else if(SENSOR_1>THERSHOLD && SENSOR_3>THERSHOLD){ //両方黒線の外 OnFwd(OUT_AC); } } Off(OUT_AC); SetPower(OUT_A,3); SetPower(OUT_C,3); until (Message() = SIGNALON2); go_st; Wait(30); until ((SENSOR_1 < BLACK) || (SENSOR_3 < BLACK) || (FastTimer(0) <= RUN_SECTION2)); //センサーか時間で反応 go_le; Wait(180); go_st; until (SENSOR_2 == 1); //タッチのセンサーに缶が反応 Off(OUT_AC); PlaySound(SOUND_CLICK); SetPower(OUT_A,3); SetPower(OUT_C,3); while ( Message() != ReMessage2) { //メッセージを送り、缶を下ろさせる。 SendMessage(SIGNALON3); } if (Message() == ReMessage2) { PlaySound(SOUND_CLICK); // 送信に成功したときはピッと鳴らす } else { PlaySound(SOUND_LOW_BEEP); // 送信に失敗したときはブッと鳴らす } until (Message() = SIGNALON4); go_ba; Wait(50); Off(OUT_AC); } ~アームを動かすプログラム #define SIGNALON1 11 // アーム動作開始を知らせるメッセージ #define SIGNALON2 21 // アーム動作完了を知らせるメッセージ #define ReMessage1 12 // SIGNALON1の返事 #define SIGNALON3 31 // アーム動作開始を知らせるメッセージ黒 #define SIGNALON4 41 // アーム動作完了を知らせるメッセージ黒 #define ReMessage2 32 // SIGNALON3の返事 #define GREEN 51 // until (SENSOR_3 > GREEN); 普段と逆で行う int i; // for ループのための変数 int i_min=1,i_max=3; task main () { ClearMessage(); // Message()の値を0に初期化 SetSensor(SENSOR_1, SENSOR_LIGHT); SetSensor(SENSOR_3, SENSOR_ROTATION); SetPower(OUT_A,4); SetPower(OUT_B,7); for (i=i_min; i<=i_max; i++) { //3回繰り返す until (SENSOR_1 > GREEN && FastTimer()==200); PlaySound(SOUND_CLICK); SendMessage(SIGNALON1); // 缶を見つけたことを知らせる Wait(50); OnFwd(OUT_A); Wait(50); Off(OUT_A); // アームで掴む OnFwd(OUT_B); until (SENSOR_3 == -25); //回転センサーを使い一定まで上げさせる。 Off(OUT_B); // リフトであげる SendMessage(SIGNALON2); // 動作完了の合図 until (Message() == SIGNALON3); SendMessage(ReMessage2); //返事 SetPower(OUT_A,3); SetPower(OUT_B,4); OnRev(OUT_B); Wait(10); Float(OUT_B); Wait(30); //シャフトを缶まで下げる OnRev(OUT_A); Wait(50); Off(OUT_A); //アームを開く SetPower(OUT_B,7); OnRev(OUT_B); Wait(70); Float(OUT_B); //シャフトを一番したまで下げる SendMessage(SIGNALON4); } } *メンバー紹介 [#r4a5a1c0] ~&size(18){山田大介(環境機能工学科) ロボット担当代理兼総監督}; ~ロボットの前後バランスとかものすごく考えてました。えげつないほど考えてました。 ~ドライブベースしか作ってないとか聞こえない。ドライブベースって割と重要だと思います(念押し) ~&size(18){與五沢啓太(電気電子工学科) ロボットデザイン全稼働システム担当}; ~色々と工夫しながらロボットを仕上げてくれました!! やたらロボットを強固にしたがってたのが印象に残ってる。 ~かっくいいロボットをありがとう。 ~&size(18){小野寺朗(機械システム工学科) 頭脳派プログラム担当}; ~一生懸命プログラムを考えてくれてました!! 実際にロボットを使って試行錯誤しながら考えてくれて、その結果不動になりました。 ~でも、ちゃんと缶をつかんで持ち上げられたときの感動は大きかったはずです。 *感想 [#uf4fcf18] 今回は3人で誰も脱落すること無くできて、ロボコンはあまりよろしい結果を出すことができなかったけれどものすごく達成感はありました。反省点として、もっと3人でいろいろと作戦を練ってからプログラムをしたりロボットを作ったりしたほうがよかったと感じました。