[[2016a/Member]] 目次 #contents *はじめに [#e2420186] 今回の課題はライントレスです。 図のようなコースを使ってこの黒線の上をRISで走らせます。 3つのコースが用意され、私はC地点からA地点のコースを走らせます。 C地点からA地点はC地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点の順に進みます。 *ロボットの紹介 [#lc1cff07] **ロボットの説明 [#fd2bca38] RIS本体の前方に光センサーを装着します。 &ref(2016a/Member/kosi/Mission1/P_20160707_170517.jpg,30%); &ref(2016a/Member/kosi/Mission2/P_20160707_170517.jpg,30%); *プログラム [#j9753b78] **定義の説明 [#m7103da1] #define time 5 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(time); #define turn_right_oo OnFwd(OUT_A);Off(OUT_C);Wait(time); #define turn_left OnFwd(OUT_C); OnRev(OUT_A);Wait(time); #define turn_left_oo Off(OUT_A); OnFwd(OUT_C);Wait(time); #define go_forward(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); #define black 40 #define white 50 #define STAP 1 私は光センサーの時間を使った定義をしました。 主にRIS本体の前進、迂回方法、影の度合いについて定義しました。 **subの説明 [#fa5ad731] sub line_go() { ClearTimer(0); while(FastTimer(0)<36){ if(SENSOR_2 <= black){ turn_right_oo; }else if(SENSOR_2 < black+2){ turn_right; }else if(SENSOR_2 > white-2){ turn_left_oo; ClearTimer(0); }else if(SENSOR_2 >= white){ turn_left ClearTimer(0); }else{ OnFwd(OUT_AC); ClearTimer(0); } Wait(STAP); } Off(OUT_AC); ClearTimer(0); PlaySound(SOUND_UP); Wait(100); } このsubは、黒線に沿って進むように定義され、もし黒線の時間が通常より長い場合(その時間もていぎして)は、交差点とみなし一時停止するというsubを作りました。 sub crossing_right() { repeat(10){ turn_right; } } このsubは交差点を右折するために定義したもので、単に交差点に差し掛かった場合はRIS本体が右に曲がるように定義されています。 ここで、repeatを10回繰り返したのは、defineで予め時間設定をしていたので、その時間を長くすれば大きく曲がるためです。 sub crossing_left() { repeat(8){ turn_left; } } このsubは交差点を左に曲がるために定義したもので、右折と同じく交差点に差し掛かった場合は左に曲がるように指示したものです。 repeatについても、右折方法と同じです。 **プログラム [#edefa94e] #define time 5 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(time); #define turn_right_oo OnFwd(OUT_A);Off(OUT_C);Wait(time); #define turn_left OnFwd(OUT_C); OnRev(OUT_A);Wait(time); #define turn_left_oo Off(OUT_A); OnFwd(OUT_C);Wait(time); #define go_forward(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); #define black 40 #define white 50 #define STAP 1 sub line_go() { ClearTimer(0); while(FastTimer(0)<36){ if(SENSOR_2 <= black){ turn_right_oo; }else if(SENSOR_2 < black+2){ turn_right; }else if(SENSOR_2 > white-2){ turn_left_oo; ClearTimer(0); }else if(SENSOR_2 >= white){ turn_left ClearTimer(0); }else{ OnFwd(OUT_AC); ClearTimer(0); } Wait(STAP); } Off(OUT_AC); ClearTimer(0); PlaySound(SOUND_UP); Wait(100); } sub crossing_right() { repeat(10){ turn_right; } } sub crossing_left() { repeat(8){ turn_left; } } task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); go_forward(120); line_go(); crossing_left(); line_go(); crossing_left(); line_go(); go_forward(50); line_go(); go_forward(50); line_go(); crossing_right(); line_go(); crossing_left(); line_go(); Off(OUT_AC); } 交差点を直線するについては、本体を少しの時間進めて、また黒線に沿って進むように定義しました。 *感想 [#xc024e6d] **プログラムについて [#udc4a7f6] 今回のプログラミングは、はじめsubについて理解できずとても苦労しました。 交差点Qから交差点Rの急カーブは特に交差点だと認識してしまうところが反省点です。 もう少し時間設定を精密にしていけばよかったのかと思います。 **ライントレスについて [#qb42dc35] 急カーブのところでつまずいてしまい、結局解決に至りませんでした。 subで定義したものでは、回転半径が大きすぎて曲がれなかったので、そのカーブを進行する際にrepeatで少しずつ90度回転する動きを入れてまた挑戦したいと思います。