C-Styleでオムニホイール制御(SCA導入 その1)
いくつかの方向に動かせるようになったら、プログラムを三要素 S・C・Aに分けて組み立ててみる。
- S(Sensor) センサ:感じて知らせる!
- C(Computer) コンピュータ:判断して命令!
- A(Actuator) アクチュエータ:目的をはたす!
SCAの歌はこちらのScene7へ。S・C・A!S・C・A!
プログラムをする前に、ある程度コメントの書き方を共通化したり、使い回しするためのテンプレート(ひな形)を作っておくとよいと思う。白紙からプログラムせずに、テンプレートをコピーしてからプログラムし始めれば、プログラムの体裁も整えやすい。
コメントは各行でも随時入力しておく。また、コメントが設定できない「else」ボタンなども考慮すると、空のC-Codeボタンのコメント欄を使い、コメントだけの行を作るとよりプログラムが見やすくなると思う。
まずはセンサーなしで、3輪なら6角形、4輪なら8角形に移動し続けるプログラムを考えてみる。
■仕様
- 平行移動のスピードは一箇所で設定する
- 平行移動の向きは最初前進し、1秒毎に時計回りに向きを変える。
- 向き補正は次回以降で考える。今回は向き補正なし。
■初期化パート
移動し続けるためには、「while」の無条件ループでプログラムを動かし続ける必要がある。ループ内で利用する変数は、ループに入る前に初期化しておき、意図しない動作を防止する。
- 変数「A」:平行移動のスピードを決めるモーター制御値
- 変数「C」:平行移動の向きを指示する変数。とりあえずここでは3輪オムニで6方向を何時方向で指示する(前進:0、右前:4、右後ろ:4、…)
- 4輪オムニなら8方向を0〜7で指示してみる(前進:0、右前:1、右:2、…)
- タイマー1:平行移動の向きの切り替え用
■「 S(Sensor) センサ」パート
センサーなしなので何もしない。
■「C(Computer) コンピュータ」パート
タイマー1をチェックし、1秒ごとに変数「C」を変更する。
- タイマーを使う場合、その初期化(Start)のタイミングに気をつける。下の例の3行目の「Timer1:Start」を忘れると、プログラム開始1秒後以降でループ毎に常に2行目の「if」が成立して進行方向が変わり、意図する動作ができない。
- 進行方向は6方向を何時方向で指示する場合、0時方向の次は2時方向、次は4時方向と2づつ増え、10時の次はまた0時に戻る。変数「C」を2づつ足していき、「10」を超える値になっている場合(ここでは12を想定)には「0」を代入し直す。
- 時刻や角度のように値が循環する数値を扱う場合は「0」始まりの数値(時刻:0〜11、0〜23時・角度:0〜359度)にすると、剰余「%」を使った計算ができてプログラムがシンプルになることが多い。「剰余」は「あまり」を返す演算子で、上の図の「if C>10」〜「end if」の3行は
と置き換えることもできる。置き換えてあれば進行方向を逆回転にする場合「C = C + 2」を「C = C + 10」に直すだけで済む(if文のままで逆回転に直する方法も考えてみてほしい)。
■「A(Actuator) アクチュエータ」パート
コンピュータパートで計算した変数「C」によって移動方向を切り替える。
(途中省略)
- 3輪オムニの6方向なら、「if」「else if」で6方位の動きを指定する。
- プログラムのバグなどにより意図しない向きが指示される可能性も考慮して「else」であり得ない場合の対応をする。
- 人間、誰しもミスはするし、機械も故障することもあり、何らかの不具合があった場合に暴走等しないようプログラムしておく。
(続く)