2012年1月16日月曜日

e-GadgetやTJ3で方位センサーHMC6352を使う方法3

e-GadgetやTJ3で方位センサーHMC6352を使う方法3

TeamReverseの徒然さんのところに
http://teamreverse.blog3.fc2.com/blog-entry-79.html
e-GadgetやTJ3でHMC6352を使う方法が書かれています。
C-StyleのD_I2C.cのget_dir関数の中身を少々書き換えると書いてあります。
購入したので試してみます。

用意するもの
e-GadgetやTJ3
C-Style(最新のC-Styleをご用意下さい。)
HMC6352モジュール  1個 1,764円(税込)(前回の設定保存したもの)
http://strawberry-linux.com/catalog/items?code=12106
基板に文字が書かれた所だけ4ピンのヘッダを半田付けする。もう一つは余る。

D_I2C.cという名のファイルの中にコンパスセンサーからデータを取ってくる
プログラムが書かれているのでこのファイルの中身をHMC6352用に書き換えます。
書き換えは、自己責任で。
Daisen>C-Styleなんとか>EG-Core>V3.09みたいなフォルダとか
Daisen>C-Styleなんとか>TJ3>V3.09みたいなフォルダとかから
D_I2C.cという名のファイルを捜します。
まずD_I2C.cという名のファイルをどこかにコピーしておきます。
ファイルのバックアップを取っておいて間違えてもすぐに戻せるようにします。
ファイルをメモ帳で開きます。
get_dirと書かれている場所を探します。
e-Gadget用のC-StyleにもTJ3用のC-Styleにも全く同じ記述がありました。

//------------------------------------------------------------------------------
// dno:0(dir), 1(pitch), 2(roll)
UINT get_dir(BYTE dno)
{
U_UINT d;
BYTE adrs = DIR_ADRS;
BYTE n = 0;

d.W = 999;
gI2C_Buf[n++] = 0x20 + dno * 2; // Register 0x20:AZIMUTH(MSB-LSB), 0x22:PITCH(MSB-LSB), 0x24:ROLL(MSB-LSB)
if (i2c_send(adrs, n) == false) return(d.W);
if (i2c_recv(adrs, 2) == false) return(d.W);
n = 0;
d.H = gI2C_Buf[n++];
d.L = gI2C_Buf[n++];
if (0 < dno){
d.W += 90;
}
return(d.W);
}
//------------------------------------------------------------------------------
ホームページを参考にD_I2C.cという名のファイルの該当する部分を書き換えました。

//------------------------------------------------------------------------------
// dno:0(dir), 1(pitch), 2(roll)
UINT get_dir(BYTE dno)
{
U_UINT d;
BYTE adrs = 0x42; // HMC6352のI2Cアドレス(デフォルト)は0x42
BYTE n = 0;

d.W = 999;
if (i2c_recv(adrs, 2) == false) return(d.W);
n = 0;
d.H = gI2C_Buf[n++];
d.L = gI2C_Buf[n++];
if (0 < dno){
d.W += 90;
}
d.W /= 10; // HMC6352は,0~3600(0.1度単位)で送ってくるので,10で割って360度にする
return(d.W);
}
//------------------------------------------------------------------------------

上書き保存をしてメモ帳を閉じます。
これでe-GadgetやTJ3のC-Styleで方位センサーHMC6352(前回の設定保存したもの)を
使える様になりました。
C-Styleをバージョンアップすると消えるので、また探し出して書き換えて下さい。
バックアップを取るのを忘れずに。

ストロベリー・リナックスの緑のコンパスモジュールも
スパークファンの赤のコンパスモジュールも電源や信号線の繋ぎ方の並びが独自のもので
それぞれ違っています。間違えないようにe-GadgetやTJ3の本体の記述と
コンパスモジュールの記述を何度も確認して同じ名前のものを結線して下さい。
e-Gadgetのコネクタとハーネスが抜き差しが楽で便利です。
出来るだけ高いところに付けた方が良いとのことなので伸ばせるように20㎝以上の
ハーネスが良いでしょう。
どのように固定するかと底面に防磁が必要か等々各自腕の見せ所ですね。
思った以上に感度良好です。
C-Styleのセンサーモニタでも使えます。
サンプルプログラムの中にコンパスモジュール用もあったので読み込んで
ビルドしてダウンロードしてみました。動きます。
後はこれを活かすプログラムを各自作るだけです。
センサーがひとつ増えるごとにやるべき事は、倍になります。
みんな、がんばれ。

おわりと思ったらまだつづく
Arduinoなしでも出来る様にしたよ。4回目をみて下さい。

2 件のコメント:

Reverse父 さんのコメント...

Reverse父です。

お疲れさまでした。無事使えたようで何よりです。

半額の方も同じように使えましたか。これでコンパスセンサ付けるのを勧めやすくなりますね。
緑基板の方は,8ピン分ピンを付けた方が安定すると思います(赤基板で試合中に審判に当たって外れたことがあります)。つなぐのは4本だけなのですが。
ちなみに緑と赤の違いはI2CのSDA,SCLにプルアップ抵抗がついているかどうかだけなので,うまく通信できないときは5k~10kくらいでプルアップするといいと思います。

karabisaa さんのコメント...

ご報告に伺おうと思っていたら、先にお越しになられて、大変恐縮です。
お陰様で動作させることができました。
大変ありがとうございます。
30分程度で説明・工作・動作まで指導出来る
かと思いますので広めて行きたいと思います。本当は、コンパスセンサの動作原理や
仕組みまで教えることが理想なのですが・・・。緑基板の説明にも抵抗とコンデンサを自分で増設出来るとありますね。あんなちっこいのは自分には無理です。
ダイセンさんの最新のデジタルコンパスセンサには、別基板でノイズフィルタ基板が同梱されるようになりました。やっぱりノイズ対策は不可欠ということでしようか。
まあ、これを機に多くの子供達が次のステップに進んで行けたらいいなと思っています。
これからもよろしくお願い致します。