目次
詳しくは課題(2017a/Mission3)を参照。赤矢印で示したようなコースで走った。缶は二個拾うようにして、一個目を二個目の上に積み上げていくという方法で缶の積み上げを行った。
写真のようにロボット全体の構造として、正面から見るとシンメトリーになるように設計した。その方が走るときにバランスを崩すことが少ないと考えたからである。
赤丸で示したところは積み上げた缶が倒れるのを防ぐための棒である。青丸で示したモーターが回ることで歯車が回り缶をつかむアーム部分が動くという仕組みである。
アーム全体というのは写真の緑で囲んだ部分のことを言う。赤丸で示した缶をつかむアーム部分が重くなりすぎてしまい、モーターが回転していない状態だと赤丸で示したところが地面についてしまう。そこで、青丸で示してあるところのように後ろも重くすることでバランスをとった。なお、青丸で示したところのタイヤと後ろのモーターはおもりである。青丸の中の前に取り付けたモーターが回り歯車と連動することでアーム全体が上下するような設計にした。
アーム全体が上がっているときに超音波センサーが反応すればよいので写真のような位置にとりつけた。超音波センサーは縦に取り付けた方が感度がよくなるらしいので、縦に取り付けた。光センサーは正確にライントレースできるようにしっかりと地面に近づけて設置した。
缶をつかむアーム部分が正確に缶のところに来るように赤丸で示したようなレールをつけた。このレールがあることにより、ロボットに近づいて来た缶はちょうどこの二本のレールの間に入り、ピンポイントでアームが缶をつかむことができるのだ。
私達の班ではマスターとスレイブを通信させて缶をつかむロボットを製作した。マスターのほうでライントレースや超音波センサーなどの移動のほうを担当して、スレイブのほうで缶をつかむ動作を担当した。ライントレースは課題2で使用したプログラムを使った。缶を見つけるのには超音波センサーを使用した。
まず、今回のプログラムの中で使う頻度の高そうなものを定義した。
#define THRESHOLD 50 //しきい値を50に設定 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED, SPEED); //前に進む #define go_back OnRL(-SPEED,-SPEED); //後ろにさがる #define turn_left1 OnRL(SPEED, -SPEED); //左旋回 #define turn_left0 OnRL(SPEED, 0); //左折 #define turn_right0 OnRL(0, SPEED); //右折 #define turn_right1 OnRL(-SPEED, SPEED); //右旋回 #define SPEED 45
ファイル名「sss1.nxc」 これは缶をつかんで上げるプログラムだ。 Cがアーム全体を動かすモーターであり、Bが缶をつかむアーム部分を動かすモーターである。一段目を作るときには二段階で下げる必要はないのだが、二段目を作るときに二段階で下げなければいけないのでこのようなプログラムになっている。
task main() { RotateMotor(OUT_C,-30,30); //アーム全体が下がる RotateMotor(OUT_B,30,30); //缶をつかむアーム部分が開く 二段目を積むときここで缶を離す RotateMotor(OUT_C,-30,150); //アーム全体が下がる Wait(2000); OnFwd(OUT_B,-30); //缶をつかむ Wait(3000); Off(OUT_B); RotateMotor(OUT_C,50,180); //缶を上げる }
ファイル名「sss2.nxc」 これは缶を置くプログラムだ。
task main() { RotateMotor(OUT_C,-30,180); //缶を離す RotateMotor(OUT_B,30,90); //アーム全体が上がる }
task main() { SetSensorLight(S3); SetSensorLowspeed(S1); until(BluetoothStatus(1)==NO_ERR); int nKan=0; //nKanとはつかんだ缶の個数 while (nKan < 2) { //つかんだ缶の個数が二個より少ないとき while(SensorUS(S1)>15){ //センサーと缶との間の距離が15センチ以上の時にはライントレースする if (SENSOR_3 < THRESHOLD-10) { turn_left1; } else { if (SENSOR_3 < THRESHOLD-5) { turn_left0; } else if (SENSOR_3 < THRESHOLD+5) { go_forward; } else if (SENSOR_3 < THRESHOLD+10) { turn_right0; } else { turn_right1; } } Wait(1); } until(SensorUS(S1)<=12){ //センサーと缶との間の距離が12センチ以下になるまで直進 go_forward; } if (SensorUS(S1)<=12){ //センサーと缶との間の距離が12センチ以下のとき Off(OUT_BC); RemoteStartProgram(1,"sss1.rxe"); //先ほど説明した缶をつかんであげるプログラム Wait(2000); RotateMotorEx(OUT_BC,45,100,0,true,true); //BとCを45のスピードで100度回転 Wait(6000); nKan++; //プログラムを終了させるためのもの } } while(nKan<3){ //つかんだ缶が三個より少ないとき RotateMotor(OUT_B,-SPEED,200); go_forward; //ここでライントレースをやめ、缶を持ったまま直進してゴール地点に向かう Wait(2500); Off(OUT_BC); RemoteStartProgram(1,"sss2.rxe"); //先ほど説明した缶を置くプログラム Wait(5000); go_back; //缶から離れる Wait(3000); Off(OUT_BC); nKan++; //プログラムを終了させるためのもの } }
結果は予定通り二段積むことができた。たまたま交差点Tにある缶にぶつかったため予定より3点高い12点という結果になった。総合的な点数では3位に入賞することができたので良かったと思う。
今回はロボットの設計という点で一番苦労したと感じる。特に、アーム全体が傾かないようにバランスをとるという点で苦労した。結果的に後ろにたくさんのおもりをつけることでバランスをとった。こだわったのはコックピットのところで、おもりという点ではほとんど意味をなさないが、男の夢を乗せた。
正直、前期で一番大変だったのは必須の授業よりもこの授業だった。ただ全く後悔していない。その理由は、私は将来ロボットエンジニアになりたいと考えているからだ。この授業ではロボット制御の基礎を学ぶことができた。ロボットの製作に携わる楽しさを知ることができた。これ以上に私にとっていい経験は他の授業には無かった。この授業で学んだ様々な大切なことを将来活かしていきたいと思う。