各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する); 1.空き缶をコース上に戻して再びコースに戻って進む; 2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む; 3.奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む; ただし、;
•速さと正確さを追求すること •コースを1周したら自動的に止まること •交差点では一時停止すること
A5右と同じコースです。 とくにこのコースの下の複雑なカーブのところはロボットセンサーの位置とプログラミングの工夫がかなり必要なところでした。
まずはじめに取り掛かったのが缶があった時に正確に掴み移動させることのできるアームです。四つの歯車を使い、どの歯車も二カ所づつ他の歯車と接することにより一つモーターで開閉ができるようにしました。
つぎに缶が当たったときにそれを感知するタッチセンサーの作成です。 ここはNQCの本に載っている形を再現しました。
光センサーはタッチセンサーの隙間を有効活用しラインをまたぐように二カ所取り付けました。 また二カ所につけることによって一カ所に取り付けるよりも交差点でのセンサーの認識を容易にし後のプログラミングを楽にしてくれました。
しかし、上の図の赤で囲った部分が複雑なカーブであったためセンサーとタイヤがかみ合わず何回もコースから外れてしまいました。
そこで上の図のように光センサーの間をどちらも1ブロックずつ離すことによってセンサーの感知に余裕が生まれうまく曲がることができるようになりました。 また曲がるときにカチカチとぎこちない曲がり方をさせないために「YUのプログラミング」の中に曲がったあと、’float’を一瞬取り入れることによってスムーズに曲がることが可能になりました。
ロボットの動力部分を上から写した写真です。 導線を引きずったり本体と接続させたときに邪魔にならないよう余分な導線は動力部の中で処理しました。
本番のように缶を置いて缶の移動をさせようとしたところうまくいきませんでした。
問題点 1,タッチセンサーが缶に当たる前に移動させるアームが当たってしまっていた。
2,タッチセンサーに力を伝える棒が軽すぎてしっかりとセンサーを押しきれていなかった。
3,プログラミングの中でタッチセンサーが’else If’になっていたため光センサーの’If’プログラミングが優先になり反応が鈍っていた。
改善 1,タッチセンサーの黄色い棒の前にさらに黒い棒を付けたし 缶に当たりやすくし、重量も大きくしました。
2,タッチセンサーの’else If’を’If’に変えました。
これが問題点をクリアした機体です。
プログラムの構成
1、カーブに差し掛かった時片方の光センサーが黒い線に乗ったことを感知して感知した側の方向に回転する。
2、光センサーが両方とも黒い線を感知した時は三秒間停止
3、タッチセンサーが缶に当たった時はアームのモーターを動かし缶を掴む。機体を180度回転させ缶を離す。
4、一周したら機体を停止させるようにするためタイマーを用いて一周する時間をあらかじめ計っておき入力する。
改良1
1、光センサーが黒い線に乗ったことを感知して感知した側の方向に回転するときただ両方のタイヤを逆回転にさせるだけではカクカクぎこちなく曲がるのを防ぐためFloatを曲がる前に入力。
2、三秒間停止させるだけでなく感知したことを確認するためピロピロという音を発音させる。
3、機体が大きいため元缶があった場所から離れてしまい線外に出てしまうのを防ぐため機体を少しバックさせてから缶を離す。
4、タイマーを使うと電池の残量によって少しづつずれてきて正確とはいえない。 そこでintをもちいて三回目に缶に当たった時にwhileをbreakし機体を停止させる。
改良2
1、完了 2、完了
3、缶を掴んだときにアームのモーターをOffにさせてしまうと缶の重みにアームが負けて缶が途中で外れてしまうのを防ぐため、あえてアームのモータをoffにしない。
4、完了
改良3
1,2,4、完了
3、缶を掴んで回転するときと缶がないままで回転するときでは回転速度が異なるため掴んで回転するときと離してから回転するときで回転時間をかえる。
前記のプログラムの改良をふまえて完成したプログラム
define white 40 //光センサーの値。これ以下は黒、これ以上は白とする。
task main(){
SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー:左 SetSensor(SENSOR_3, SENSOR_LIGHT); //光センサー:右 int t = 0; //3回目に缶に当たった時に停止する。
一回目と二回目に缶に当たった時はwhile内の動作を繰り返す。
while(t<=2){
if(SENSOR_2==1){ t=t+1; OnRev(OUT_A+OUT_C);Wait(35); Off(OUT_A+OUT_C); OnFwd(OUT_B);Wait(15);//缶をつかむ Off(OUT_B); OnRev(OUT_A);OnFwd(OUT_C);Wait(170);//180度回転 Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C);Wait(50); Off(OUT_A+OUT_C); OnRev(OUT_B);Wait(20);//缶をはなす Off(OUT_B); OnFwd(OUT_A+OUT_C);Wait(40); Off(OUT_B); OnRev(OUT_C);OnFwd(OUT_A);Wait(150);//元の位置に戻る Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);Wait(15); Off(OUT_A+OUT_C); }
交差点の通行
if((SENSOR_1 < white) && (SENSOR_3 < white)){ Float(OUT_A+OUT_C);Wait(15); Off(OUT_A+OUT_C);Wait(50); //一度止まる。 PlaySound(SOUND_UP) ; PlaySound(SOUND_UP);Wait(80);// ピロピロと高い音で二回合図をする。 OnRev(OUT_A+OUT_C);Wait(15);//少し前に移動させることにより次の動作をスムーズに }
黒い線上を直進
else if((SENSOR_1 > white) && (SENSOR_3 > white)){ OnRev(OUT_A+OUT_C); }
コースから右にそれた時の処置(左に行きます)
else if(SENSOR_1 < white){ Float(OUT_A+OUT_C); //このFloatにより滑らかに曲がることができるので重要。 OnRev(OUT_C); OnFwd(OUT_A); }
コースから左にそれた時の処置(右に行きます)
else if(SENSOR_3 < white){ Float(OUT_A+OUT_C); //このFloat上のと同様。 OnRev(OUT_A); OnFwd(OUT_C); } }
三回目缶に当たった時機体停止
Off(OUT_A+OUT_C);
}
#define SENSOR 40 //光センサーの値 int i; //変数iを定義 int t; //変数tを定義
task main (){
i=0; t=0; setSensor(SENSOR_1,SENSOR_LIGHT);//センサー1光センサー setSensor(SENSOR_2,SENSOR_TOUCH);//センサー2タッチセンサー setSensor(SENSOR_3,SENSOR_LIGHT);//センサー3光センサー
両センサーが白上を通り感に当たった時
while(t<6){ if(SENSOR_2==1){ //タッチセンサー作動 if(SENSOR_1>LINE){ //センサー1白 if(SENSOR_3>LINE){ //センサー3白 OnRev(OUT_B);挟む Wait(15); OnRev(OUT_A+OUT_C);//直進する }
センサー3が黒の時左折
else{ OnRev(OUT_A);OnFwd(OUT_C); }
センサー1が黒、センサー3が白で右折
if(SENSOR_1<LINE){ if(SENSOR_3>LINE){ OnRev(OUT_C);OnFwd(OUT_A); }
交差点の通行
else{ //センサー3黒 i++; //交差点と認識i=i+1 if(t=0){ //t=0 OnRev(OUT_A+OUT_C); Wait(30); //線を越える t++; //t=t+1 }
缶をどける
else{ //iが0でないとき障害物をどけてから元に戻す OnRev(OUT_A+OUT_C); //直進する Wait(100); OnRev(OUT_A);OnFwd(OUT_C); //反転する Wait(120); OnRev(OUT_B); //放す Wait(15); OnFwd(OUT_A+OUT_C); //後退する Wait(120); OnRev(OUT_A);OnFwd(OUT_C); //反転する Wait(120); t=0; //t=0を代入 } else{ //タッチセンサーが作動しないとき if(SENSOR_1>LINE){ //センサー1白 if(SENSOR_3>LINE){ //センサー3白 OnRev(OUT_A+OUT_C); //直進する } else{ //センサー3黒 OnRev(OUT_A);OnFwd(OUT_C); //左折する } if(SENSOR_1<LINE){ //センサー1黒 if(SENSOR_3>LINE){ //センサー3白 OnRev(OUT_C);OnFwd(OUT_A); //右折する } else{ //センサー1,3黒 i++; OnRev(OUT_A+OUT_C); //直進する Wait(30); } Float(OUT_A+OUT_C); //停止する
・YU ・複雑にカーブしているところをスムーズに走らせたところ。 ・交差点での一時停止。 ・缶を正確にラインの上に移動させたところ。 他のくわしいことは上の画像とともに解説しておきました。
・UME ラインとレースはよくできたと思うが、プログラムが長くなったのでもっとシンプルなものにできれば良かった。また、ロボットのアームが長すぎカーブのすぐに空き缶がある場合うまく挟めなかったんで、次はプログラムをしっかり考えたい。
・YU 課題一に比べてプログラミングにかなり苦労することが多かったです。 今回は先生の前での発表も完ぺきにできて満足できました。
・UME ハサミの機能を有効に使うのが難しく苦悩しました。しかし難しいことに挑戦し頑張れたのでいい勉強になりました。
分かりやすく書かれています。工夫点などをさらに充実させてみてください。コメント欄もお願います(TAKA)
ポイントはおさえています。あとは、工夫した点などを全体的に充実させてください。また、プログラムはindent、空行を使ったほうが見やすく、後から改良を加えやすいと思います。(FI)