RV1用プログラム「goturn2


プログラムの方針

プログラムを作るにあたって、次のことを考えました。

そこで設計方針として、次のようにしました。

また、ちょっと愛嬌もほしいと思い、次も加えました。


プログラムの設計

次のように設計しました。

このうち、光センサーが反応したときの動きが一番重要です。
RV1の場合、後退する時間が小さすぎると、黒の枠を越えてしまって、あとは暴走します。
逆に大きすぎると、大きく方向転換するので、黒の枠に沿うような微妙な動きにならず、賢そうに見えません。
テストパッド上で何度か試行錯誤して、光センサーが反応したときの動きを次のようにしました。

これでも、例えば枠に浅い角度で当たると、方向転換が大きすぎるように見えます。
逆に深い角度のとき、どうかすると枠を越えてしまうことがたまにあります。
とはいえ、単純なプログラムでは、これでよしとしましょう。

RV1以外でも、ローバーボット系のものなら、右モーターの逆回転時間を調整することで対応できるでしょう。
また、左右を入れ替えれば、当然左へ曲がるようになります。

音については、次のようにしました。

なお、入出力ポートは次のように接続されているとします。


プログラム「goturn2」(RIS風表示)

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秒
プログラム
終了


プログラムリスト「goturn2.lsc

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
}

LEGOで遊ぶ : プログラム