加速度センサを使う
micro:bit V2には、STマイクロエレクトロニクス社の「LSM303」という3軸加速度センサ、3軸地磁気センサのセンサが載っています。LSM303用のArduinoライブラリを追加し、サンプル「X_NUCLEO_IKS01A2_LSM303AGR_DataLog_Terminal」を実行させてみます。
実行させ、シリアルモニタを見ると、何か数値が表示されています。しかし、micro:bitを動かしても、値は変化しません。
I2Cの場合に、必ずデバイスのアドレスが設定されています。回路図を見ると、加速度センサが「0x19」、磁気センサが「0x1E」となっています。
結果を見るとデバイスがありません。この状態では、いくらプログラムがあっていても、デバイスとの通信ができないため動作しません。
I2Cの接続されている端子が原因
回路図を見ると「I2C_INT_SCL」、「I2C_INT_SDA」と、「I2C_EXT_SCL」、「I2C_EXT_SDA」という2系統のI2Cがあることが分かりました。前者はmicro:bitに組み込まれているデバイス用、後者は外部端子に接続され、拡張用のI2Cです。
複数ある場合には、標準で使えるI2Cと、SCL、SDA端子の設定をしてから使用するI2Cの違いがあります。この端子の設定は、「Wire.begin(SDA,SCL);」のように、初期化の時に変更できるのですが、この命令ではエラーとなりました。
そこで、Arduinoのフォルダをみて、I2C関連を探しました。すると、次のファイルを見つけました。
「hardware\nRF5\0.8.0\libraries\Wire\Wire_nRF52.cpp」
このファイルとみると、
TwoWire::TwoWire(NRF_TWIM_Type * p_twim, NRF_TWIS_Type * p_twis, IRQn_Type IRQn, uint8_t pinSDA, uint8_t pinSCL)
これは、I2C(TwoWire)インターフェースを初期化するためのコンストラクタです。この命令を見ると、次のようになっており、「pinSDA」、「pinSCL」の引数を内部の変数に設定しています。
TwoWire::TwoWire(NRF_TWIM_Type * p_twim, NRF_TWIS_Type * p_twis, IRQn_Type IRQn, uint8_t pinSDA, uint8_t pinSCL)
{
this->_p_twim = p_twim;
this->_p_twis = p_twis;
this->_IRQn = IRQn;
this->_uc_pinSDA = pinSDA;
this->_uc_pinSCL = pinSCL;
transmissionBegun = false;
}
この命令で設定出来たら、I2Cの接続先を変更できるのです。しかし、このコンストラクタの他の設定が分かりません。
検索をしているときに、GoogleAIが答えを示してくれました。
TwoWire WireM(NRF_TWIM0, NULL, SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn, SDA, SCL);
これを組み込み、まずはI2Cスキャナを動作させます。変更点はコンストラクタで作成されるインスタンス名が「WireM」となっているので、プログラムの「Wire」を「WireM」に変更します。
動作させると、I2Cアドレスが表示されました。つまり、I2Cデバイスとして認識できているということです。
また、設定の通り、加速度センサが「0x19」、磁気センサが「0x1E」として接続されています。
結果を見ると、「0x70」、「0x72」のデバイスも接続されているようです。調べると、インターフェースMCU「MKL27Z256」が該当します。USBやDACなどコントローラのようです。
加速度センサが動く
このコンストラクタの変更を、サンプルプログラムに追加、変更します。この時コンストラクタの定義の前に「#include<Wire.h>」が必要です。
変更して書き込みます。
結果は、右図のシリアルモニタです。
micro:bitを動かすと、値も変化しました。
これで、加速度センサ、地磁気センサ、温度センサが使えるようになりました。




0 件のコメント:
コメントを投稿