s技研

千葉から発進!!車両型ロボット開発 -> ロボトレース 

MPU-9250のI2C接続実験

更新が遅れました。

下記センサをストロベリーリナックスから購入。

MPU-9250 9軸センサモジュール(3軸加速度+3軸ジャイロ+3軸コンパス)

MPU-9250

ちっさいぞ。

まあ,MPU-6500で考えていましたが,手っ取り早く評価したかったので選択。
データシートを見てみるとMPU-6500と性能とレジスタアドレスも同じなんですね。

評価してみました。
MPU9250_test

結果は以下のとおり。
MPU-9250

水平机上で静止時の測定データは以下のとおり。

ACCEL_XOUT_H 0x00
ACCEL_XOUT_L 0x04 (+0.000244g)
ACCEL_YOUT_H 0xFE
ACCEL_YOUT_L 0x90 (-0.0224g)
ACCEL_ZOUT_H 0x3F
ACCEL_ZOUT_L 0x18 (+0.986g)
TEMP_OUT_H 0x06
TEMP_OUT_L 0x70
GYRO_XOUT_H 0xFF
GYRO_XOUT_L 0x32 (-1.57deg/s)
GYRO_YOUT_H 0xFF
GYRO_YOUT_L 0x71 (-1.09deg/s)
GYRO_ZOUT_H 0x00
GYRO_ZOUT_L 0x1A (+0.198deg/s)

ちなみに,TEMPについては,
TEMP_degC= ((TEMP_OUT – RoomTemp_Offset)/Temp_Sensitivity) + 21degC
とあるので,
TEMP_OUT=1684
Room Temp Offset=0
Temp_Sensitivity=333.87
よって,
TEMP_degC=25.9
まあ,そんなものか。

センサを動かしてみると,各軸ともに妥当な動きをしている。

14バイト読み込みで,約417.4us。
ふむふむ。
スポンサーサイト
  1. 2015/04/05(日) 23:26:24|
  2. マイコン
  3. | トラックバック:0
  4. | コメント:0

ジャイロセンサL3GD20のI2C接続実験④(複数バイト転送)

3軸ジャイロの各軸の値を取得してみる。

複数バイトの読み込み手順は以下のとおり。

L3GD20_read_multiple_bytes


各軸の角速度の値は2バイトであり,以下で示すレジスタに格納されている。
L3GD20_Register_address_map

ふむふむ。
SAD+Rを0x28として6バイト読めばよいわけね。

しかし,手順通りにやってみたがうまくいかない。
ハマった・・・・・。

データシートをよく見てみると。

----------
In order to read multiple bytes, it is necessary to assert the most significant bit of the subaddress field. In other words, SUB(7) must be equal to ‘1’ while SUB(6-0) represents the address of the first register to be read.
----------

そうですか。
複数バイト読むには,最初のレジスタアドレスの最上位ビットを1とするのね。
SAD+Rを0xa8としてみたらうまくいった。

3axis

静止時ですが結果として,以下のようになった。
感度はデフォルトなので,250deg/sです。

X:0xff33   (-205)10
Y:0x0065  (+101)10
Z:0x0063  (+99)10

センサを動かしてみると,各軸ともに妥当な動きをしている。

一連の確認で,I2Cの感触をかつかめた。
SPIと比較して,クロック周波数の上限が400kHzなので,転送速度の面でやや厳しいか。
6バイト読み込みで,約233us。

明日あたりに,本命が届く予定。
  1. 2015/03/30(月) 22:34:03|
  2. マイコン
  3. | トラックバック:0
  4. | コメント:0

ジャイロセンサL3GD20のI2C接続実験③(データ転送時間)

L3GD20のレジスタ値をI2Cで1バイト読込する場合,以下の手順で行う。

20150327_L3GD20_read_onebyte

スレーブアドレスは,L3GD20のSA0をGNDとしているため,1101010xである。
xはwriteで0,readで1である。

レジスタWHO_AM_I(アドレス:0x0f)を呼び出して,0xd4が読めればOK。
    SAD+W:0xd4
    SUB(レジスタアドレス):0x0f
    SAD+R:0xd5
として,
    DATA:0xd4
となればよい。

オシロスコープ観測結果は以下のとおり。

20150327_I2C_Who_am_I

動作はしている。
応答までに実測で102.8us。

ロボットの制御周期1msに対して,I2Cだと1バイト取得で10%持っていかれるわけです。
実際は2バイトで1軸の角速度を表現していることと,複数バイトを読み込みできるようなので,
2バイトで約130usですかね。

次回は,xyz3軸分(6バイト)読み込んでみます。
  1. 2015/03/27(金) 23:02:15|
  2. マイコン
  3. | トラックバック:0
  4. | コメント:0

ジャイロセンサL3GD20のI2C接続実験②(転送速度検討)

前回の,転送速度が設定より遅いことについて検討しました。
前述の転送速度の式から,I2Cモジュール内にSCLのHとLを検出する回路が内蔵されていると睨み,ハードウェアマニュアルを覗いてみる。

ありました。

20150322_RIICブロック図

SCLがフィードバックされて,各種レジスタや制御回路に転送されていますね。
改めて,ブロック図を見るとなるほどねー。
また,RX62Tのハードウェアマニュアルから

----------
24.4 SCL 同期回路
RIIC のSCL クロック生成はSCL ラインの立ち上がりを検出すると、ICBRH レジスタで設定されたHigh幅のカウントを開始し、High 幅のカウントが終了するとSCL ラインをLow にドライブして立ち下げます。またSCL ラインの立ち下がりを検出すると、ICBRL レジスタで設定されたLow 幅のカウントを開始し、Low 幅のカウントが終了するとSCL ラインのLow ドライブを終了してSCL ラインを開放します。これによりSCL クロックを生成します。
----------

とあるため,RIIC内部で立ち上がり立ち下がりを検知していることが判明。
それだから遅れるのね。
L3GD20のデータシートを見る限り,HとLの時間は切り詰められない。
立ち上がり,立ち下がり遅延がボトルネックである。
解決案としては,プルアップ抵抗の値を下げるかバスバッファでドライブ能力を上げるかということであが,消費電流および回路規模増大は避けたいので,検討は終了です。

次は,データ転送時間の見積もりです。

  1. 2015/03/22(日) 16:11:20|
  2. マイコン
  3. | トラックバック:0
  4. | コメント:0

ジャイロセンサL3GD20のI2C接続実験①(転送速度設定)

最近,ジャイロセンサといったらI2CまたはSPIのものが多い。
ということで,秋月のL3GD20の動作実験を試みる。
(マイクロマウス関係で同時期に同様な検討を行っている方もいますね。)

開発したロボトレーサは,マイコンとmicroSDカード間をSPIで通信しており,
処理の関係で他のデバイスを追加接続することが難しい。
I2Cで接続するしかない。
マシンで使用しているマイコンはRX62Tだが,以前開発したRX621評価ボードで実験する。

転送速度の最大値は400kbpsなので上限で設定してみる。

乗っているマイコンボードは秋月のものなので,クロック周波数は96MHz(12MHz,8逓倍)である。
RX621のデータシートを見てみる。

転送速度= 1 / { [(ICBRH+1)+(ICBRL+1)] / IICφ + SCLライン立ち上がり時間[tr] +SCLライン立ち下がり時間[tf]}

ICBRHとICBRLを決定すればよいので,下記パラメータで計算する。

IICφ:12MHz
SCLライン立ち上がり時間[tr]:300ns(データシートより)
SCLライン立ち下がり時間[tf]:300ns(データシートより)
転送速度:400kbps

ICBRH + ICBRL = 20.8
なので,

ICBRH:6
ICBRL:15
とした。

20150320_I2C_SCL


SCL実測約360kHzとなった。
むむむ,10%の誤差である。
バスラインの容量とプルアップ抵抗4.7kの関係でSCLがなまっているのか?
  1. 2015/03/20(金) 00:10:54|
  2. マイコン
  3. | トラックバック:0
  4. | コメント:0
次のページ