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

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

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

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

ピン番号名称Arduinoのピン備考
1VDD3.3[V] (3V3) 
2VDD_IO3.3[V] (3V3) 
3CLKSCK (D13) 
4SDIMOSI (D11) 
5SDOMISO (D12) 
6~CSSS (D10) 
7DRDY/INT2- 
8INT1- 
9NC- 
10GNDGND 

スケッチ

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

#include <SPI.h>

const int L3GD20_CS = SS;
//const int SS = 10;      // 必ず 10 番を出力にすること
//const int MOSI = 11;
//const int MISO = 12;
//const int SCK  = 13;

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;

const byte L3GD20_RW = 0x80;
const byte L3GD20_MS = 0x40;

void L3GD20_write(byte reg, byte val)
{
  digitalWrite(L3GD20_CS, LOW);
  SPI.transfer(reg);
  SPI.transfer(val);
  digitalWrite(L3GD20_CS, HIGH);
}

byte L3GD20_read(byte reg)
{
  byte ret = 0;

  digitalWrite(L3GD20_CS, LOW);
  SPI.transfer(reg | L3GD20_RW);
  ret = SPI.transfer(0);
  digitalWrite(L3GD20_CS, HIGH);
  
  return ret;
}

void setup() {
  digitalWrite(SS, HIGH);
  pinMode(SS, OUTPUT);
  
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV8); // 8MHz/8 = 1MHz; (max 10MHz)

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

  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