- 追加された行はこの色です。
- 削除された行はこの色です。
[[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]
int a;
#define BORDER 40 // 閾値
int flag = 0;
task main ()
{
a=0;
SetSensor ( SENSOR_1, SENSOR_LIGHT );//光センサー
SetSensor ( SENSOR_2, SENSOR_TOUCH );//タッチセンサー
SetSensor ( SENSOR_3, SENSOR_LIGHT );//光センサー
Wait ( 100 );//センサーの反応待機
while ( flag < 3){
else{
if ((SENSOR_1>40)&&(SENSOR_3>40)){ //両センサーが白の場合
OnRev(OUT_A+OUT_C);//直進する
}
else {
if ((SENSOR_1<40)&&(SENSOR_3<40)){ //両センサが黒の場合
Off(OUT_A+OUT_C);//交差点の場合少し止まる
Wait(50);
OnRev(OUT_A+OUT_C);//進む
Wait(20);
}
else { //左センサーが黒の場合
OnRev(OUT_A);
Wait(5);
OnFwd(OUT_C);
Wait(5); //左に曲がる
}
}
else { //右センサーが黒の場合
if ( SENSOR_3> 40 ){ //左センサーが白の場合
OnFwd (OUT_A);
Wait(5);
OnRev(OUT_C);
Wait(5); //右に曲がる
}
if ( SENSOR_2 == 1 ){ if (a == 0){ //タッチセンサーが反応
OnFwd(OUT_A+OUT_C);旋回
Wait(50);
Off(OUT_A+OUT_C);
Wait(300);
OnRev(OUT_A+OUT_C);
Wait(30);
ClearTimer(0);
until ((SENSOR_2==1) || (Timer(0)>2 ))OnRev(OUT_A+OUT_C);}
if(SENSOR_2==1){a=1; //タッチセンサーが再び反応したら
OnRev(OUT_B);
Wait(50); //空き缶を挟む
}
else if(SENSOR_2==0){
If((SENSOR_1>40)&&(SENSOR_3>40)){
OnRev(OUT_A+OUT_C);
}
else{
OnRev(OUT_A);
Wait(5);
OnFwd(OUT_C);
Wait(5);
}
else{
if(SENSOR_3 > 40){
OnFwd(OUT_A);
Wait(5);
OnRev(OUT_C);
Wait(5);
}
else{
Off(OUT_A+OUT_C);
Wait(150);
OnFwd(OUT_B);
Wait(50);
Off(OUT_B);
OnFwd(OUT_A+OUT_C);
Wait(100);
Off(OUT_A+OUT_C);
OnRev(OUT_A);
Wait(50);
Off(OUT_A);
OnRev(OUT_C);
Wait(150);
Off(OUT_C);
OnRev(OUT_A);
Wait(50);
Off(OUT_A);a=0;
}
}
Off(OUT_A+OUT_C);}
**問題点、工夫した所 [#o890a03f]
・YU ・複雑にカーブしているところをスムーズに走らせたところ。
・交差点での一時停止。
・缶を正確にラインの上に移動させたところ。
他のくわしいことは上の画像とともに解説しておきました。
・UME ラインとレースはよくできたと思うが、プログラムが長くなったのでもっとシンプルなものにできれば良かった。また、ロボットのアームが長すぎカーブのすぐに空き缶がある場合うまく挟めなかったんで、次はプログラムのほかにロボットの製作からしっかり考えたい。
・UME ラインとレースはよくできたと思うが、プログラムが長くなったのでもっとシンプルなものにできれば良かった。また、ロボットのアームが長すぎカーブのすぐに空き缶がある場合うまく挟めなかったんで、次はプログラムをしっかり考えたい。
***感想 [#ee38cb6d]
・YU 課題一に比べてプログラミングにかなり苦労することが多かったです。
・UME ハサミの機能を有効に使うのが難しく苦悩しました。しかし難しいことに挑戦し頑張れたのでいい勉強になりました。
***コメントをどうぞ [#o5783f2f]