秋月電子通商で適当に通販した3軸加速度センサモジュール KXSD9-2050でしたが、同封されてたマニュアルが分かりにくくて少し苦戦したので、ここに備忘録としてI2Cでの使い方を記す。
(※まぁマニュアル分かりにくいって言っても、理解してしまえば「I2Cシーケンス」って書いてあるところの図が答えで、「使用半導体(KXSD9-2050)資料」の13ページ目から図が引用されている訳ですが、同じページにある「アルファベットの略語が何を意味しているか」を示した表がマニュアルでは省略されているのが分かりにくさの元凶だと思います。)
今回は、センサモジュールとArduino Pro Mini 3.3V 8MHzを用いて、取得したデータ値をUSBシリアルでPCに送信して確認しました。
Arduinoとモジュールの接続図(図はFritzingで作成)
センサモジュール側でプルアップされているので、Arduino側でSDA、SCLのプルアップは不要です。センサモジュールとは関係ないけど、Arduino Pro Mini のI2C用端子が変なところにあってブレッドボードとかで使えない(使いにくい)。いくつかのピンが内側に配置されていることでこのサイズを実現しているのはわかるのですが・・・。
#include <Wire.h>
#define ADDR 0x18
void setup() {
Serial.begin(9600);
Wire.begin();
Serial.println("x,y,z");
}
void loop() {
getAxis();
delay(500);
}
void getAxis(){
Wire.beginTransmission(ADDR);
Wire.write(0x00);
Wire.endTransmission();
Wire.requestFrom(ADDR, 6);
int x_h = Wire.read();
int x_l = Wire.read();
int y_h = Wire.read();
int y_l = Wire.read();
int z_h = Wire.read();
int z_l = Wire.read();
int x = ( x_h << 4 ) + (x_l >> 4);
int y = ( y_h << 4 ) + (y_l >> 4);
int z = ( z_h << 4 ) + (z_l >> 4);
Serial.print(x, DEC);
Serial.print(",");
Serial.print(y, DEC);
Serial.print(",");
Serial.print(z, DEC);
Serial.print("\n");
}
作ったスケッチ。