樫原 輝 さんが書きました:次に、問題のLSM303DLHを使おうとしました。
同じく、山口さんが作成したライブラリーを使用しました。
サンプルプログラムに「INT1」や「INT2」があるのですが、このピンの配線はいるのでしょうか?
また、サンプルプログラムにはピンがPWMOUTにも接続されており、I2Cには2本しか配線されていなかったのですが、加速度、地磁気は一つのSDA,SCLで通信して大丈夫なのでしょうか?
まず、ライブラリのヘッダーファイル(LSM303DLH.h)を見てください。
http://mbed.org/users/yamaguch/code/LSM ... ource.html自分用なので、API ドキュメント用のコメントはサボっています。
コンストラクタは
LSM303DLH(PinName sda = p9, PinName scl = p10, PinName int1 = NC, PinName int2 = NC);
です。引数には4つのピンの名前を sda, scl, int1, int2 の順番に指定するようにしています。
省略すると sda = p9, scl = p10 が指定したことになります。
また、int1, int2 は機能を使わないときには省略します。(あとで説明します)
次の2つの関数はセンサーが動作するときのパラメタを設定するためのものです。
どのくらいの頻度で測定するのか、あるいは測定する範囲はどれくらいかなどを設定します。
設定する値は、ヘッダファイル内の上の方に enum で定義してあります。
詳細については、マニュアルを読んでください。
bool setOutputDataRate(ACC_ODR acc_odr, MAG_ODR mag_odr);
bool setMeasurementRange(ACC_RANGE acc_range, MAG_RANGE mag_range);
次の read() は、加速度と方位のデータを読むための関数です。
読んだ値は内部に記録され、getHeading() で使われます。
read(float *ax, float *ay, float *az, float *mx, float *my, float *mz)
は、実際に読み取ったデータを受け取る場合に使います。
加速度ベクトルを (accelx, accely, accelz), 方位ベクトルを (magx, magy, magz)に受け取りたいときには、これらの変数を float 型で宣言しておき
- コード: 全て選択
read(&accelx, &accely, &accelz, &magx, &magy, &magz);
のように呼び出します。
getHeading()は、どの方角を向いているかを角度で返します。0 だと北,90 だと東、180 は南という感じです。
(多分あっていると思いますが、ひょっとすると逆回りかもしれません)
getHeading(x, y, z) は (x, y, z) の方向を基準にして、現在の方向がどれだけ(何度)ずれているかを返します。
attach() は、割り込みの動作を指定するための関数です。
予め、しきい値を決めておいて、その範囲に入ると何かの処理をしたいような場合に指定します。
分かりやすいのは自由落下の状態を検知するような例です。
Example のプログラムでは INT1, INT2 を使っています。割り込みの条件を満たすと INT1 detected のようなメッセージがターミナルに表示されます。条件を指定するパラメタはマニュアルの 35〜37ページあたりに書いてありますが、
例の最初の
lsm.attach(INT1, 0x95, 31, 3, int1Detected);
では INT1 割り込みの条件として 0x95 = 10010101 で、最初の2ビットが AND 条件、のこりの 010101 がX, Y, Z 軸の低い方のしきい値を使うという意味です。31 はしきい値の値、その後の 3 は持続時間です(多分ミリ秒)で合わせると3軸全ての加速度が 31 より小さくなった状態が 3ミリ秒続いたら INT1 割り込みの信号を線を HIGH にして、int1Detected() を呼び出しなさいというような設定をしています。「自由落下の検出」ですね。もう一つの方は AND 条件でどれか軸の加速度が 127 を超えたらINT2割り込み状態にして int2Detected() を呼び出すような設定です。
強く振るとか放り投げるとかしてみると分かると思います。
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00260288.pdfLSM303DLHの仕様書を見ると、ピンの役割として11ピンが加速度センサSDA、10ピンが加速度センサSCL、9ピンが地磁気センサSDA、8ピンが地磁気センサSCLとなっています。
しかし、サンプルプログラムですと、mbedのピンの指定が、I2CがSDA,SCLが1つずつ、PWMOUTが2つのピンに接続されているだけで、I2CのSDA,SCLが1ピンずつ足りないように思うのですが、どうなのでしょうか?
また、lsm.getHeading()とlsm.attachの役割が分からないです。
加速度センサと地磁気センサではI2C のアドレスが異なっています。ですから、SDA, SCL は一組でいいのです。その後の2本は INT1 と INT2 用のピンです。
PwmOut に使っているわけではありません。
山口