L3GD20 は ST mirco 製のデジタル3軸ジャイロセンサICです。 表面実装タイプではんだ付けしにくいのですが、DIP変換モジュールを 秋月電子と ストロベリーリナックスが販売しています。 電源電圧範囲は 2.4[V]〜3.6[V]ですので、3.3[V]動作のArduinoに 直接つないで使うことが出来ます。 I2CもしくはSPIバスで使います。
ここではストロベリーリナックス製のモジュールをI2Cで接続していますが、秋月電子のものでも同様に使えるはずです。 次のように配線しています。
ピン番号 | 名称 | Arduinoのピン | 備考 |
1 | VDD | 3.3[V] (3V3) | |
2 | VDD_IO | 3.3[V] (3V3) | |
3 | SCL | SCL (A5) | |
4 | SDA | SDA (A4) | |
5 | SA0 | GND | GNDにつなぐとアドレスがB1101010, 3.3VにつなぐとB1101011 |
6 | ~CS | 3.3V | I2C接続のときは3.3Vにつなぐ |
7 | DRDY/INT2 | - | |
8 | INT1 | - | |
9 | NC | - | |
10 | GND | GND |
このスケッチは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); }
上記のスケッチです