プログラムを作るにあたって、次のことを考えました。
そこで設計方針として、次のようにしました。
また、ちょっと愛嬌もほしいと思い、次も加えました。
次のように設計しました。
このうち、光センサーが反応したときの動きが一番重要です。
RV1の場合、後退する時間が小さすぎると、黒の枠を越えてしまって、あとは暴走します。
逆に大きすぎると、大きく方向転換するので、黒の枠に沿うような微妙な動きにならず、賢そうに見えません。
テストパッド上で何度か試行錯誤して、光センサーが反応したときの動きを次のようにしました。
これでも、例えば枠に浅い角度で当たると、方向転換が大きすぎるように見えます。
逆に深い角度のとき、どうかすると枠を越えてしまうことがたまにあります。
とはいえ、単純なプログラムでは、これでよしとしましょう。
RV1以外でも、ローバーボット系のものなら、右モーターの逆回転時間を調整することで対応できるでしょう。
また、左右を入れ替えれば、当然左へ曲がるようになります。
音については、次のようにしました。
なお、入出力ポートは次のように接続されているとします。
goturn2 | タッチセンサー 1 押されたとき |
光センサー 2 暗くなったとき |
||
---|---|---|---|---|
パワー設定 AC 4 |
オフ AC (ブレーキ) |
オフ AC (滑走) |
||
リピート | ビープ 5 |
トーン 100-300 / 0.2秒 |
||
方向設定 A↑C↑ |
ウェイト 1.0秒 |
方向設定 C↓ |
||
オン AC | プログラム 終了 |
オン C 0.3秒 |
||
期間 タイマー1 < 20.0 |
||||
オフ AC (滑走) |
||||
ビープ 3 |
||||
ウェイト 3.0秒 |
||||
プログラム 終了 |
program test { #include <RCX2.h> #include <RCX2MLT.h> #include <RCX2Sounds.h> #include <RCX2Def.h> sensor touch1 on 1 touch1 is switch as boolean event tPress_touch1EventPress when touch1.pressed sensor light2 on 2 light2 is light as percent event lDark_light2EventLow when light2.low main { ext InterfaceType "kRoverBot" rcx_ClearTimers bbs_GlobalReset([A B C]) start TouchWatcher0 start LightWatcher1 rcx_Priority( 8) trigger tPress_touch1EventPress trigger lDark_light2EventLow try { power [ A C ] 4 } retry on fail try { while timer1 < 200 { direction [ A C ] [ ] on [ A C ] } } retry on fail try { float [ A C ] sound 3 } retry on fail wait 300 try { stop tasks } retry on fail } watcher TouchWatcher0 monitor tPress_touch1EventPress { rcx_Priority( 3 ) try { off [ A C ] sound 5 wait 100 stop tasks } restart on fail } restart on event watcher LightWatcher1 monitor lDark_light2EventLow { rcx_Priority( 4 ) try { float [ A C ] tone ( Random 100 to 300 ) for 20 direction [ ] [ C ] on [ C ] for 30 } restart on fail } restart on event } |