忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

I2Cを試してみる

SH7125でI2Cが使える様になった様なので、色々試してみます。

関連
I2Cとは
I2Cの設定(1)無理矢理動かす
I2Cの設定(2)もう少し真面目に動かす
I2Cの設定(3)関数化

BMX055使用9軸センサーモジュール
秋月にてArduinoサンプルプログラムが公開されているので、これを見て何をすれば良いのか
試してみます。
ちなみに、*.inoファイルはメモ帳等で開くことができます。
また、動作を理解するためには搭載されているBMX055のデータシートが必要になります。
ググれば見つかると思います。

回路

電源はベースボードから供給します。
準備5V駆動、信号も5VなのでJP6を半田でショートさせます。
JP4、JP5をジャンパすればバスのプルアップができますが、今回はブレッドボード上で
プルアップします。
その他ジャンパは行わず、素の状態でテストします。
取説によると素の状態のアドレスは
 加速度:0x19
 ジャイロ:0x69
 磁気:0x13
となっています。

機能の理解

ではサンプルプログラムを見ていきます。
やるべきことは
・モジュールの初期化
・データの取得
に分かれます。

更に分けると
設定
・モジュールの加速度センサー初期化(3種)
・モジュールのジャイロセンサー初期化(3種)
・モジュールの磁気センサー初期化(6種)

取得
・加速度データの取得(X軸上位下位、Y軸上位下位、Z軸上位下位)
・ジャイロデータの取得(X軸上位下位、Y軸上位下位、Z軸上位下位)
・磁気データの取得(X軸上位下位、Y軸上位下位、Z軸上位下位、磁気抵抗?上位下位)
となっている様です。

各通信でのアクセス先はサンプルプログラムの各項2番目の値
 Wire.beginTransmission(Addr_Accl);
 Wire.write(0x0F); // Select PMU_Range register
 Wire.write(0x03);   // Range = +/- 2g
 Wire.endTransmission();
とデータシートの
 Register map accelerometer
 Register map gyroscope
 Register map magnetometer
の項を照らし合わせれば何をしているか分かるはずです。

ArduinoのI2C関数の詳細は知りませんが、
 beginTransmission:スタートコンディション+アドレス(書込み)
 write:値の書込み(※データ/サブアドレス共通)
 endTransmission:エンドコンディション
 requestFrom:スタートコンディション+アドレス(読出し)+データ受信
の処理を行っている様です。


プログラム

前回のプロジェクトを使用します。
当ブログで公開してあるI2Cの関数はアドレスとデータ送信の区別がありません。
従ってアドレスを送信する場合は7bitアドレス×2+読書判定とする必要があります。

加速度アドレス0x19の場合
 加速度アドレス(書込み)=0x19×2+0=0x32
 加速度アドレス(読出し)=0x19×2+1=0x33
を送信してください。
とりあえず加速度だけ設定してX軸値のみ取得してみます。

<設定>
#include <stdio.h>
#include "intCMT.h"
#include "intSCI.h"
#include "intI2C.h"

main(){
    unsigned long timer;
    char trans_buf_i2c[255];
    char trans_buf_sci[255];
    static short recive_data[10];
    short acc;
    init_CMT0(1);
    init_SCI1();
    init_I2C();

    write_i2c(recive_data,"ST320F03SP");    //加速度レンジ初期化
    write_i2c(recive_data,"ST321008SP");    //加速度帯域幅初期化(ローパスの事?)
    write_i2c(recive_data,"ST321100SP");    //低電力スリープ周期?初期化

    timer=getsystime()+50;
    while(1){
        if(timer<getsystime()){//50ms周期で実行
            timer=getsystime()+50;

            write_i2c(recive_data,"ST3202RS33RDSPST3203RS33RDSP");    //加速度X軸下位→上位を取得
            while(check_i2c_fin()==0);    //通信完了待ち
            acc =recive_data[1]*0x100;    //8bit桁上げ
            acc+=recive_data[0]&0xF0;    //下位4bitは不要
            acc/=0x10;                    //4bit桁下げ
            sprintf(trans_buf_sci,"%04X\n",acc);
            write_sci1(trans_buf_sci);

        } //end timer
    } //end while
} //end main

とりあえずこれでX軸加速度を取得できます。
short型は16bitなので、8bitデータを8bit桁上げすると符号ビット扱いになるとかそんな事をしていますが、詳細はまた今度。
あとはサンプルプログラムとデータシートのRegister mapを比較すれば値が取れると思います。
PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント