こんにちは~!
みなさんはお盆休み何をしてすごされましたか?
私は結構だらだらと過ごしてしまいましたw
月曜の朝起きられるか不安だったので、妖しげな快眠&目覚ましアプリをiPhoneに入れたりしていたら眠れなくなったのは昨夜のいい思い出ですw
いろいろなアプリがあるものですね~
さて、マイクロマウス研修ですが、 本日も壁切れのプログラムを書いては試し、書いては試していきます。
※おさらい
松崎は、最短走行時に2区画以上走って右折する場合のみ壁切れ補正をするプログラムを書きたいと思っています。
前回までに、「停止する一区間前までは通常走行し、壁の切れ目がなくなったら、モーターのカウントをリセットして任意の距離を走り超信地旋回する」という意図でプログラムを書きました。
(残念ながら”意図”に終わっています;_;)
本日も、のり先生とプログラムをじっくり見ながらトライアンドエラーです。
※前回書いてみたstraight_for_fastの全体のプログラムはこちらのブログをご覧ください。
今日最初に試したのはこれ。
//以下、最短走行時の超信地旋回前壁切れ補正(右折のみ) if(len > SECTION*2) ; //2区画以上走る場合 { while(len - STEP2LEN(step_r + step_l) > SECTION*1); //停止する1区間前まで走る while(sen_r.is_wall == true); //横壁がある間場合まで走る step_r = step_l = 0; //ステップ数カウントのリセット while((step_r + step_l) < LEN2STEP(len_remains)); //あと走るべき距離走る //MTU2.TSTR.BIT.CST3 = 0 //モータのカウントをストップ //MTU2.TSTR.BIT.CST4 = 0; //モータのカウントをストップ } while((step_r + step_l) < obj_step) ; //目標地点まで走行 MTU2.TSTR.BIT.CST3 = 0; //モータのカウントをストップ MTU2.TSTR.BIT.CST4 = 0; //モータのカウントをストップ }
前回は、2区画以上走る場合のif文の中で最後にモータの回転をストップさせるよう書いていたのですが、 モータのカウントをストップさせた状態で
while((step_r + step_l) < obj_step) ; //目標地点まで走行
というwhile文のループを抜けるわけもなく(左右のモータのステップ数が永遠に目標ステップ数に届かないw)、
止まるに決まっているのでありましたw
と、いうことで、if 文の中でモータのカウントをストップさせる2行をコメントアウトしてみたのです。
するとこんな風に。
ぶるぶるぶるぶるぶる…。
停止地点までは行ったけど、壁に向かってぶるぶるとゆっくり前進しだした!!!汗
モータに不具合でも出たかと即座に電源を消し(すぐ消すクセが…!)、のり先生と反省会。
上に挙げたプログラムをよく見てみてください。
壁が切れた瞬間にモータのステップ数をリセットし、 任意のステップ数走らせて補正しようとしているのですが、 それだと、if文を抜け出したのち、
while((step_r + step_l) < obj_step) ; //目標地点まで走行
の行に入ったときに、リセットしたあとにカウントしたステップ数からスタートしてしまうので、
減速後の最低速度で律儀~に律儀~に目標ステップ数まで牛歩しているのですw
説明がちょっと難しいですが、図にするとこんな感じかなあ…。
ですから、Genieちゃんの頭の中で目標ステップ数が満たされれば、走り出しますw
こんな感じに、非常に律儀ですw
ということで、このエラーを踏まえて改変!!
//最短走行時の超信地旋回前壁切れ補正 if(len > SECTION*2) ; //2区画以上走る場合 { while(len - STEP2LEN(step_r + step_l) > SECTION*1); //停止する1区間前まで走る while(sen_r.is_wall == true); //横壁がある間場合まで走る step_r = step_l = 0; //ステップ数カウントのリセット while((step_r + step_l) < LEN2STEP(len_remains)); //あと走るべき距離走る //MTU2.TSTR.BIT.CST3 = 0 //モータのカウントをストップ //MTU2.TSTR.BIT.CST4 = 0; //モータのカウントをストップ } else { while((step_r + step_l) < obj_step) ; //目標地点まで走行 } MTU2.TSTR.BIT.CST3 = 0; //モータのカウントをストップ MTU2.TSTR.BIT.CST4 = 0; //モータのカウントをストップ }
やっぱり
while((step_r + step_l) < obj_step) ; //目標地点まで走行
が肝ですね。
このwhile文から抜けたらモータの回転を停止するので、大切な一行なのですが、
私が書いてみた2区画以上走るif文はその中ですでに停止すべき位置にマウスを持ってきているので、
(壁の切れ目から一定距離走ったところがぴったり停止位置になるようにしているから)
この一行はif 文が適用される場合は無効でいいのです。
]
だからelseで「それ以外のとき(2区画以上走らないとき)」のみ適用されるようにしました。
結果はこちら。
おおおお^^ 成功です!!
ですが、帰り道で不審な動きをしています… ね…?
松崎「たぶん電池切れですね!電圧監視用LEDも色が違うし。あー走ってよかった~!!」
のり先生「…本当にそうかな?ニヤリ」
まだまだ穴があるみたいです(;_;)