2012年1月16日月曜日

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

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

準備する物
Arduino基板
Arduino IDE
HMC6352モジュール  1個 1,764円(税込)
http://strawberry-linux.com/catalog/items?code=12106
基板に文字が書かれた所だけ4ピンのヘッダを半田付けする。
もう一つは余る。

建築発明工作ゼミ2008
Arduino デジタルコンパス/HMC6352
http://kousaku-kousaku.blogspot.com/2008/08/arduinohmc6352.html
を参考にして
ArduinoIDEをインストールして、次にArduino基板とHMC6352モジュール
をケーブルでつなぎます。繋ぎ方を間違えないようにすること。
HMC6352モジュールは電源のプラスマイナスを間違えるとすぐに壊れる
ようです。
ArduinoIDEにスケッチをそのままコピーして貼り付けます。
シリアルモニターを使って読み取り値を出力するようです。

//------------------------------------------------
//I2C通信ライブラリを取り込む
#include

//デジタルコンパスモジュールのアドレス設定
int compassAddress = 0x42 >> 1; //=0x21
//読み込み値(角度)の変数を用意
int reading = 0;

void setup() {
//I2C通信開始
Wire.begin();
//角度表示のためのシリアル通信開始
//Serial.begin(9600);

//Continuous Modeに設定する
Wire.beginTransmission(compassAddress);
//RAM書き込み用コマンド
Wire.send('G');
//書き込み先指定
Wire.send(0x74);
//モード設定
Wire.send(0x72);
//通信終了
Wire.endTransmission();
//処理時間
delayMicroseconds(70);
}

void loop() {
//デバイスに2バイト分のデータを要求する
Wire.requestFrom(compassAddress, 2);
//要求したデータが2バイト分来たら
if(Wire.available()>1){
//1バイト分のデータの読み込み
reading = Wire.receive();
//読み込んだデータを8ビット左シフトしておく
reading = reading << 8;
//次の1バイト分のデータを読み込み
//一つ目のデータと合成(2バイト)
reading += Wire.receive();
//2バイト分のデータを10で割る
reading /= 10;
Serial.println(reading);
}
//処理のために少し待つ(20Hz)
delay(50);
}
//------------------------------------------------
アップロードしてシリアルモニターボタンを押しましたが
シリアルモニターには何も表示されません。
おかしいなとGoogleと
Serial.begin(9600) がコメントアウトされてしまって
いるので何も表示されませんとありました。
http://www.senionetworks.jp/bbs/viewtopic.php?f=7&t=92&start=0
そこでスケッチ中の
//Serial.begin(9600); 
の//を削除しました。
Serial.begin(9600);
シリアルモニターを閉じます。
もう一度アップロードしてシリアルモニターボタンを押すと
シリアルモニターに値が表示されました。
第一段階クリアです。
コンパスモジュールをぐるぐる回すと面白いように値が変わります。
シリアルモニターを閉じます。

さて、次です。コンパスモジュールの設定を保存するために
Wire.send(0x72);
//通信終了
の間に次の2行を書き加えます。
//設定保存書き込み用コマンド
Wire.send('L');
書き加えました。
Wire.send(0x72);
//設定保存書き込み用コマンド
Wire.send('L');
//通信終了
あとひとつおまじないをしておきます。
処理にどれだけ時間がかかるか判らないので
//処理時間
delayMicroseconds(70);
という2行を
//処理時間
delayMicroseconds(100);
に書き換えました。
もう一度アップロードしてシリアルモニターボタンを押すと
シリアルモニターに値が表示されました。
第二段階クリアです。
シリアルモニターを閉じます。

次に設定が保存されたかを確認するために
スケッチの
//Continuous Modeに設定する
Wire.beginTransmission(compassAddress);
//RAM書き込み用コマンド
Wire.send('G');
//書き込み先指定
Wire.send(0x74);
//モード設定
Wire.send(0x72);
//設定保存書き込み用コマンド
Wire.send('L');
//通信終了
Wire.endTransmission();
//処理時間
delayMicroseconds(100);
を削除します。

void setup() {
//I2C通信開始
Wire.begin();
//角度表示のためのシリアル通信開始
Serial.begin(9600);
}
以下省略
となります。
これをもう一度アップロードして、終わったら
いったんArduino基板をUSBから抜いてみます。
電源が切れたのでコンパスモジュールは、リセットされた
はずです。
USBにもう一度つないでシリアルモニターボタンを押すと
シリアルモニターに値が表示されました。
設定は保存されていました。
第三段階クリアです。
Arduinoでの作業はここまでです。

アドバイスがありましたので追記します。
ストロベリーリナックスの緑基板には、I2C信号線のプルアップ
抵抗が有りませんので自分で外付けします。
私は、付けなくても正しく動作しましたがいつも同じ結果になる
とは限りません。通信が出来ない場合は、プルアップ抵抗を付けてみて下さい。
Arduino基板に接続する場合は、一時的なのでブレッドボードを
使ってプルアップ抵抗を付けてみて下さい。

TJ3やe-Gadgetは、本体側で10kΩの抵抗でプルアップされています。
私は、これで十分かと思ったのですが、20㎝もケーブルを延ばすと
ノイズを拾ったりして動作が不安定になることもあるようです。
特にモーターやモータードライバー等が影響するのかな。
その時は、小さな穴あき基板を使ってI2C信号線のプルアップ抵抗を
配線します。緑基板も丸ピンICソケットに取り付けるようにしたら
いいかもしれません。
緑基板の電源に10μFの積層セラミック・コンデンサを付けるのも
良いかもしれません。
I2Cとは?(アイ・スクエアド・シー)
http://www.maroon.dti.ne.jp/koten-kairo/works/dsPIC/i2c1.html
プルアップ抵抗の決め方
http://www.picfun.com/midi2c02.html
追記終わり。

つづく
Arduinoなしでも出来る様にしたよ。4回目をみて下さい。

0 件のコメント: