2012年2月1日水曜日

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

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

用意するもの
e-GadgetやTJ3
C-Style(最新のC-Styleをご用意下さい。)
HMC6352モジュール  1個 1,764円(税込)
http://strawberry-linux.com/catalog/items?code=12106
ピンヘッダを半田付けする。
ストロベリー・リナックスの緑のコンパスモジュールも
スパークファンの赤のコンパスモジュールも電源や信号線の繋ぎ方の並びが独自のもので
それぞれ違っています。間違えないようにe-GadgetやTJ3の本体の記述とコンパスモジュールの記述を何度も確認して同じ名前のものを結線して下さい。
e-Gadgetのコネクタとハーネスが抜き差しが楽で便利です。

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);
}
//------------------------------------------------------------------------------

ファイルの該当する部分を書き換えます。
書き換えは、モード変更用と常用用の2回行います。

まずD_I2C.cという名のファイルの中身の一部を次のように書き換えます。

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

d.W = 999;

gI2C_Buf[n++] = 0x47; //"G"
if (i2c_send(adrs, n) == false) return(d.W);

gI2C_Buf[n++] = 0x74;
i2c_send(adrs, n);

gI2C_Buf[n++] = 0x72;
i2c_send(adrs, n);

gI2C_Buf[n++] = 0x4C; //"L"
i2c_send(adrs, n);

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;
return(d.W);
}
//------------------------------------------------------------------------------

D_I2C.cという名のファイルの中身の一部をHMC6352モード変更用に書き換えました。
上書き保存をしてメモ帳を閉じます。

次にC-Styleでプログラムを作ります。このプログラムは1回しか動かしません。
セットアップコマンド Dir SensorをチェックOK
ifコマンド 条件選択 方向チェックOK
LED制御コマンド Green On OK
これで5行のプログラムが出来たので
ビルド、ダウンロード。
機体のスタートボタンを押してプログラムを実行。
LEDが点いたら終わり。機体の電源スイッチを切ります。
慌てて切らなくても大丈夫です。
ここまでは、1回しか行いません。2度も3度もモード変更する必要はありません。
もちろん、機体とセンサーをケーブルで接続してからプログラムを実行します。
ここまでで、Arduinoが無くてもHMC6352のモードを変更できました。
一度モードを書き換えたらスイッチを入れれば次からはそのモードで動きます。

つぎにC-Styleの通常のプロクラムで使えるように
また、D_I2C.cという名のファイルの中身の一部をHMC6352常用用に書き換えます。

//------------------------------------------------------------------------------
// 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を使える様になりました。
セットアップコマンドでDir SensorをチェックOK、プログラムを作ってビルド、ダウンロード。
C-Styleをバージョンアップすると消えるので、また探し出して常用用に書き換えて下さい。
バックアップを取るのを忘れずに。
みんな、がんばれ。

おわり

6 件のコメント:

匿名 さんのコメント...

HMCセンサーをキャリブレーションする方法を知っていたらをしえてください

karabisaa さんのコメント...

こんにちは、はじめまして。
HMC6352のキャリブレーションは、建築発明工作ゼミ様がくわしいです。
http://kousaku-kousaku.blogspot.jp/2008/08/arduinohmc6352.html

e-GadgetやTJ3だけでHMC6352を使う方法 その5
http://xrexcele.blogspot.jp/2012/02/hmc6352.html
も合わせてご覧ください。

「HMC6352キャリブレーション」で検索するといろいろな情報が
調べられますよ。
取り付けの時に防磁することも大切のようです。
これも自分でいろいろ調べてみてくださいね。

watasi さんのコメント...

C-styleの一番最新版は前の多機能電子コンパスにかわってセットアップのチェックボックスが6Dコンパスになっていました。それでもつかえますか?

karabisaa さんのコメント...

watasi さん、こんちは。
試してはいませんが、使えると思います。
ただ、HMC6352をお使いになるのなら、もう標準でサポートされて
いますでC-Styleを改造せずに、そのままでお使いになられて
ください。他社製品の初期化の関数も用意されています。

watasi さんのコメント...

素早い返事ありがとうございました。
HMCセンサーはそのまま使えました。
ストロベリーリナックスで購入した、一円くらいの大きさの緑色のセンサーを使っていましたが、問題なく動作しました。

karabisaa さんのコメント...

貴重な情報ありがとうございます。
これで、他社製品でも安心して購入できますね。