- 追加された行はこの色です。
- 削除された行はこの色です。
[[2010a]]
#contents
*課題 [#z2fc69ef]
各チームで作成したコースを1周するロボットを製作せよ。交差点以外のコース上に350mlの空の空き缶を2個以上おき、空き缶にぶつかった時には次のような動作するプログラムを作成せよ。(他のメンバーと重ならないように一人一つのプログラムを作成する);
1.空き缶をコース上に戻して再びコースに戻って進む;
2.空き缶を次の交差点まで運んで行き、その交差点に空き缶を残してさらにコースに沿って進む;
3.奇数回目に空き缶に遭遇したら、その場で反転して進み、偶数回目に遭遇したら、空き缶を押しのけて進む;
ただし、;
•速さと正確さを追求すること
•コースを1周したら自動的に止まること
•交差点では一時停止すること
**コース [#pf434381]
&ref(P1010033.JPG);
A5右と同じコースです。
とくにこのコースの下の複雑なカーブのところはロボットセンサーの位置とプログラミングの工夫がかなり必要なところでした。
**ロボット [#r204181d]
&ref(P1010032.JPG);
まずはじめに取り掛かったのが缶があった時に正確に掴み移動させることのできるアームです。四つの歯車を使い、どの歯車も二カ所づつ他の歯車と接することにより一つモーターで開閉ができるようにしました。
&ref(P1010030.JPG);
つぎに缶が当たったときにそれを感知するタッチセンサーの作成です。
ここはNQCの本に載っている形を再現しました。
&ref(P1010038.JPG);
光センサーはタッチセンサーの隙間を有効活用しラインをまたぐように二カ所取り付けました。
また二カ所につけることによって一カ所に取り付けるよりも交差点でのセンサーの認識を容易にし後のプログラミングを楽にしてくれました。
&ref(P1010021.jpg);
しかし、上の図の赤で囲った部分が複雑なカーブであったためセンサーとタイヤがかみ合わず何回もコースから外れてしまいました。
&ref(P1010024.JPG);
そこで上の図のように光センサーの間をどちらも1ブロックずつ離すことによってセンサーの感知に余裕が生まれうまく曲がることができるようになりました。
また曲がるときにカチカチとぎこちない曲がり方をさせないために「YUのプログラミング」の中に曲がったあと、’float’を一瞬取り入れることによってスムーズに曲がることが可能になりました。
&ref(P1010031.JPG);
ロボットの動力部分を上から写した写真です。
導線を引きずったり本体と接続させたときに邪魔にならないよう余分な導線は動力部の中で処理しました。
&ref(P1010034.JPG);
本番のように缶を置いて缶の移動をさせようとしたところうまくいきませんでした。
問題点
1,タッチセンサーが缶に当たる前に移動させるアームが当たってしまっていた。
2,タッチセンサーに力を伝える棒が軽すぎてしっかりとセンサーを押しきれていなかった。
3,プログラミングの中でタッチセンサーが’else If’になっていたため光センサーの’If’プログラミングが優先になり反応が鈍っていた。
改善
1,タッチセンサーの黄色い棒の前にさらに黒い棒を付けたし
缶に当たりやすくし、重量も大きくしました。
2,タッチセンサーの’else If’を’If’に変えました。
&ref(P1010036.JPG);
これが問題点をクリアした機体です。
**YUのプログラム [#gd295df8]
define white 40 //光センサーの値。
//これ以下は黒、これ以上は白とする。
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT); //光センサー:左
SetSensor(SENSOR_3, SENSOR_LIGHT); //光センサー:右
int t = 0; //3回目に缶に当たった時に停止する。
while(t<=2){
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(170);//元の位置に戻る
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);
}
**UMEのプログラム [#ka967300]
#define SENSOR 40 //光センサーの値
int i; //変数iを定義
int t; //変数tを定義
task main ()
{
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);//直進する
}
else{ //センサー3が黒
OnRev(OUT_A);OnFwd(OUT_C); //左折
センサー3が黒の時左折
else{
OnRev(OUT_A);OnFwd(OUT_C);
}
if(SENSOR_1<LINE){ //センサー1が黒
if(SENSOR_3>LINE){ //センサー3が白
OnRev(OUT_C);OnFwd(OUT_A); //右折
センサー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); //停止する
**問題点、工夫した所 [#o890a03f]
・YU ・複雑にカーブしているところをスムーズに走らせたところ。
・交差点での一時停止。
・缶を正確にラインの上に移動させたところ。
他のくわしいことは上の画像とともに解説しておきました。
・UME ラインとレースはよくできたと思うが、プログラムが長くなったのでもっとシンプルなものにできれば良かった。また、ロボットのアームが長すぎカーブのすぐに空き缶がある場合うまく挟めなかったんで、次はプログラムをしっかり考えたい。
***感想 [#ee38cb6d]
・YU 課題一に比べてプログラミングにかなり苦労することが多かったです。
・UME ハサミの機能を有効に使うのが難しく苦悩しました。しかし難しいことに挑戦し頑張れたのでいい勉強になりました。
***コメントをどうぞ [#o5783f2f]
分かりやすく書かれています。工夫点などをさらに充実させてみてください。コメント欄もお願います(TAKA)
ポイントはおさえています。あとは、工夫した点などを全体的に充実させてください。また、プログラムはindent、空行を使ったほうが見やすく、後から改良を加えやすいと思います。(FI)