アストロボーイへの道        astro1

6.3軸ジャイロセンサ

 アストロ1号が動作している時の姿勢を検出する目的で3軸ジャイロセンサを導入する。現在はモータ駆動時間で調整している方向変更時の角 度や、走行距離の算出も可能になると考えた。使用する3軸ジャイロセンサとしては、当方、全く使用経験がないため、ネット上で実施例がある秋月電子の「STマイクロL3GD20使用 3軸ジャイロセンサーモジュール」(以下、ジャイロセンサ・モジュールと略す。)(単価:750円)とした。  説明書  使用半導体資料      


(1)ジャイロセンサ・モジュールの外観

 図1にジャイロセンサ・モジュールの外観図を示す。
 特徴としては
        ・8ピンDIP
        ・電源は3.3 V、消費電流 6.1 mA
        ・インタフェースはI2C (inter-IC bus)またはSPI (Serial Peripheral Interface) の何れかを選択できる。ここでは、ArduinoがライブラリでサポートしているI2Cを選ぶことにした。
        ・X、Y、Zの3軸の角速度(dps : degree per second)を16ビットデータで読み取り可能。    



    図1.ジャイロセンサ・モジュール外観



                図2.ジャイロセンサ・モジュール回路図とピン配置


(2)角度検出の仕組み


                      図3. 角速度検出の仕組み



            図4.ジャイロセンサ・モジュールのブロック図


(3)I2Cインタフェース



     図5.I2Cインタフェースのおけるマスタ・スレーブ構成


       図6.I2Cインタフェースにおけるアービトレーション



           図7.I2Cインタフェースにおけるデータ転送タイミング



         図8.I2Cインタフェースにおける基本データフォーマット



         図9.I2Cインタフェースにおける全体データフォーマット


(4)Arduinoとジャイロセンサ・モジュールの接続

    ジャイロセンサ・モジュールは電源が3.3Vであり、入出力ピンの電圧は0 - 3.3Vになっている。そのため、Arduinoとの間に電圧レベル変換用として図10及び図11に示すI2C変換モジュールを挿入する。
    その結果の全体接続回路図を図12に示す。I2Cインタフェース上はArduinoがマスタ、ジャイロセンサ・モジュールがスレーブの扱いとなる。




           図10.I2C変換モジュールの外観とピン配置



       図11.I2C変換モジュールの回路図



                  図12.全体接続 回路図


(5)LSGD20 I2Cの仕様

     ・LSGD20のスレーブとしてのアドレス(7ビット)は、SDO/SA0をGNDにしているので、最下位ビットが0となり、B1101010 の7ビットになる。
    ・CSピンをVDDに接続して、I2Cモードで動作するようにした。

    ・LSGD20の主なレジスタは表1の通り

                              表1.LSGD20の主なレジスタ
レジスタ名
意味
アドレス
読み出し値
デフォルト値
WHO_AM_I
接続確認用
0Fh
B11010100 (=D4h)
11010100
CTRL_REG1
バンド幅など設定
20h
DR1, DR0, BW1, BW0, PD, Zen, Xen, Yen
00000111
CTRL_REG4
分解能など設定
23h
BDU, BLE, FS1, FS0, - , 0, 0, SIM
00000000
OUT_X_L
X軸速度 下位8ビット
28h


OUT_X_H
X軸速度 上位8ビット 29h


OUT_Y_L
Y軸速度 下位8ビット 2Ah


OUT_Y_H
Y軸速度 上位8ビット 2Bh


OUT_Z_L
Z軸速度 下位8ビット 2Ch


OUT_Z_H
Z軸速度 上位8ビット 2Dh



      ・レジスタ WHO_AM_I は7ビットのアドレスに0を加えて、B11010100 (=B4h)がレジスタの内容になる。  
      ・CTRL_REG1のバンド幅のデフォルトは、ODR 95Hz、Cut-Off 12.5となる。
  ・CTRL_REG4の分解能のデフォルトは、測定範囲:± 250 dps、分解能:0.00865 dps/digit となる。


      ・LSGD20の特定レジスタに1バイト書き込む場合のシーケンスを図13に、特定レジスタから1バイト読み込む場合のシーケンスを図14に示す。


   ここで、ST : Start Condition、 SAD : Slave Address、 W : Write bit、 SAK : Slave Acknowledge、 SUB : register adress、 SP : Stop Condition
                    R : Read bit、 NMAK : No Master Acknowledge


              図13.特定レジスタに1バイト書き込む場合のシーケンス



                図14.特定レジスタから1バイト読み込む場合のシーケンス
    

(6)Wire.h の内容

 Arduino IDEのライブラリにI2Cに対応したWire.hがある。今回は、これを使用する。Wire.hの主なコマンドを表2に示す。
 図13、図14のシークエンスをWire.hで実行するためのコマンド順序を表2の下に記載する。

                                                                      表2.Wire.hの主なコマンド
コマンド
意味
パラメータ
戻り値
Wire.beginTransmission(address)
指定するスレーブのアドレスのI2Cに
送信開始を宣言
address:送信対象アドレス(7ビット)
なし
Wire.write(value)
指定したデータを送信。今回は
レジスタアドレスを送信
value:送信する1バイトのデータ
送信したバイト数
Wire.endTransmission()
スレーブに対する送信完了を宣言

送信結果 0: 成功
Wire.requestFrom(address, count)
他のデバイスにデータを要求
address: デバイスアドレス(7ビット)
count: バイト数
受信したバイト数
Wire.read()
データの読み取り。今回は
レジスタ内のデータ読み取り
なし
受信データ

       ・特定レジスタに1バイト書き込む場合のコマンド順序 (図13に対応)
                Wire.beginTransmission(L3GD20 address)
                Wire.write(resgister address)
                Wire.write(value)
                Wire.endTransmission()

       ・特定レジスタから1バイト読み込む場合のコマンド順序 (図14に対応)
                Wire.beginTransmission(L3GD20 address)
                Wire.write(resister address)
                Wire.endTransmission()
                Wire.requestFrom(L3GD20 address, 1)
                Wire.read()
     


(7)Arduinoプログラム

 ジャイロセンサ・モジュールの評価を目的として作成したサンプル・プログラムを図15に示す。
 また、本プログラムをアストロ1号に組み込んだ時の実行例(IDEのモニタ画面)を図16、図17に示す。
 図16ではWHO_AM_I 、CTRL_REG4 の内容は期待値通りだった。静止状態で検出された角速度は0または1dpsで問題ない。
 図17に、手動にて約2秒で90度回転させた時の結果を示す。また、図18にその時間推移をグラフ化した。プログラムで0.1秒間隔でZ軸の角速度を積分して、角度の変動量を求めたところ、88 度との結果になった。大きな差異はなく、実用レベルにあると考える。

    行#5は指定したレジスタの内容を読み出す関数。戻り値は正の整数なので、unsigned int で定義。
    行#14は指定したレジスタの内容を書き換える関数。
    行#25, 26で、レジスタ "WHO_AM_I" からデータ D4h を読み出して、接続を確認する。
    行#28, 29で、レジスタCTRL_REG4 からデータ 00h を読み出して、デフォルト値になっていることを確認する。
    行#64のzDegは、zのバイナリの値に0.00875を掛けた後、丸めて角速度を整数表示しています。そのため、精度は余り良くない。
    そのため、積分してzの速度zDegSumを求める際、zDegを積分するのではなく、zのバイナリのままで積分し、行#66で0.0085を掛けるようにした。





                                                                図15.Arduinoプログラム



                          図16.実行例(初期)



         図17.実行例(アストロ1号を約2秒間で90度回転させた時)



           図18.  実施例(図17)Z軸の角速度、角度時間推移


< Topページへ戻る >