以前に購入した R1350N ですが・・・
サンプルプログラムが動作することを確認して、それ以降放置していました。
先日、「ハイテク、ロ-テク」の記事を書いた後に・・・
そういえば、M&Yも高価なジャイロセンサーを使っていたなぁ
というのを思い出して、その技術を安価に実現できないか研究をしてみようと考えました。
まず・・・M&Yのロボットに搭載していたジャイロセンサーは CruizCore® XG1300L というものです。発売当時は、結構話題になりました。日本でも普通に買えていたのですが・・・いつのまにか簡単には購入できなくなったようです。正確には購入できなくなったわけではなく「簡単に購入ができない」です。
XG1300L は MICROINFINITY という会社(韓国の会社!?)の製品ですが、日本支社をクローズしてしまったのが原因のようです。
で、今、普通に買うとしたら、本社(韓国!?)から個人輸入するしかなさそうです。
CruizCore® XG1300L

ここで購入すると、価格85USD+送料25USDで合計110USDなのですが・・・
今は円安なので、結構な値段ですよね。(以前は 9,000円位で購入したような記憶が・・・)
で・・・その XG1300L の中身と思われるモジュールも売られています。
それが、R1350Nです。
CruizCore® R1350N

X1300Lに比べて、こちらの方が安いと思うのですが・・・価格は 170USD もします。
しかし・・・何故か・・・この R1350N は、スイッチサイエンスで 3,394円 で販売されています。
この価格のからくりが、良く分かりません。
でも、とにかく、私たちはスイッチサイエンスで購入しました。
ここまでで、長い前置きが終了です。(苦笑)
これまで、スイッチサイエンスのHPにあった(リンクされていた)記事のサンプルプログラムを動作させて「動いた、動いた」と満足していたのですが・・・そろそろ、ちゃんと動作を理解しようと重い腰を上げました。
R1350NとArduinoはシリアル通信で接続します。
接続は簡単で、R1350Nには、VCCとGND、そして TX を Arduino の RX0 に接続します。
つまり、電源とGND以外には、配線は1本だけです。
ただし、この1本が曲者で、この線(RX0に接続した線)を外さないと、Arduinoへの書き込みができません。
ですから、Arduinoへの書き込みの度に、RX0への配線を外します。(面倒くさい・・・です)
R1350Nは 115200bps のシリアル通信をします。
一組のデータは15バイトです。
1-2: 信号の始まり 0x00AA
3: インデックス
4-5: 角度(0.01度単位で100倍した値)
6-7: 角速度(0.01度/秒単位で100倍した値)
8-9: x軸加速度(1mg単位)
10-11: y軸加速度(1mg単位)
12-13: z軸加速度(1mg単位)
14: 予約
15: チェックサム(3-14バイトのデータの合計の下位バイト)
となります。
サンプルプログラムを解析(するほどでもないけど)した結果・・・
・シリアル通信で、データの受信を待ち
・最初の2バイトが 0xaa,0x00 であることを確認して
・残りの13バイトを取り込む
・最後にチェックサムを確認して取り込んだ13バイトが正しい場合に、LCDに値を表示する
単純に書くとこのような動きですね。
これを、自分なりに整理して簡略化したのが、以下のプログラムです。
#include < LiquidCrystal.h >
byte buffer[15];
LiquidCrystal lcd(6,7,8,9,10,11,12);
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
}
void loop() {
byte data;
int sum,i;
static int state = 0;
static int index = 0;
while(Serial.available() == 0);
data = Serial.read();
if(state == 0) {
if(data == 0xaa)
state++;
}
else if(state == 1) {
if (data == 0x00)
state++;
else {
state = 0;
index = 0;
}
}
else {
buffer[index++] = data;
if (index >= 13) {
sum = 0;
for (i = 0; i < 11; i++)
sum += buffer[i];
if ((sum & 0xff) == buffer[12]) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("A:");
lcd.print((buffer[2] << 8) | buffer[1],DEC);
delay(100);
Serial.flush();
}
state = 0;
index = 0;
}
}
}
これで、角度(×100の値)がLCDに表示されます。
ただし、上に書いたように、Arduinoへの書き込みの時には RX0 の配線を外して、書き込みが終わったら RX0 を接続します。その後に R1350N の電源を入れなおすと、やっと正しく動作します。
で、実際に動作しているところを見てみると・・・このセンサーは優秀ですよね。
普通のジャイロセンサーなら、見ていると少しづつ値がズレていきます。(ドリフトと言うのでしたっけ!?)
でも、R1350Nは、時間が経過しても、ほとんどズレません。