[Arduinoのすすめ][ArduinoConf][ArduinoMonitor][iArduino]

ST micro のデジタル3軸ジャイロ L3GD20 を使う(I2C接続)

L3GD20 は ST mirco 製のデジタル3軸ジャイロセンサICです。 表面実装タイプではんだ付けしにくいのですが、DIP変換モジュールを 秋月電子ストロベリーリナックスが販売しています。 電源電圧範囲は 2.4[V]〜3.6[V]ですので、3.3[V]動作のArduinoに 直接つないで使うことが出来ます。 I2CもしくはSPIバスで使います。

ここではストロベリーリナックス製のモジュールをI2Cで接続していますが、秋月電子のものでも同様に使えるはずです。 次のように配線しています。

ピン番号名称Arduinoのピン備考
1VDD3.3[V] (3V3) 
2VDD_IO3.3[V] (3V3) 
3SCLSCL (A5) 
4SDASDA (A4) 
5SA0GNDGNDにつなぐとアドレスがB1101010, 3.3VにつなぐとB1101011
6~CS3.3VI2C接続のときは3.3Vにつなぐ
7DRDY/INT2- 
8INT1- 
9NC- 
10GNDGND 

スケッチ

このスケッチはL3GD20の動作を簡単に確かめるものです。 読んだそのままの値と[度/秒]に変換した値をシリアルへ出力します。 実用にするには、他のレジスタの設定やモードの変更が必要な場合が多いと思います。

#include <Wire.h>

// Connect L3GD20 with SDA (A4), SCL (A5)

const byte L3GD20_ADDR = B1101010;  // SA0 = GND
//const byte L3GD20_ADDR = B1101011;// SA0 = VDD_IO

const byte L3GD20_WHOAMI = 0x0f;
const byte L3GD20_CTRL1 = 0x20;
const byte L3GD20_CTRL2 = 0x21;
const byte L3GD20_CTRL3 = 0x22;
const byte L3GD20_CTRL4 = 0x23;
const byte L3GD20_CTRL5 = 0x24;
const byte L3GD20_X_L = 0x28;
const byte L3GD20_X_H = 0x29;
const byte L3GD20_Y_L = 0x2A;
const byte L3GD20_Y_H = 0x2B;
const byte L3GD20_Z_L = 0x2C;
const byte L3GD20_Z_H = 0x2D;

void L3GD20_write(byte reg, byte val)
{
  Wire.beginTransmission(L3GD20_ADDR);
  Wire.write(reg);
  Wire.write(val);
  Wire.endTransmission();  
}

byte L3GD20_read(byte reg)
{
  byte ret = 0;
  // request the registor
  Wire.beginTransmission(L3GD20_ADDR);
  Wire.write(reg);
  Wire.endTransmission();  

  // read
  Wire.requestFrom((unsigned int)L3GD20_ADDR, 1);
  
  while (Wire.available()) {
    ret = Wire.read();
  }
  
  return ret;
}

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

  Wire.begin();

  Serial.println(L3GD20_read(L3GD20_WHOAMI), HEX); // should show D4

  L3GD20_write(L3GD20_CTRL1, B00001111);
                         //   |||||||+ X axis enable
                         //   ||||||+- Y axis enable
                         //   |||||+-- Z axis enable
                         //   ||||+--- PD: 0: power down, 1: active
                         //   ||++---- BW1-BW0: cut off 12.5[Hz]
                         //   ++------ DR1-DR0: ODR 95[HZ]
}

void loop() {
  short X, Y, Z;
  float x, y, z;

  X = L3GD20_read(L3GD20_X_H);
  x = X = (X << 8) | L3GD20_read(L3GD20_X_L);
  Y = L3GD20_read(L3GD20_Y_H);
  y = Y = (Y << 8) | L3GD20_read(L3GD20_Y_L);
  Z = L3GD20_read(L3GD20_Z_H);
  z = Z = (Z << 8) | L3GD20_read(L3GD20_Z_L);
 
  x *= 0.00875; // +-250dps
  //x *= 0.0175;// +-500dps
  //x *= 0.07;  // +-2000dps
  y *= 0.00875; // +-250dps
  z *= 0.00875; // +-250dps
 
  Serial.print(X);    // X axis (reading)
  Serial.print("\t");
  Serial.print(Y);    // Y axis (reading)
  Serial.print("\t");
  Serial.print(Z);    // Z axis (reading)
  Serial.print("\t");
  Serial.print(x);    // X axis (deg/sec)
  Serial.print("\t");
  Serial.print(y);    // Y axis (deg/sec)
  Serial.print("\t");
  Serial.println(z);  // Z axis (deg/sec)

  delay(10);
}

ダウンロード

上記のスケッチです


Arduinoのすすめ
Copyright (c) 2013, Noriaki Mitsunaga