今回の課題は、課題2で使用したマップに缶を置きそれを移動させること。
フィールドは課題2で使用した紙を使用する。
2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。
空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。
私たちはNXTを使用していてロボットに付けるアームを上下させることができなかったのでとりあえずは一点を取る事を目標に課題に取り掛かった。
自分達はロボットを二つ作り、それぞれを別の動きをさせることにした。
一つをmasterとし、もう一つをslaveとした。
缶を運ばなければいけないのでアームを取り付け、超音波センサーを取り付ける事で缶まで最短距離で缶を取りに行く事を可能にした。
私たちは、三つの缶のうち真ん中の缶をアームでつかみ、一番したの缶を機体で推して行こうと考えた。
アームにタイヤを取り付けることにより缶をつかみやすくするだけでなく、滑り止めの役割をはたすことができた。
缶の位置を機体で見つけてもらうために超音波センサーを取り付けた。
機体の真ん中に取り付ける事により、缶を見つけたあとまっすぐ進むだけでよくなった。
実は一番の下の缶を運びやすくするために角をつけたが、それに超音波センサーが反応してしまいうまくいかない事があったので角を外したのはここだけの話。
私たちはをボットを二つに分けたのでslaveとmasterでコースは異なる。
masterは少し進んだ後、缶を探し始め見つけたら缶を取りに行き、salveとコースが異なるように進む
slaveはmasterが缶を掴んだのを確認したら、缶を探して進んで缶を掴みmasterと異なるルートを進む
缶を見つけに行く時に超音波センサーを使用しなければならないが、私たちは機体が障害物を探し始めて機体の40cm以内に障害物を感知したら進むというプログラミングを用いた。
task main () { while(SensorUS(S4)>40) //測った距離が40cm以上の間 { OnFwd(OUT_C,25); OnRev(OUT_B,25); until(SensorUS(S4)<40);//40cm以下まで旋回 if(SensorUS(S4)<40) //40cm以下になったとき { PlaySound (SOUND_CLICK); Wait(50); OnFwd(OUT_C,25); OnRev(OUT_B,25); Wait(150); //缶に対面するように角度調整 OnFwd(OUT_C,30); OnFwd(OUT_B,34); until(SensorUS(S4)<8);//缶との距離が8cmになるまで前進 Off(OUT_BC); Wait(300); OnFwd(OUT_C,30); OnFwd(OUT_B,34); Wait(300); Off(OUT_BC); OnRev(OUT_A,30); //缶を掴む Wait(400); Off(OUT_A); } } }
masterが最初に動き始めて缶を認識して缶をつかむ。
その後に少し動いた後、slaveが缶を探し始め缶を掴みに行く。
二つの機体が缶を掴み終わったらそれぞれその目的地まで運びに行きプログラミングを終了させる。
これがマスターのプログラミングである
#define CONN 1 task main () { OnFwd(OUT_C,70); OnFwd(OUT_B,72); Wait(1700); //対角線上になるまで移動する Off(OUT_BC); OnFwd(OUT_A,30); Wait(400); Off(OUT_A); SetSensorLowspeed(S4); //缶を探す while(SensorUS(S4)>40) { OnFwd(OUT_C,25); OnRev(OUT_B,25); until(SensorUS(S4)<40); If(SensorUS(S4)<40) //缶を発見 { PlaySound (SOUND_CLICK); Wait(50); OnFwd(OUT_C,25); OnRev(OUT_B,25); Wait(150); OnFwd(OUT_C,30); OnFwd(OUT_B,34); until(SensorUS(S4)<8);//缶との距離が8cm以下になるまで前進 Off(OUT_BC); Wait(300); OnFwd(OUT_C,30); OnFwd(OUT_B,34); Wait(300); Off(OUT_BC); OnRev(OUT_A,30); //缶を掴む Wait(400); Off(OUT_A); } OnFwd(OUT_B,25); OnFwd(OUT_C,25); Wait(1800); //少し進む until ( BluetoothStatus(CONN) == NO_ERR ); RemoteStartProgram(1, "slave.rxe"); Off(OUT_BC); Wait(9000); //slaveが缶をつかむのを待つ OnFwd(OUT_B,60); OnFwd(OUT_C,25); Wait(3600); //缶を置く場所まで移動する Off(OUT_BC); OnRev(OUT_B,25); OnRev(OUT_C,25); Wait(3600); //誤作動防止と、得点が下がる缶を外に出すため下がる OnFwd(OUT_B,30); OnRev(OUT_C,30); Wait(800); //誤作動防止と、得点が下がる缶を外に出すため旋回する Off(OUT_BC); } OnFwd(OUT_A,30); //得点が下がる缶を円の外に出す Wait(400); Off(OUT_A); }
salveのプログラムは以下の通りである
task main () { SetSensorLowspeed(S4); while(SensorUS(S4)>40)//缶を探す { OnFwd(OUT_B,25); OnRev(OUT_C,25); until(SensorUS(S4)<40); if(SensorUS(S4)<40)//缶を発見したとき { PlaySound (SOUND_CLICK); Wait(50); Off(OUT_BC); Wait(200); OnRev(OUT_C,25); OnFwd(OUT_B,25); Wait(150); //缶と対面するように角度調整 Off(OUT_BC); Wait(200); OnFwd(OUT_C,20); OnFwd(OUT_B,22); until(SensorUS(S4)<8);//缶との距離が8cm以下になるまで前進 Off(OUT_BC); Wait(300); OnFwd(OUT_C,30); OnFwd(OUT_B,34); Wait(300); //缶との距離をさらに近づけ、つかみやすくするために前進する Off(OUT_BC); OnRev(OUT_A,17); //缶を掴む Wait(800); Off(OUT_A); } OnFwd(OUT_C,35); OnFwd(OUT_B,25); Wait(2800); //緩やかに曲がり、楕円軌道を描きやすくする Off(OUT_BC); Wait(10); OnFwd(OUT_C,25); OnFwd(OUT_B,50); Wait(2000); //円上に缶を運ぶ Off(OUT_BC); OnRev(OUT_A,17); //もう一度缶をしっかり掴む Wait(800); Off(OUT_A); OnRev(OUT_C,25); OnRev(OUT_B,25); Wait(800); //2段目の缶を持ち帰り、得点を狙うための後退 Off(OUT_BC); OnFwd(OUT_B,40); OnRev(OUT_C,40); Wait(1000); //缶を持ち帰る OnFwd(OUT_C,25); OnFwd(OUT_B,50); Wait(1500); //持ち帰った缶を円上まで運ぶ Off(OUT_BC); OnFwd(OUT_A,17); //缶をはなす Wait(800); Off(OUT_A); } }
自分達の結果は2点だった。もともと自分達は一点を目標にしていたので目標は達成することができた。
しかし、本番で他の班を見ていてこんなにも簡単に点数が取れるのかと思った。
自分達はアームが他の機体のように上げ下げできないことで少し諦めていたのかもしれない。
今回の課題では自分は機体の方を担当したが、もっと点数にこだわればアイデアが浮かんだのかもしれないと思った。
今度はアームを上げ下げする事に挑戦してみたい
主にアームだが、どのようにしっかりと缶を掴むことができるかを考え、缶を掴む部分をなるべく缶の大きさに近づけて空間をなくし、タイヤを取り付けて落とさないようにした。
アームだかモーターとの噛み合わせが悪かったので輪ゴムを使い形を固定することでモーターの空回転を防ぐ事に成功した。
・アーム自体の上げ下げを諦めたこと
・先生も指摘された通り、機体の移動が速かったため精密性に欠ける