目次 目次 #contents *課題2の内容 [#y92e66c5] 黒い線で作成したコースに沿って動くロボットを製作する。 ただし交差点では次のような動きをさせる。 一人目 一回目に交差点にさしかかったときは直進~ 二回目は左折~ 三回目は直進~ 四回目は右折~ 五回目は右折 → ゴールへ~ #br 二人目~ 一回目に交差点にさしかかったときは左折~ 二回目は右折~ 三回目は左折~ 四回目は直進~ 五回目は直進 → ゴールへ~ #br 以下を参照 [[課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2FMission2]] #br 自分は二人目の動作をさせた。 *ロボット本体 [#d49c5481] 最初の冊子にのっていたライントレース用のロボットは、カーブでセンサーが黒線から外れてしまったので、光センサーを本体からなるべく近くに設置しなおした。~ これによってセンサーが外れることはなくなった。 *プログラム [#v47f2d49] 基本的には冊子に乗っていたライントレースのプログラムを利用した。 **使用したマクロ [#p70c0e10] ***しきい値と各スピード [#bbf908d2] #define THRESHOLD 45 //センサーのしきい値 #define SPEED_H 50 //前進するときのモーターのスピード #define SPEED_L 25 //曲がるときのモーターのスピード ***ライントレース [#hb24930a] #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); 前進 #define go_forward OnRL(SPEED_H,SPEED_H); 左に曲がる(両輪) #define turn_left1 OnRL(SPEED_L,-SPEED_L); 左に曲がる(片輪) #define turn_left0 OnRL(SPEED_L,0); 右に曲がる(片輪) #define turn_right0 OnRL(0,SPEED_L); 右に曲がる(両輪) #define turn_right1 OnRL(-SPEED_L,SPEED_L); ***交差点での動き [#q51ab62c] #define STEP 1 交差点のしきい値 #define nMAX 150 1秒止まる #define short_break Off(OUT_BC);Wait(1000); 交差点を渡る時間 #define CROSS_TIME 200 交差点を渡る #define closs_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; **main関数 [#m6bf1a0f] task main() { SetSensorLight(S3); int nOnline=0; int closs_number=1; //交差点の番号(何回目の交差点か) ***ライントレースと、交差点の判断 [#ofa8e48e] while(true){ while(nOnline < nMAX){ if(SENSOR_3 < THRESHOLD-15){ //ほぼ黒線上 turn_left1; PlaySound(SOUND_LOW_BEEP); //低いビープ音を鳴らす nOnline++; }else{ if(SENSOR_3 < THRESHOLD-7){ //黒に近い turn_left0; }else if(SENSOR_3 < THRESHOLD+7){ //中間 go_forward; }else if(SENSOR_3 < THRESHOLD+15){ //白に近い turn_right0; }else{ //ほとんど白 turn_right1; PlaySound(SOUND_LOW_BEEP); //低いビープ音を鳴らす } nOnline=0; } Wait(STEP); } ***交差点における判断 [#g414f9c3] /*交差点であるとき*/ if(closs_number != 3){ //3回目の交差点のとき、曲がる(回数はとりあえず) short_break; turn_right1;Wait(nMAX*STEP); closs_line; nOnline=0; //回数を1増やす closs_number++; //交差点の番号を1増やす PlaySound(SOUND_CLICK); //クリック音を鳴らす } else //そうでないとき { nOnline=0; //回数をリセット closs_number++; //交差点の番号を1増やす PlaySound(SOUND_UP); //「テレレー↑」という音をならす } } } *問題点 [#oab0db83] いくつか問題が発生して、解決できたものとできなかったものがあった **問題:交差点の判断ができない(解決済み) [#tc869301] 交差点を正しく認識できなくなった。何度も走らせて確かめたところ、毎回交差点を曲がり角と誤認して左に曲がってしまっていた。 ***解決法 [#pb7429cf] (完全に黒線上にいた回数) < (交差点の判断基準となる回数) となっているはずなので、交差点の判断基準であるnMAXの値を300から150に変更したところ、正常に判断できるようになった。 **問題:小さいカーブを曲がれない(未解決) [#h747523c] センサーを近くしたことで大きなカーブでは問題なく黒線を追えるようになったが、小さい円の部分を曲がるときにセンサーが外れてしまった。このときのタイヤの動きを観察したところ、外側のタイヤのみが回転して曲がっていたため、内輪差でセンサーが外れてしまっていることがわかった。 ***解決法 [#wb019f31] 外側のタイヤの回転だけでは曲がりきれないので、内側のタイヤを逆回転させればよいと思われる。(時間切れで実装に至らなかった。) *考察・感想 [#v919e07e] プログラムの問題を修正することに時間がかかってしまい、結局目的の動きをさせることはできなかった。交差点の判断はできているはずなので、あとはカーブを曲がれるようになればあとは「いまが何回目の交差点か」をかぞえて、if文を使って曲がる or 曲がらないの判断をすれば、課題は達成できると思う。~ 問題に気づくのが遅れてしまい、対策を考えるのが遅くなったので、次回はもっと早めに試す機会を作るようにしたい。