プログラムを作るにあたって、次のことを考えました。
そこで設計方針として、次のようにしました。
また、ちょっと愛嬌もほしいと思い、次も加えました。
次のように設計しました。
このうち、光センサーが反応したときの動きが一番重要です。
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
}
|