2018年4月29日日曜日

Raspberry PiでMPU9250を使う方法


背景

Raspberry Piで遊ぶ会#18.04を開催しました。

その会のテーマにした、9軸センサMPU9250の使い方を共有します。

なお、ターミナルやviの操作コマンドは、こちらの記事を参考にしてください。

使ったもの

  • Rasbian(Stretch)が動く状態のRaspberry Pi
    ssh接続か、モニタ + キーボード(+ マウス)で動作させられる状況にしてください。
  • MPU9250
    9軸センサです。
  • ハンダゴテ + ハンダ
    MPU9250へのピンの取り付けに利用しました。
  • ブレッドボード + オスメスジャンパワイヤ
    Raspberry PiとMPU9250を接続するのに利用しました。

Raspberry Piとの接続

Raspberry PiはI2C通信用のピンを備えています。
I2Cとは、通信方式の一つです。
MPU9250はI2C通信で情報をやり取りできるので、Raspberry PiとMPU9250をI2C通信できるように接続します。

Raspberry Pi MPU9250
3V3VCC
GPIO02(SDA)SCA
GPIO03(SCL)SCL
GNDGND


実際に繋ぐと、このようになります。


I2Cを有効化

Raspberry PiのI2Cはデフォルトでは無効になっているので、設定を変更して有効にします。

ここではraspi-configというRaspberry Piの便利設定ツールを使った設定変更方法を説明します。
(デスクトップモードの設定画面からも、同様の変更をできます。)

下記のコマンドを入力して、raspi-configを起動します。
raspi-config


上下矢印とエンターキーを使って、Interfacing Options -> I2C -> Yes を選択します。
これによる、I2Cが有効になりました。

設定できたら、左右矢印でFinishを選択して、エンターキーを押して、raspi-configを終わります。

MPU9250がI2Cデバイスとして認識されていることを確認

Raspberry PiのI2Cを有効にしたら、MPU9250がI2Cデバイスとして見えていることを確認します。

I2Cに関するプログラムをインストールします。
sudo apt install i2c-tools

下記のコマンドで、I2Cを通して認識されているデバイスの一覧を表示します。
sudo i2cdetect -y 1

68番が存在していれば、期待通りに接続されていると判断できます。
68番が出てこなければ、Raspberry PiとMPU9250の配線が合っているか確認してください。


プログラムの準備

MPU9250の信号をPythonというプログラミング言語で読み取れるライブラリを公開してくれている方がいるので、それを利用します。

関連プログラムをインストールします。
(これらは、Raspbian Liteでなければ、デフォルトでインストールされている)
sudo apt install python-pip python-smbus

ライブラリをインストールします。
sudo pip install FaBo9Axis_MPU9250

Pythonのプログラムを作る前に、作業用ディレクトリを作成します。
mkdir ~/mpu9250_test
cd ~/mpu9250_test

プログラムを作成します。
vi scan.py

~/mpu9250_test/scan.py
import FaBo9Axis_MPU9250
import time

mpu9250 = FaBo9Axis_MPU9250.MPU9250()

while True:
  accel = mpu9250.readAccel()
  print("accel X: " + str(accel['x']))
  time.sleep(0.1)

実行します。
python scan.py

成功すれば、このようにx軸の加速度が表示されます。


プロブラムは「Ctrl + c」で止めれます。
他の機能も使いたい場合、ライブラリと一緒に公開されているサンプルプログラムが参考になると思います。

まとめ

Raspberry PiからI2C通信を通してMPU9250のデータを取得できました。

参考になれば嬉しいです。

参考

Configuring Your Pi for I2C

変更履歴

2018.05.12
記事のタイトルを「共有情報」から取り組む内容に変更しました。

6 件のコメント :

Unknown さんのコメント...

お教えください
MPU9250.pyの中のCodeの下記のものが
print "ax = ", (accel['x'])
^
SyntaxError: invalid syntax がでます。print(.......)でないといけないと思いますが
それを修正して実行すると下記のようになります。
bus.write_byte_data(self.address, PWR_MGMT_1, 0x00)
OSError: [Errno 121] Remote I/O error
全くお手上げです。python3.5の環境です。
よろしくお願いいたします。

Asuki Kono さんのコメント...

ライブラリのmain.pyにはprintは無く、example/read9axis.pyにprintがありましたが、python3に対応する記述になっているようです。
ライブラリが古い可能性があるので、下記のコマンドでライブラリを更新してみてはどうでしょう?

pip3 install -U FaBo9Axis_MPU9250

Pman1 さんのコメント...

教えてください
ラズパイliteの場合はどうすればいいのでしょうか?

Asuki Kono さんのコメント...

具体的のどの手順で詰まっていますか?
「このコマンドを実行するとこうなる」などの情報があれば助言可能です。
Raspberry Pi OS(旧Raspbian) LiteでもI2Cは使えると思います。

TP さんのコメント...

質問です
2019年に質問していた方と似た症状なのですが、
Traceback (most recent call last):
File "/home/pi/mpu9250_test/scan.py", line 12, in
import FaBo9Axis_MPU9250
File "/usr/local/lib/python3.9/dist-packages/FaBo9Axis_MPU9250/__init__.py", line 1, in
from .MPU9250 import *
File "/usr/local/lib/python3.9/dist-packages/FaBo9Axis_MPU9250/MPU9250.py", line 290
print "ax = ", (accel['x'])
^
SyntaxError: invalid syntax
というエラーが出てしまいます。

以前投稿者様が紹介されたやり方を試しても改善できません。
因みに
当時のやり取りで投稿者様が紹介されていたコマンドを用いたライブラリの更新はターミナル上での操作で間違いないでしょうか。

最近Pythonを学び始めたばかりで右も左も分からず恐縮なのですが、他の対策方についてご教授頂けると幸いです。

Asuki Kono さんのコメント...

これはprint関数の扱い方に関するエラーだと思います。
実行されているプログラムのprint関数は括弧の始まり「(」の場所が間違っているので、そこを修正するとどうでしょう?
(手元にmpu9250が無く動作確認できていないので、ライブラリの不具合な可能性もあります。)

現在
print "ax = ", (accel['x'])
期待する記述
print("ax = " + str(accel['x']))

> コマンドを用いたライブラリの更新はターミナル上での操作で間違いないでしょうか。

はい、間違いありません。