ebayで購入したPro Micro にデジタルコンパス・加速度センサ「LSM303DLH」を接続し、デジタルコンパス・加速度を入力プログラムを作成しました。LSM303DLHは、スイッチサイエンスや秋月電子などが販売されていますが、今回はebeyから購入しました。次に、購入したデジタルコンパス・加速度センサ「LSM303DLH」を示します。

Pro Microとデジタルコンパス・加速度センサ「LSM303DLH」の接続

Pro Microとデジタルコンパス・加速度センサ「LSM303DLH」間は、I2Cインタフェースで接続します。次のように各ピンを接続します。左側のピン番号がLSM303DLHで右側のピン番号がPro Microです。

  • VCC(3~5V) -> VCC
  • GND -> GND
  • SDA -> D2
  • SCL -> D3
  • SDA,SCLを10kΩでプルアップ

Arduinoの標準では信号線はプルアップは行われていますが、ProMicroのI2Cの信号線はプルアップされていません。

Pro MicroによるOLEDディスプレイ への表示」で作成したi2c_scanner1によりI2 Cのアドレスを確認します。

I2C Scanner
     0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
00: xx xx xx xx xx xx xx xx -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- 1E --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- xx xx xx xx xx xx xx xx

I2Cアドレスは、「0x18」が加速度センサー、「0x1e 」がデジタルコンパスになっていました。

LSM303DLHによるデジタルコンパス・加速度プログラムの作成

LSM303DLHによるデジタルコンパス・加速度プログラムを次に示します。LSM303DLHのライブラリは「Arduino library for Pololu LSM303 boards」で提供されていますが、今回はArduinoのI2Cライブラリ「Wire」を使って、LSM303DLHのレジスタに設定していきます。

  • 50行目から55行目で加速度加速度センサーからのデータを取得します。データは12ビット長でリトルエンディアンで設定されています。
  • 61行目から66行目でデジタルコンパスからのデータを取得します。データは16ビット長でビッグエンディアンで設定されています。z軸のデータは、y軸のデータの前に取得します

Serial.ino

#include <Wire.h>

#define SDA  4
#define SCL  5

int  compass_a_x, compass_a_y, compass_a_z;
int  compass_m_x, compass_m_y, compass_m_z;

char report[80];

void setup()
{
  Serial.begin(9600);
  while ( !Serial ) {
  }

  Wire.begin();
  compass_init();
}

void loop()
{
  compass_read();

  snprintf(report, sizeof(report), "A: %6d %6d %6d    M: %6d %6d %6d",
           compass_a_x, compass_a_y, compass_a_z,
           compass_m_x, compass_m_y, compass_m_z);
  Serial.println(report);

  delay(1000);
}

void  compass_init() {
  Wire.beginTransmission(0x18);
  Wire.write(0x20);
  Wire.write(0x27);
  Wire.endTransmission();

  Wire.beginTransmission(0x1E);
  Wire.write(0x02);
  Wire.write(0x00);
  Wire.endTransmission();
}

void  compass_read() {
  Wire.beginTransmission(0x18);
  Wire.write(0x28 | 0x80);
  Wire.endTransmission();
  Wire.requestFrom(0x18, 6);
  byte b = Wire.read();
  compass_a_x = (int16_t)(Wire.read() << 8 | b);
  b = Wire.read();
  compass_a_y = (int16_t)(Wire.read() << 8 | b);
  b = Wire.read();
  compass_a_z = (int16_t)(Wire.read() << 8 | b);

  Wire.beginTransmission(0x1e);
  Wire.write(0x03);
  Wire.endTransmission();
  Wire.requestFrom(0x1e, 6);
  b = Wire.read();
  compass_m_x = (int16_t)(b << 8 | Wire.read());
  b = Wire.read();
  compass_m_z = (int16_t)(b << 8 | Wire.read());
  b = Wire.read();
  compass_m_y = (int16_t)(b << 8 | Wire.read());

}

LSM303DLHによるデジタルコンパス・加速度プログラムの実行

作成したデジタルコンパス・加速度プログラム「Serial.ino」をPro Microに書き込み、実行すると、パソコン上で実行しているTeratermには、次のような加速度センサX/Y/Z、デジタルコンパスX/Y/Zの値(計6軸)のデータが表示されます。

A:   -304    128     -1    M:     -1     -1     -1
A:   -464    128  16448    M:   -119    -35   -405
A:   -400    160  16400    M:   -114    -32   -404
A:   -352    224  16416    M:   -113    -29   -397
A:   -384    144  16400    M:   -115    -39   -399
A:   -384    192  16400    M:   -116    -33   -399
A:   -400    176  16448    M:   -115    -40   -399
A:   -352    128  16448    M:   -117    -27   -396
A:   -384    208  16448    M:   -114    -33   -404
A:   -352    128  16384    M:   -117    -35   -400
A:   -400    192  16448    M:   -120    -30   -399
A:   -288    192  16336    M:   -112    -30   -388
A:   -384    160  16480    M:   -121    -35   -398
A:   -400    128  16368    M:   -114    -40   -400
A:   -400    240  16304    M:   -139    -29   -393
A:   -432     48  16336    M:   -180    -29   -374
A:   -352     80  16464    M:   -199    -26   -361
A:   -400    208  16464    M:   -210    -29   -350
A:   -496    128  16448    M:   -229    -31   -339
A:   -384    160  16464    M:   -253    -26   -318
A:   -336    288  16464    M:   -255    -32   -323