2014/06/27

傾き検出まとめ

nekolabの資料庫に、9軸センサを使った姿勢制御のページを作りました。 

https://sites.google.com/site/nekolabwiki/electronic/posturecontroll


いままでブログにちょこちょこ載せてきた内容をまとめたものです。

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言語でも同じようなコードが書けるようなので、知りたい方はグーグル先生へ。

では。


2014/06/04

ATMega328Pをアセンブラで動かしてみた

タイトルまんまです。

僕はわりと最近マイコンを触り始めた勢ということもあり、アセンブラを触ったことがありません。

と、いうわけで書いた!


 .include "m328Pdef.inc"

 .def TEMP=R16

 .org 0x0000

 rjmp RESET

 RESET:
 ldi R16,LOW(RAMEND)
 out SPL,R16

 ldi TEMP,0xFF
 out DDRB,TEMP

MAIN:

 LED_ON:
 ldi TEMP,0b00000001
 out PORTB,TEMP

 rcall wait05

 LED_OFF:
 ldi TEMP,0b00000000
 out PORTB,TEMP

 rcall wait05

 rjmp MAIN

wait05:
 ldi R18,5

wait052:
 rcall wait01
 dec R18
 brne wait052
 ret

wait01:
 ldi R19,40

wait012:
 rcall wait1m
 dec R19
 brne wait012
 ret

wait1m:
 ldi R20,250

wait1m2:
 nop
 dec R20
 brne wait1m2
 ret

Lチカ!!!!
楽しい!!!!!!


アセンブラはめんどくさそうと思っていましたが、全くその通りでした。
でも楽しかったので良しとします!

次は条件分岐だ...

人気の投稿