2014/06/20

RasPiで9軸センサーを動かす

Raspberry PiでI2Cを使って9軸センサー(MPU9150)を動かしてみました。
今後も使う可能性あるので自分メモです。

RasPiでI2Cを使うのに参考にした(丸パクリしたともいう)サイトは次のサイトです。
http://www.instructables.com/id/Raspberry-Pi-I2C-Python/all/?lang=ja


環境

実機 :Raspberry Pi Model.B
OS  :Raspbian
センサ:9 Degrees of Freedom Breakout - MPU-9150

1.RasPiのI2Cを有効化する。

RasPiのI2Cはなぜかデフォルトでは使えません。
/etc/modprobe.d/raspi-blacklist.conf にある設定ファイルを変えると有効化できます。

$ sudo vi /etc/modprobe.d/raspi-blacklist.conf

ファイルをエディタで開きます。

blacklist spi-bcm2708
blacklist i2c-bcm2708

blacklist i2c-bcm2708をコメントアウトします。

blacklist spi-bcm2708
#blacklist i2c-bcm2708

これでI2Cが有効化されました。

2.カーネルのI2Cモジュールを有効化する。

/etc/modulesを編集して、I2Cモジュールを読み込むようにします。

snd-bcm2835

の末尾に、i2c-devを追加します。

snd-bcm2835
i2c-dev

3.パッケージをインストールする。

apt-get updateを実行してから、i2c-toolsと、python-smbusをインストールします。

$ sudo apt-get update
$ sudo apt-get install i2c-tools
$ sudo apt-get install python-smbus

終わったら再起動します。

$ sudo reboot

再起動が終わったら、インストールしたソフトがちゃんと動いてるか確かめます。

$ sudo i2cdetect -y 1
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

こんな感じの表示が出れば大丈夫です。

i2cdetectコマンドの引数は、RasPiのタイプ(?)によって違うのを用いるみたいです。
参考サイトでは引数を0にしていますが、今回用いたRasPi、Model.B(メモリが512MBのほう)では、引数を1にするとうまくいきました。

4.9軸センサを実際に接続してみる。

RasPiの外部端子と9軸センサを接続します。使うのは3.3V,GND,SDA,SCLのみです。
RasPiの端子配列は(http://elinux.org/RPi_Low-level_peripherals)を参考に。

9軸センサの端子は、センサボードごとに調べてください。

I2Cなので、SDAとSCLにプルアップ抵抗は必要です。
センサボードに搭載されてなければ、自分で抵抗を接続してください。

5.Pythonで通信するコードを書く。


import smbus
import time

class Mpu9150:
 
    def write(self, register, data):
        bus.write_byte_data(self.address, register, value)
        return 0

    def read(self, register):
        data = bus.read_byte_data(self.address, register)
        return data

    def __init__(self):
        self.bus = smbus.SMBus(1)
        self.address = 0x68

        #ここにセンサ初期化用の処理


if __name__ == '__main__':
    mpu = Mpu9150()
 
    while True:
        #何らかの処理

だいたいこんな感じです。
センサのI2Cスレーブアドレスは用いるセンサのマニュアルを参照してください。

このプログラムには例外を組み込んでないので通信が失敗したらクラッシュします。注意。



大体こんな感じでI2C通信ができました。
Pythonだと楽ですね。

今回はPythonのコードを書いてI2Cを行いましたが、シェル上からコマンドでI2Cすることも出来るようです。C言語でも同じようなコードが書けるようなので、知りたい方はグーグル先生へ。

では。


0 件のコメント:

コメントを投稿

記事の感想、意見などはこちらからどうぞ。

人気の投稿