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,"ST
320F03SP");
//加速度レンジ初期化 write_i2c(recive_data,"ST
321008SP");
//加速度帯域幅初期化(ローパスの事?) write_i2c(recive_data,"ST
321100SP");
//低電力スリープ周期?初期化 timer=getsystime()+50;
while(1){
if(timer<getsystime()){
//50ms周期で実行 timer=getsystime()+50;
write_i2c(recive_data,"ST
3202RS
33RDSPST
3203RS
33RDSP");
//加速度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を比較すれば値が取れると思います。