- 追加された行はこの色です。
- 削除された行はこの色です。
'''Team Member'''
''Fukasawa&Kitazawa''
&size(30){''Contents''};
#contents
*課題内容 [#lc6eead2]
今回の課題は懐中電灯のある方向に、黄色いホイールのパーツを打つロボットです。
詳しい課題の内容は詳しい課題内容は[[課題3:http://yakushi.shinshu-u.ac.jp/robotics/?2010a%2F%CE%FD%BD%AC%CC%E4%C2%EA#kadai3]]をご覧ください。
また、それぞれ課題の内容が異なります。
''Fukasawa''→全方向から2つの懐中電灯の方向を探しだし、懐中電灯を狙ってホイールを投げる。可能な限り正確な方向に投げること。
''Kitazawa''→懐中電灯をゆっくり動かしたとき懐中電灯に向かって進み、懐中電灯の動きを止めれば一定の距離(懐中電灯から30cm以上離れた距離)まで近づいて懐中電灯を狙ってブロックを投げる。
*ロボット紹介 [#b6588c4a]
**完成したロボット [#k259bd8b]
完成したロボットがこちらです。
&ref(2010a/A8/課題3左/完成.JPG,完成);
**ロボットの全体図 [#g4e0828f]
&ref(2010a/A8/課題3左/前.JPG,前);
&ref(2010a/A8/課題3左/後ろ.JPG,後ろ);
&ref(2010a/A8/課題3左/右.JPG,右);
&ref(2010a/A8/課題3左/左.JPG,左);
&ref(2010a/A8/課題3左/上.JPG,上);
&ref(2010a/A8/課題3左/裏.JPG,裏);
*ロボットの仕組み [#ab61d52e]
**移動の仕方 [#y8ff7cae]
ホイールの発射の仕組みにモーターを2つ使うために、移動にはモーターを1つだけしか使うことができませんでした。そこで「ディファレンシャルギア」を使って移動する仕組みにしました。ディファレンシャルギアを使うことで、モーターを回転させる方向で次の動きをさせることができました。
&ref(2010a/A8/課題3左/仕組み.png,移動の仕組み);
&ref(2010a/A8/課題3左/ギア.JPG,ギア);
&ref(2010a/A8/課題3左/方向.JPG,方向);
歯止めの写真です。赤丸内の歯止めのおかげで、黄色の矢印の方向だけにしか、このタイヤは回ることができません。
**光センサーの付け方 [#u3d3e214]
&ref(2010a/A8/課題3左/光センサー.JPG,光センサー);
光センサーを前に2つ付けました。2つ目の課題で課されている内容で、左右に懐中電灯を振ったときに、うまく懐中電灯を追えるようにするためです。
&ref(2010a/A8/課題3左/図.JPG,図);
光センサーと発射口の位置を同じにしています。発射口を目標である懐中電灯の光の方向に確実に向けることができます。
**ホイールを発射する仕組み [#k10ff7c4]
***ホイールを発射する流れ [#se29b2b3]
&ref(2010a/A8/課題3左/流れ図.png,流れ図);
図の青色のバーで、装填してあるホイールを押し、1つだけ下の階に落とします。黒い大きなタイヤを赤い矢印の方向へ高速回転させておき、下の階に落ちたホイールがその下を通ることによりホイールが加速し発射されます。
***ホイールの発射 [#n1dc83ab]
実物の写真での説明です。
&ref(2010a/A8/課題3左/打ち出し.JPG,打ち出し);
青の矢印の向きに転がってきて、赤の矢印に高速回転しているタイヤに押し出され発射されます。
&ref(2010a/A8/課題3左/発射口.JPG,発射口);
発射口をロボットの前方から見た写真です。黄丸のところでホイールとタイヤが接触します。下に弾力性のある紫色のチューブを使用したことにより、タイヤとの幅を少し狭く設定することができ、確実にホイールをタイヤと接触させることができます。
***ホイールの押し出し [#sa937721]
&ref(2010a/A8/課題3左/押し出し.JPG,押し出し);
黄色の矢印の方向に軸が回ることで、青丸内で上のパーツを赤の矢印の方向にスライドしていきます。
&ref(2010a/A8/課題3左/輪ゴム.JPG,全体);
&ref(2010a/A8/課題3左/輪ゴム&モーター.JPG,モーター);
押し出す仕組みの全体の写真です。赤丸のところに輪ゴムが巻いてあり、ロボットの前の方向に付いているモーターの力で軸を回します。
***スライドする部分の組み方 [#t88037cf]
&ref(2010a/A8/課題3左/使い方.JPG,使い方);
あえてスライドする部分の板のパーツを反対に取り付け、平らな部分が外側にきたことで、スムーズにスライドするようになっています。
*プログラム [#j884284f]
**Fukasawa ver. [#qc8c51f5]
int X;
task main ()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
X = 0 ;
repeat(70){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);if(X < SENSOR_1){X = SENSOR_1;}}//明るさが一番大きいところを見つける
while(X > SENSOR_1){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);}//明るさの一番大きいところまで車体を向ける
OnRev(OUT_A);Wait(150);OnRev(OUT_C);Wait(40);Off(OUT_C);Wait(20);Float(OUT_A);Wait(150);//ホイール発射
X = 0 ;
repeat(5){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);}
repeat(65){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);if(X < SENSOR_1){X = SENSOR_1;}}
repeat(5){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);}//最初に標的にしたライトをよけて一回転させ、二番目に明るい場所を見つける
while(X > SENSOR_1){OnRev(OUT_B);Wait(5);Off(OUT_B);Wait(15);}//二番目に大きいところに車体を向ける
OnRev(OUT_A);Wait(150);OnRev(OUT_C);Wait(40);Off(OUT_C);Wait(20);Float(OUT_A);Wait(150);}//ホイール発射
**Kitazawa ver. [#u9fe9d68]
前から見て右側の光センサーに懐中電灯の光が当たっているときに前進させることにする
#define go OnFwd(OUT_B); //直進
#define spin OnRev(OUT_B); //左回転
#define eye_r SENSOR_2 //センサー2の名称を「eye_r」に定義
#define eye_l SENSOR_1 //センサー1の名称を「eye_l」に定義
#define boundary_r 800 //右側の光センサーに使う閾値。こっちの値は暗い方に際どくする。(完全に懐中電灯の光が消えたことを感知するため)
#define boundary_l 450 //左側の光センサーに使う閾値。こっちの値は明るい方に際どくする。(懐中電灯の光が直に当たったことを感知するため)
#define boundary_r_2 600 //右センサーに直接光が当たったことを判別するのに使う値
task main()
{
SetPriority(0);
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサーと定義
SetSensor(SENSOR_2,SENSOR_LIGHT); //センサー2を光センサーと定義
SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); //センサー1の精度を上げる
SetSensorMode(SENSOR_2,SENSOR_MODE_RAW); //センサー2の精度を上げる
while (true) {
ClearTimer(0); //光が当たりつづけた場合ホイールを発射するためカウントを開始
go; //普段は直進
until((eye_l<=boundary_l)||(eye_r>=boundary_r)); //下の条件式に当てはまる状況になったら、この式を終えて次の式へ移る
if(eye_l<=boundary_l) { //もし左に懐中電灯の光が直に当たったら(懐中電灯が左に動いたら)
spin;Wait(250); //270度左回転
go;Wait(100); //1秒間前身
spin;until(eye_r<=boundary_r_2); //前から見て右の光センサーに懐中電灯の光が当たるまで左回転
}
if(eye_r>=boundary_r) { //もし右の光センサーから光が完全に外れたら(懐中電灯が右に動いたら)
spin;Wait(100); //180度左回転
go;Wait(100); //1秒間前身
spin;until(eye_r<=boundary_r_2); //右の光センサーに懐中電灯の光が当たるまで左回転
}
}
until(FastTimer(0)>=100); //1秒間光があたり続けるまで(1秒間光が当たったらホイールを発射する)
Off(OUT_B); //モーターを止める
PlaySound(SOUND_DOUBLE_BEEP); //合図で音
OnRev(OUT_A);Wait(150); //発射口のタイヤを回し始める(ホイール発射時に最高速に達しておくために、ホイールを押し出すよりも早めに回し始める)
OnRev(OUT_C);Wait(50); //ホイールを一つ押し出す
Float(OUT_A+OUT_C); //動かしているモーター2つをゆっくりと止める
}
*感想 [#o535427a]
**Fukasawa [#gf20a36c]
二個以上ホイールを発射できるロボットということで、2.4秒間に六連射できる高性能なロボットをノリだけで作ってしまった。しかし、課題ではこの機能を十分に生かせなかった。壊すのがもったいない位によくできたと思います。プログラムもほぼ同じ動作の繰り返しなので簡単にできました。
**Kitazawa [#kf845290]
ディファレンシャルギアの部分を作ったが、ロボットが完成して、いざ動かそうとしたらうまく動かなかった。組みあがったあとからの訂正はやりにくく、全体を組み上げてくれたパートナーに迷惑をかけてしまった。次からは、ある程度の動作部分ができ上がったら、動作確認くらいはしておきたいと思う。
*コメント [#s604c90f]
コメントよろしくお願いします。
-ロボットの説明は見やすくてわかりやすいです。ディファレンシャル・ギアの説明までしていてとてもよいです。 一人目のプログラムに説明をつけて、indentや空行を使って理解しやすくしてみてください。 -- [[FI]] &new{2010-07-30 (金) 22:12:48};
- 上に書いたとおり、ロボットの説明はとても詳しくてよいです。プログラムに関して細かいことを言うと、以下の通りです。1人目のwhile(X > SENSOR_1)は、ロボットが動くことで距離がずれて懐中電灯の明るさが多少変化するかもしれないので、実際には多少の幅を持たせた方が良いかもしれません。(理論的には正しいと思うので問題ないです)2人目は懐中電灯の停止を確認した後、30cm以上の距離というのをどう判断するのかがあるとなおよいです。-- [[FI]] &new{2010-08-07 (土) 01:31:24};
- ロボットの説明はよくできています。プログラムについての修正をお願いします -- [[TAKA]] &new{2010-08-08 (日) 12:24:02};
#comment