C-STyleでコンパス活用(その2)

コンパスセンサでチェックする向きを東西南北などに相当する数値を直接記述すると、基準の向きを変えるたびにプログラムを入れ替える必要があり、実用的できない。

そこで基準の向きを変数に置き換えてみる。とりあえず、先日のプログラムの基準の向きをスタート時の向きとしてみる。プログラム開始時にその時の向きを調べて変数に代入しておく。また先日のプログラムでは北向きと東向きをチェックしていたが、「北向き→スタート時の向き(A[度])」ならば「東向き→スタート時の右手方向(A+90[度])」として表現する。

TJ3Bの内部でどのような計算がされているかが理解できれば、このような変数で方向チェックも無理がないことが分かると思う。


上のプログラムをビルドし、ビルドパス中の「User.c」をテキストエディタで開いてみる。
方向チェックに関わるのは、「get_hmc()」と「judge_hmc()」の2つの関数になる。

#include "D_Main.h"
#include "D_I2C.h"
#include "D_SIO.h"
//--------------------------------------------------------------------------------
// Program Name : NewFile-00.C
//--------------------------------------------------------------------------------
void user_main(void)
{
    gV[VAR_A] = get_hmc();
    gV[VAR_B] = gV[VAR_A] + 90;
    while (TRUE) {
          	// 前処理
        if (judge_hmc(gV[VAR_A], 10)) {
              	// だいたい正面向き
        } else if (judge_hmc(gV[VAR_B], 90)) {
              	// だいたい右向き
        } else {
              	// だいたい左向き
        }
          	// 後処理
    }
}
//--------------------------------------------------------------------------------

ビルドパス中のファイルから、「get_hmc()」と「judge_hmc()」の定義されているファイルを探すと、D_I2C.cに

UINT get_hmc(void)
{

BOOL judge_hmc(UINT deg, UINT range)
{

という関数定義が見つかる。「get_hmc()」は単純にセンサの計測値を返すだけなので、あまり見るところは無いが、「judge_hmc()」は現在の向きが指定した向きから誤差±何度の範囲内にあるかどうかを10行ほどで計算し、その結果を返すように作られており、その計算の仕組みは理解しておきたい。

ちなみに、「judge_hmc()」中で使用されている「%」(パーセント記号)の演算子は、剰余(割り算で,割り切れずに残った余り部分)を返す演算子であり、C-Styleでも使用できる。


指定フォルダ(サブフォルダも含む)に存在する複数のファイルから、指定の文字列を含むファイルを抽出するには次のようなツールを使う。