#contents *課題について [#k833dc5c] 課題概要については→[[課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2]] #ref(./2017a-mission2.png); ~E地点を右折するプログラムを作成した。 ~・E地点右折コース ~E右折(SOUND_UP) ~P一時停止(SOUND_DOWN)&左折 ~Q(SOUND_UP)&直進 ~R(SOUND_UP)&左折 ~T一時停止(SOUND_DOWN)&直進 ~T一時停止(SOUND_DOWN)&直進 ~H(SOUND_UP) ~G(SOUND_UP) ~S一時停止(SOUND_DOWN)&左折 ~P直進(SOUND_UP) ~Q左折(SOUND_UP) ~F(SOUND_UP) ~E直進 ~A停止(SOUND_DOWN) *ロボットの構造について [#kefa40d7] #ref(./DSC_0402.JPG,10%.); ロボットの長さは16.9cm、幅は14.0cm、高さは15.5cmである。本体を直立させ、タイヤを幅いっぱいに広げることでより小回りがきくようになっている。本体の背面には支えるためのアームが取り付けてある。タイヤなどではなく、接地面の少ない棒にすることで摩擦が少なく動作を妨げない。 *プログラム [#e25666b8] **定義部分 [#f3c42062] #define THRESHOLD 39 #define HIPOWER 7 #define LOWPOWER 2 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_H;OnFwd(OUT_AC); #define turn_right1 set_power_L;OnFwd(OUT_C); OnRev(OUT_A); #define turn_right0 set_power_L;OnFwd(OUT_C); Off(OUT_A); #define turn_left0 set_power_L;OnFwd(OUT_A); Off(OUT_C); #define turn_left1 set_power_L;OnFwd(OUT_A); OnRev(OUT_C); #define Break Off(OUT_AC);Wait(100); まずは閾値を計測の結果から39と設定し、THRESHOLDで定義した。また、スムーズな動作を実現するためset_powerにより二種類の回転速度を設定。直進するときはハイパワーで、曲がるときはローパワーで回転するようにした。turn_right1とturn_left1は両輪を互いに逆回転させその場で回転するような急旋回、turn_right0とturn_left0は片方の車輪のみを回転させやや前進しながらの緩やかな旋回を定義している。Breakは交差点での停止動作をまとめて定義したものである。 **サブルーチン [#u7d48f44] sub L_LINE() {int Black_Time; Black_Time=0; while(Black_Time < 6){ if (SENSOR_2 < THRESHOLD -2) { turn_left1; Black_Time++; } else if (SENSOR_2 < THRESHOLD -1) { turn_left0; Black_Time++; } else if (SENSOR_2 < THRESHOLD +1) { go_forward; } else if (SENSOR_2 < THRESHOLD +2) { turn_right0; Black_Time = 0; } else { turn_right1; Black_Time = 0; } Wait(1);} } sub R_LINE() {int Black_Time; Black_Time=0; while(Black_Time < 6){ if (SENSOR_2 < THRESHOLD -2) { turn_right1; Black_Time++; } else if (SENSOR_2 < THRESHOLD -1) { turn_right0; Black_Time++; } else if (SENSOR_2 < THRESHOLD +1) { go_forward; } else if (SENSOR_2 < THRESHOLD +2) { turn_left0; Black_Time = 0; } else { turn_left1; Black_Time = 0; } Wait(1);} } まず黒い線の左側をトレースするプログラムと右側をトレースするプログラムの2つをサブルーチンで表した。(Lが左、Rが右)1回の動作は0.01秒で、黒い部分が6回続いたと判断した場合にこの動作から抜け出すようになっている。whileの中はint Black_Timeで変数を定義、閾値より光センサーの値が小さい(暗い)時にこの変数に1足して、逆に閾値より光センサーの値が大きい(明るい)時に変数を0に戻す(0を代入する)ようにしている。 **動作プログラム [#y1433ac9] task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); int C_TIME; C_TIME = 0; int Black_Time; Black_Time=0; if(C_TIME ==0) { R_LINE(); C_TIME++; } if(C_TIME == 1) { PlaySound(SOUND_UP); ClearTimer(0); while(FastTimer(0) < 100) {if (SENSOR_2 < THRESHOLD -2) { turn_right1; Black_Time++; } else if (SENSOR_2 < THRESHOLD -1) { turn_right0; Black_Time++; } else if (SENSOR_2 < THRESHOLD +1) { go_forward; } else if (SENSOR_2 < THRESHOLD +2) { turn_left0; Black_Time = 0; } else { turn_left1; Black_Time = 0; } Wait(1); } R_LINE(); C_TIME++; } if(C_TIME == 2) { PlaySound(SOUND_DOWN); Break; turn_left1; Wait(75); go_forward; Wait(10); L_LINE(); C_TIME++; } if(C_TIME == 3) { PlaySound(SOUND_UP); turn_right0; Wait(60); L_LINE(); C_TIME++; } if(C_TIME == 4); { PlaySound(SOUND_UP); ClearTimer(0); while(FastTimer(0) < 100) {if (SENSOR_2 < THRESHOLD -2) { turn_left1; Black_Time++; } else if (SENSOR_2 < THRESHOLD -1) { turn_left0; Black_Time++; } else if (SENSOR_2 < THRESHOLD +1) { go_forward; } else if (SENSOR_2 < THRESHOLD +2) { turn_right0; Black_Time = 0; } else { turn_right1; Black_Time = 0; } Wait(1); } L_LINE(); C_TIME++; } if(C_TIME == 5) { PlaySound(SOUND_DOWN); Break; turn_right0; Wait(90); R_LINE(); C_TIME++; } if(C_TIME == 6) { PlaySound(SOUND_DOWN); Break; turn_left0; Wait(40); R_LINE(); C_TIME++; } if(C_TIME == 7) { PlaySound(SOUND_UP); ClearTimer(0); while(FastTimer(0) < 100) {if (SENSOR_2 < THRESHOLD -2) { turn_right1; Black_Time++; } else if (SENSOR_2 < THRESHOLD -1) { turn_right0; Black_Time++; } else if (SENSOR_2 < THRESHOLD +1) { go_forward; } else if (SENSOR_2 < THRESHOLD +2) { turn_left0; Black_Time = 0; } else { turn_left1; Black_Time = 0; } Wait(1); } R_LINE(); C_TIME++; } if(C_TIME == 8) { turn_right1; Wait(65); turn_right0; Wait(145); R_LINE(); C_TIME++; } if(C_TIME == 9) { PlaySound(SOUND_UP); ClearTimer(0); while(FastTimer(0) < 100) {if (SENSOR_2 < THRESHOLD -2) { turn_right1; Black_Time++; } else if (SENSOR_2 < THRESHOLD -1) { turn_right0; Black_Time++; } else if (SENSOR_2 < THRESHOLD +1) { go_forward; } else if (SENSOR_2 < THRESHOLD +2) { turn_left0; Black_Time = 0; } else { turn_left1; Black_Time = 0; } Wait(1); } R_LINE(); C_TIME++; } if(C_TIME == 10) { PlaySound(SOUND_DOWN); Break; turn_left1; Wait(75); go_forward; Wait(10); L_LINE(); C_TIME++; } if(C_TIME == 11) { PlaySound(SOUND_UP); turn_right0; Wait(60); L_LINE(); C_TIME++; } if(C_TIME == 12) { PlaySound(SOUND_UP); turn_left0; Wait(30); go_forward; Wait(30); R_LINE(); C_TIME++; } if(C_TIME == 13) { PlaySound(SOUND_UP); ClearTimer(0); while(FastTimer(0) < 100) {if (SENSOR_2 < THRESHOLD -2) { turn_right1; Black_Time++; } else if (SENSOR_2 < THRESHOLD -1) { turn_right0; Black_Time++; } else if (SENSOR_2 < THRESHOLD +1) { go_forward; } else if (SENSOR_2 < THRESHOLD +2) { turn_left0; Black_Time = 0; } else { turn_left1; Black_Time = 0; } Wait(1); } R_LINE(); C_TIME++; } if(C_TIME == 14) { Off(OUT_AC); PlaySound(SOUND_UP); PlaySound(SOUND_DOWN); } } 初めにC_TIMEを定義して *感想 [#q4a9f14c] 最初はかなり苦労したし挫折しかけた。しかし最後まで走らせることができたときの達成感は格別であった。