wiki:R1350N

R1350Nジャイロセンサで遊んでみる

スイッチサイエンスでは2012年の7月からマイクロインフィニティ社製のジャイロセンサR1350Nの取り扱いをはじめました。 R1350Nジャイロセンサはシリアル接続なので、データを読むだけならとても簡単です。 Arduinoに繋いでデータを読み込んでみました。

Arduinoに接続するには

このジャイロセンサは2mmピッチです。しかも、接続する部分がスルーホールを真ん中で割ったような形になっています。 そのため、ブレッドボードにさしたり、Arduinoに接続したりするには、ちょっと工夫が必要です。 スイッチサイエンスで実験をするときは、足を伸ばしてみたり、別のピッチ変換基板を使ってみたり、多少工夫をしました。 どのようにするかはお任せしますが、ピッチを変更したり足を伸ばしたりしないと使いにくいのでご注意ください。

ブレッドボードにも簡単にさせるようになる、ピッチ変換基板の販売を開始しました! R1350N用 ピッチ変換基板

Arduinoに繋いでデータを読み込んでみる

今回はArduino Unoを使って試してみました。 データを読み込むだけなら、R1350NのVDD,GND,TxDの3つをArduino Unoの対応するピンに繋ぐだけです。

  • Arduinoの5VとR1350NのVDD(1番ピン)を繋ぐ。
  • ArduinoのGNDとR1350NのGND(2番ピン)を繋ぐ。
  • ArduinoのD0(RX)とR1350NのTxD(11番ピン)を繋ぐ。

Serialの速度は出荷時状態では115200bpsとなっています。 115200bpsだとハードウエアシリアルを使ったほうが安全なのでD0(RX)と接続しました。 D0を使うとIDEに付属しているシリアルモニタが使えないので表示にはLCDを使用します。 LCDの制御はArduinoの標準ライブラリLiquidCrystalを使用し、 rwをGNDに接続、データ転送4bitモードで接続しました。

シリアルで読み込めるデータは以下の通りです。

1:HEADER(0xaa固定値)
2:HEARER(0x00固定値)
3:index(0x00〜0xffのカウンター)
4:ANGLE(Low)
5:ANGLE(High)
6:RATE(Low)
7:RATE(High)
8:X-axis(Low)
9:X-axis(High)
10:Y-axis(Low)
11:Y-axis(High)
12:Z-axis(Low)
13:Z-axis(High)
14:Reserved(?)
15:Checksum(3〜14までの値の合計の下位8bit)

以下が今回作成したスケッチです。

#include <LiquidCrystal.h>

#define RS_PIN 12
#define ENABLE_PIN 11
#define D4_PIN 5
#define D5_PIN 4
#define D6_PIN 3
#define D7_PIN 2

int state, counter;
byte buffer[15];
LiquidCrystal lcd(RS_PIN, ENABLE_PIN, D4_PIN, D5_PIN, D6_PIN, D7_PIN);

void setup() {
  Serial.begin(115200);
  lcd.begin(16, 2);
  state = 0;
  counter = 0;
}

void loop() {
  if (Serial.available() > 0) {
    byte data = Serial.read();
    switch (state) {
    case 0:
      if (data == 0xaa) {
        state++;
      }
      break;
    case 1:
      if (data == 0x00) {
        state++;
      } 
      else {
        counter = 0;
        state = 0;
      }
      break;
    case 2:
      buffer[counter++] = data;
      if (counter >= 13) {
        int sum = 0;
        for (int i = 0; i < 11; i++) sum += buffer[i];
        if ((sum & 0xff) == buffer[12]) {
          lcd.clear();
          disp5(0, 0, "A:", (buffer[2] << 8) | buffer[1]);  // angle
          disp5(0, 1, "X:", (buffer[6] << 8) | buffer[5]);  // accX
          disp5(9, 1, "Y:", (buffer[8] << 8) | buffer[7]);  // accY
          disp5(9, 0, "Z:", (buffer[10] << 8) | buffer[9]);  // accZ
          delay(100);
          Serial.flush();
        }
        state = 0;
        counter = 0;
      }
      break;
    }
  }
}

void disp5(int posX, int posY, String str, int num) {
  lcd.setCursor(posX, posY);
  lcd.print(str);
  posX += 6;
  if (abs(num) >= 10000) {
    posX -= 4;
  } 
  else if (abs(num) >= 1000) {
    posX -= 3;
  } 
  else if (abs(num) >= 100) {
    posX -= 2;
  } 
  else if (abs(num) >= 10) {
    posX--;
  }
  if (num < 0) {
    posX--;
  }
  lcd.setCursor(posX, posY);
  lcd.print(num, DEC);
}

LCDモニタに表示されるパラメタ

  • A:Z軸に対する回転角(-18000〜18000、1周で36000)
  • X、Y、Z:それぞれの加速度(重力加速度含む:1G=1000)
    • 平面に置いた場合、X = 0、Y = 0、Z = 1000(Z軸が下向きに1Gかかっている為)

やってみて

内部補正がきちんとされている為か、机の上に置いておくと値は±1〜2しかぶれませんでした。ぜひぜひお試しください。

Last modified 4 years ago Last modified on Mar 19, 2013 2:45:24 PM

Attachments (1)

Download all attachments as: .zip