2019年5月5日日曜日

ジャイロ動いた MPU6500とマイコンをSPIでつなぐ

 ジャイロ動いた。 
 MPU6500の出力はデジタル方式で、シリアル通信を行ってデータを取る必要がある。
 
 I2C(IIC)方式とSPI方式どちらでも通信ができるみたいで、調べたところSPIのほうが高速で通信ができるようなのでSPIをチョイス。

 とりあえず手元にあるR8C/M12Aでの駆動を試みる。
  
 GY-6500(MPU6500搭載のモジュール)には3.3vのレギュレータがのっかっているようなので電源にはマイコンと同様に5Vをかける。
 GY-6500への入力は抵抗で分圧して5v→3.3vにしてから入力、出力はそのままマイコンにいれた。

 SPIの時は通信線が4本になる。

 GY-6500に書いてある端子の名前にならえば、

 のように接続した。NCS,SCLは基本"H"にしておく。
あとはNCSに"L"与えてSCLを"L" "H" "L" "H" とやってやれば立ち上がりエッジで読み書きが行われるとのこと。
 
 16ビット分の通信が行われ、先頭8ビットがアドレス、後ろ8ビットが読み書き。
 この図のようにパチパチやればADOからデータが返ってくる。

MPU6500のレジスタマップによれば
 アドレス0x75を打てば0x70が返ってくる。 WHO AM I という名前のレジスタでこのアドレスからは0x70以外返ってこないので、0x75から0x70が返ってこない=通信できてない といえる。

 MPU6500は電源投入直後はスリープモードらしく、0x6bに0x00を書き込めばジャイロが起きる。その後に0x1Bにジャイロの設定を書き込む。
 
 あとはレジスタマップを見ながらジャイロのデータを取得するだけ、符号あり16bitなので注意。
 この前使ったMini-Zのジャイロよりしっかりした値が出る。フリフリしても積分の値は0近くに戻ってくるのでマイコンカーの起動時間を考えれば出力の値をそのまま積分しても問題なさそうだと感じた。





1 件のコメント:

  1. M12AでのSPI通信、興味深く拝見しました。
    (1) M12Aを3.3Vで動作させれば、GY-6500に「電圧変換なし」で入力できることになりますか?
    (2) 全ソースプログラムを見せていただくことはできますか?
    よろしくお願いします。

    返信削除