[[2009a]] [[2009a]] *課題3 懐中電灯に向かってブロックを投げるロボット [#tbc17171] A11R メンバー/ ダークホース タイラー #contents **ロボット [#z5b3b7ea] ***ディファレンシャル・ギア [#ya71b99f] 今回は「移動用に使っていいモータは一つ」という縛りがあったため、説明書のトップシークレットに載っていたデファレンシャル・ギアを用いた。~ 今回は左右回転だけが可能であればよいので、前進移動はいらないロボットを作成した。~ &ref(gia.jpg);~ ***車体 [#fcf519fa] トップシークレット、去年の先輩の作成したロボットを元に作成した。~ どうしてもギアが噛み合わなくしばしばギアが緩むこともあるが走れるのでご愛嬌。~ &ref(yoko.jpg);~ ***発射砲の作成 [#l9d331ce] 一度はカタパルト法を考えたが、いろいろなグループとかぶってしまい、面白みがないので、輪ゴムで飛ばす考えに至った。~ 命中精度、威力ともに抜群にした。~ &ref(dai.jpg);~ &ref(gan.jpg);~ ***センサー[#a2d2bc09] センサーは意外と曖昧でなかなか狙った場所に方向が向かないことに苦戦。~ しかし、先輩のアイディアを参考にさせていただき、L路のブロックを装着。~ これにより、とてもシビアで正確なセンサーになった。~ &ref(mae.jpg);~ ***完成 [#m0ee448d] マシンの完成~ だいぶ厳つい形になった。~ 発射砲なんてなんかミサイルでも出そうな感じ。~ かっこ良く仕上がっているが、少し重いせいか移動がスムーズではない。~ &ref(yoko2.jpg);~ &ref(yoko3.jpg);~ **プログラム [#n97148c4] ***1・全方向から懐中電灯の方向を探しだし、懐中電灯を狙ってブロックを投げる [#s8cf1300] #define HIKARI 50 #define KYORI 75 #define gs OnFwd(OUT_A);Wait(30);OnRev(OUT_A);Wait(30); task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1を光センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3を光センサー SetPower(OUT_A+OUT_B,7); //モーターの出力を設定 while(SENSOR_1<=HIKARI){ OnFwd(OUT_A); while(true){ //無限ループ if(SENSOR_1 > SENSOR_3){ OnRev(OUT_A); Wait(10); Off(OUT_A); //小刻みに左を向く } else if(SENSOR_1 < SENSOR_3){ OnFwd(OUT_A); Wait(10); Off(OUT_A); //小刻みに右を向く } else if(SENSOR_1 == SENSOR_3){ while((SENSOR_1<=KYORI) && (SENSOR_3<=KYORI)){ gs; } OnFwd(OUT_B); Wait(20); Off(OUT_B); } } } } [#qfda865c] 作成者:ダークホース ***2・動く懐中電灯に向かって進み、懐中電灯が止まったらブロックを投げる [#ha3e64b6] #define WHEEL_SPEED 4 #define INERTA_PAUSE 5 #define PAUSE 15 #define SEARCH_X_TIMES 3 #define THRESH3 300 #define THRESH4 400 #define THRESH5 500 #define THRESH6 600 int threshTmp1; int gMax = 1000; int r_thresh=1000; int iBdir = 0; //about 300 (very light) to 800 (very dark). This void turn(int turn_time) { //This works by moving the wheels forward the same distance //両方のホイールを同じ距離だけ動かすようにして前進する //only in increments // OnFwd(OUT_B);Wait(turn_time); Off(OUT_B);Wait(INERTA_PAUSE); OnRev(OUT_B);Wait(turn_time*2); Off(OUT_B);Wait(INERTA_PAUSE); OnFwd(OUT_B);Wait(turn_time); Off(OUT_B);Wait(INERTA_PAUSE); } void kaiten(int drive_time)//変数を使って、その時間だけ回転 { OnFwd(OUT_B);Wait(drive_time); } sub globalMax() { //To avoid getting local maixma when searching for the light //光を見つけるとき、ローカルのmaixmaを手に入れるのを避けるために //do some spins to find to max value from the flashlight //懐中電燈から最大の値を見つけるために回転をします。 ClearTimer(0); gMax = 1000; while(Timer(0) < 100) //10秒間回転して、光の値を更新し続ける { OnFwd(OUT_B); if((SENSOR_1 <= gMax)|| (SENSOR_3 <= gMax)) //センサの見つけた光を、最初に決めた変数gmaxから20ずつ減らすことによって。 { gMax = gMax - 20; } } Off(OUT_B); } void recusiveLightFinder() { if((SENSOR_1 <= r_thresh)|| (SENSOR_3 <= r_thresh))//If sensor is brighter than 6 センサが6より明るいなら {//If not brighter than current max keep driving 現在より明るくないときは動き続ける、センサの値が6以下になるまで r_thresh = r_thresh - 25; } if(iBdir == 0) { OnFwd(OUT_B); Wait(PAUSE); } else { OnRev(OUT_B); Wait(PAUSE); } Off(OUT_B); } task main() { SetSensorMode(SENSOR_1,SENSOR_MODE_RAW); SetSensorMode(SENSOR_3,SENSOR_MODE_RAW); SetPower(OUT_B, WHEEL_SPEED); globalMax();//光の最大値を探す while((r_thresh >= gMax+(gMax/20))||(r_thresh >= (gMax+(gMax/20))))// { PlaySound(4); recusiveLightFinder(); } Wait(70); PlaySound(5); turn(40); //Drive foward OnFwd(OUT_C); //Fire Wait(10); } 作成者:タイラー **感想 [#vd4ee9a4] **コメント [#u2122315] コメントをどうぞ - プログラム中に無限ループと書いてありますが、投げたら抜けるようにしてください。ロボが停止しても、プログラムは動き続けてしまいます。タイラーさんのプログラムでは「while((r_thresh >= gMax+(gMax/20))||(r_thresh >= (gMax+(gMax/20))))」がよくわかりません…説明を付け足してください。 -- [[こさか]] &new{2009-08-10 (月) 00:58:20}; #comment