| 1 | = R1350Nジャイロセンサで遊んでみる = |
| 2 | |
| 3 | スイッチサイエンスでは2012年の7月からマイクロインフィニティ社製のジャイロセンサR1350Nの取り扱いをはじめました。 |
| 4 | R1350Nジャイロセンサはシリアル接続なので、データを読むだけならとても簡単です。 |
| 5 | Arduinoに繋いでデータを読み込んでみました。 |
| 6 | |
| 7 | == Arduinoに接続するには == |
| 8 | このジャイロセンサは2mmピッチです。しかも、接続する部分がスルーホールを真ん中で割ったような形になっています。 |
| 9 | そのため、ブレッドボードにさしたり、Arduinoに接続したりするには、ちょっと工夫が必要です。 |
| 10 | スイッチサイエンスで実験をするときは、足を伸ばしてみたり、別のピッチ変換基板を使ってみたり、多少工夫をしました。 |
| 11 | どのようにするかはお任せしますが、ピッチを変更したり足を伸ばしたりしないと使いにくいのでご注意ください。 |
| 12 | |
| 13 | == Arduinoに繋いでデータを読み込んでみる == |
| 14 | 今回はArduino Unoを使って試してみました。 |
| 15 | データを読み込むだけなら、R1350NのVDD,GND,TxDの3つをArduino Unoの対応するピンに繋ぐだけです。 |
| 16 | * Arduinoの5VとR1350NのVDD(1番ピン)を繋ぐ。 |
| 17 | * ArduinoのGNDとR1350NのGND(2番ピン)を繋ぐ。 |
| 18 | * ArduinoのD0(RX)とR1350NのTxD(11番ピン)を繋ぐ。 |
| 19 | |
| 20 | Serialの速度は出荷時状態では115200bpsとなっています。 |
| 21 | 115200bpsだとハードウエアシリアルを使ったほうが安全なのでD0(RX)と接続しました。 |
| 22 | D0を使うとIDEに付属しているシリアルモニタが使えないので表示にはLCDを使用します。 |
| 23 | LCDの制御はArduinoの標準ライブラリLiquidCrystalを使用し、 |
| 24 | rwをGNDに接続、データ転送4bitモードで接続しました。 |
| 25 | |
| 26 | シリアルで読み込めるデータは以下の通りです。 |
| 27 | |
| 28 | {{{ |
| 29 | 1:HEADER(0xaa固定値) |
| 30 | 2:HEARER(0x00固定値) |
| 31 | 3:index(0x00〜0xffのカウンター) |
| 32 | 4:ANGLE(Low) |
| 33 | 5:ANGLE(High) |
| 34 | 6:RATE(Low) |
| 35 | 7:RATE(High) |
| 36 | 8:X-axis(Low) |
| 37 | 9:X-axis(High) |
| 38 | 10:Y-axis(Low) |
| 39 | 11:Y-axis(High) |
| 40 | 12:Z-axis(Low) |
| 41 | 13:Z-axis(High) |
| 42 | 14:Reserved(?) |
| 43 | 15:Checksum(3〜14までの値を足した8bit) |
| 44 | }}} |
| 45 | |
| 46 | |
| 47 | 以下が今回作成したスケッチです。 |
| 48 | |
| 49 | {{{ |
| 50 | #!C |
| 51 | |
| 52 | #include <LiquidCrystal.h> |
| 53 | |
| 54 | #define RS_PIN 12 |
| 55 | #define ENABLE_PIN 11 |
| 56 | #define D4_PIN 5 |
| 57 | #define D5_PIN 4 |
| 58 | #define D6_PIN 3 |
| 59 | #define D7_PIN 2 |
| 60 | |
| 61 | int state, counter; |
| 62 | byte buffer[15]; |
| 63 | LiquidCrystal lcd(RS_PIN, ENABLE_PIN, D4_PIN, D5_PIN, D6_PIN, D7_PIN); |
| 64 | |
| 65 | void setup() { |
| 66 | Serial.begin(115200); |
| 67 | lcd.begin(16, 2); |
| 68 | state = 0; |
| 69 | counter = 0; |
| 70 | } |
| 71 | |
| 72 | void loop() { |
| 73 | if (Serial.available() > 0) { |
| 74 | byte data = Serial.read(); |
| 75 | switch (state) { |
| 76 | case 0: |
| 77 | if (data == 0xaa) state++; |
| 78 | break; |
| 79 | case 1: |
| 80 | if (data == 0x00) state++; |
| 81 | else { |
| 82 | counter = 0; |
| 83 | state = 0; |
| 84 | } |
| 85 | break; |
| 86 | case 2: |
| 87 | buffer[counter++] = data; |
| 88 | if (counter >= 13) { |
| 89 | int sum = 0; |
| 90 | for (int i = 0;i < 11;i++) sum += buffer[i]; |
| 91 | if ((sum & 0xff) == buffer[12]) { |
| 92 | lcd.clear(); |
| 93 | disp5(0, 0, "A:", (buffer[2] << 8) | buffer[1]); // angle |
| 94 | disp5(0, 1, "X:", (buffer[6] << 8) | buffer[5]); // accX |
| 95 | disp5(9, 1, "Y:", (buffer[8] << 8) | buffer[7]); // accY |
| 96 | disp5(9, 0, "Z:", (buffer[10] << 8) | buffer[9]); // accZ |
| 97 | delay(100); |
| 98 | Serial.flush(); |
| 99 | } |
| 100 | state = 0; |
| 101 | counter = 0; |
| 102 | } |
| 103 | break; |
| 104 | } |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | void disp5(int posX, int posY, String str, int num) { |
| 109 | lcd.setCursor(posX, posY); |
| 110 | lcd.print(str); |
| 111 | posX += 6; |
| 112 | if (abs(num) >= 10000) posX -= 4; |
| 113 | else if (abs(num) >= 1000) posX -= 3; |
| 114 | else if (abs(num) >= 100) posX -= 2; |
| 115 | else if (abs(num) >= 10) posX--; |
| 116 | if (num < 0) posX--; |
| 117 | lcd.setCursor(posX, posY); |
| 118 | lcd.print(num, DEC); |
| 119 | } |
| 120 | |
| 121 | }}} |
| 122 | |
| 123 | == LCDモニタに表示されるパラメタ == |
| 124 | * A:Z軸に対する回転角(-18000〜18000、1周で36000) |
| 125 | * X、Y、Z:それぞれの加速度(重力加速度含む:1G=1000) |
| 126 | * 平面に置いた場合、X = 0、Y = 0、Z = 1000(Z軸が下向きに1Gかかっている為) |
| 127 | |
| 128 | == やってみて == |
| 129 | 内部補正がきちんとされている為か、机の上に置いておくと値は±1〜2しかぶれませんでした。ぜひぜひお試しください。 |