MMA8491Q 3軸デジタル加速度センサークリック (CLICK-3AX)は、45°チルト検出器としても機能する高機能な3軸デジタル加速度センサーMMA8491Qを使用したクリックボード(※1)です。電源電圧は3.3Vです。
※1:クリックボードは、mikroBUS規格のインターフェースを搭載した様々な機能性ボードの総称です。
X軸、Y軸、Z軸それぞれの加速度を14ビットの分解能で+8g~-8gまでの範囲で計測します。計測は超高速の700マイクロ秒です。計測データはI2CインターフェースでMCUと通信できます。SCL線、SDA線はいずれも本ボード内でプルアップされています。
45°のチルト検出器は、傾いた向きの出力を元にして3つのLEDを点灯させます。本ボードには3つのLEDが実装済みです。Z軸は常に1gの重力が加わっているため置いておくと常に点灯しています(点滅)。また45°チルト検出の出力はボード内でトランジスタによって統合されており、外部のMCUに対して割込信号として出力が可能です。
様々なアプリケーションにお使い頂けます。
● MMA8491Q多機能3軸±8 gデジタル加速度計
● チルト検出器よって傾いた向きの出力を基に点灯するLEDを3軸それぞれ実装済み
● +8g~-8gまでの範囲を14ビットの分解能で計測、1mg/LSBの高精度
● ~700マイクロ秒の超高速データ出力時間
● シリアルI²Cバス
● 電源 3.3V
● mikroBUS準拠で様々なマイコン開発ボードに装着しやすい
● ボードサイズ 42.9×25.4 (mm) ※但し上部円形
使い方についてはMMA8491Qのデータシートをお読み下さい。
■本体回路図
■インターフェイス端子(mikroBUS規格)
※NCは未使用ピンです。
シリアルI2CのSCLピン、SDAピンはそれぞれボード内で4.7Kオームの抵抗でプルアップされています。
3 | EN | MMA8491AのENピンに直結しています。このピンがHレベルで加速度センサのすべてが動作します。このピンがLレベルですべての機能が停止します。よって計測する場合にはこのピンはHレベルにする必要があります。 |
11 | I2C SDA | I2Cスレーブデータ線 内部で4.7kオームでプルアップ済み ・7ビットI2Cスレーブアドレス:0x55 (固定) ・100KHz又は400KHz |
12 | I2C SCL | I2Cスレーブクロック線 内部で4.7kオームでプルアップ済み |
15 | INT | 3軸傾き検出時割込信号出力 各軸のいずれかが0.688g より大きい(|φ| > 45°)時、Lレベル出力 各軸のいずれかが0.688g 以下(|φ| ≤ 45°)の時、Hレベル出力 ※LED出力信号と逆論理 |
■LEDの点灯とINTピンの設定
3軸にそれぞれLEDが接続されています。各LEDは0.688gより大きい(|φ| > 45°)時点灯し、0.688g 以下(|φ|≤ 45°)の時消灯します。Z軸は常に地上では重力で1gがかかっています。(垂直時)
INTピンは3つのLEDのいずれかが点灯する時Lレベルになります。
マイコン等と接続する時、傾きの状態が45°から変化したことを検出する時等に使います。使わない場合にはオープンで構いません。どの軸の割込を有効にするかはボード上の”INT SEL”とシルク印刷のある0オームのジャンパー抵抗の有無で設定できます。デフォルトではすべての軸でジャンパーされています。割込として使いたくない軸がある場合には、チップ抵抗を外すことで無効にできます。
■I2C通信とレジスタ
本モジュールに搭載のMMA8491QのI2Cの7ビットスレーブアドレスは0x55に固定されています。Readで1を加算、Writeで0を加算します。最終的な8ビットアドレスはRead時0xAB、Write時0xAAです。
本モジュールからのデータの読み込みには「シングルリードモード」と「マルチプルバイトリードモード」の2つがあります。マルチプルバイトリードモードでは、自動的にレジスターアドレスがインクリメントされるのでX、Y、Z軸それぞれのデータを連続して読み込めます。データシークエンスは次の通りです。(データシート11ページ参照)
レジスタアドレスにはステータス情報及びX、Y、Z軸それぞれのデータが入ります。レジスタマップは次の通りです。
最初に0x00番地を読み状態を確認します。0x00番地には3軸それぞれに新しい値が入っているかどうかを示すビットがあります。(データシート15~16ページ参照)傾きに変化が生じて値が更新されたかどうかを確認できます。
マルチプルバイトリードモードの場合、自動的にアドレスはインクリメントされます。よって、例えばX軸のMSBをマスター側で読み込めば自動的にアドレスがインクリメントされてX軸のLSBが読めます。3軸合計で6バイトのデータとなります。
■軸データの読み込み手順
データの読み込み等、動作には次のシークエンスが必要です。
使い方としてはENピンは初期化時はLレベルにしておき、データを読みたい時にHレベルにします。
その後I2Cマスター側から読みたい軸のレジスタアドレスにアクセスしてデータを読みます。読み取った後は再度ENピンをLレベルにします。
3軸のデータは14ビット長です。レジスタには上位(MSB)8ビット[13:6]と、下位(LSB)6ビット[5:0]が2つのレジスタに分かれて入っています。例えばX軸のデータは次のようにMSB、LSBのデータが入ります。
LSBデータの入るレジスタの下位2ビット[1:0]は使いませんので通常はI2Cマスター側マイコンのプログラムでシフトさせるようにします。
14ビットデータとレンジの関係は次の通りです。
■データの解析とプログラミング例
ここでは最も基本的な使い方として、I2Cマスター側がデータを読み取った後のデータ処理方法と、プログラミング例を示します。
例としてX軸のデータとして8gのデータがAddress1と2に入っていた場合を考えます。
(1) 8gなので14ビットデータは 01 1111 1111 1111 となります。よってレジスタには下記のようにデータが入ります。
Address1: 0111 1111
Address2: 1111 11xx
(2) 最初にMSBを8ビット分(LSB分)左にシフトして、LSBデータを入れるスペースを作ります。それにはMSBの値に0x100を積算します。
0111 1111 * 0x100 = 0111 1111 0000 0000
(3) LSBを加算します。
0111 1111 0000 0000 + 1111 11xx = 0111 1111 1111 11xx
これで16ビット長のデータとなります。
(4) 下位2ビットは切り捨てるので右に2ビットシフトする
0111 1111 1111 11xx >> 2 = 0001 1111 1111 1111
これでデータの成形ができました。
(5) この有効値14ビットのデータを実際のgに変換します。正負の判定は14ビット目が0か1かで判断します。0ならば正又は0、1ならば負の範囲であることがわかります。IF文を使う時は0x2000とのビット演算ANDで0又はそれ以外として判定可能です。実際にgに変換するプログラム例は次の通りです。
if (out_x & 0x2000) { x_axis = (0x4000 - out_x) / -1024.; }else{ x_axis = out_x / 1024.; }
これをもとに実際のプログラミング例を下記に示します。
※あくまでも一例ですので実際はお使いの言語、環境等に合わせてお使い下さい。
char STATUS; unsigned int OUT_X, OUT_Y, OUT_Z, oldOUT_X, oldOUT_Y, oldOUT_Z; float temp; void MMA8491Q_Multiple_Read(char *p_STATUS, int *p_OUT_X, int *p_OUT_Y, int *p_OUT_Z){ char reg_data[7]; reg_data[0]=0x00; I2C1_Start(); I2C1_Write(MMA8491Q_ADDR,reg_data,1,END_MODE_RESTART); I2C1_Read(MMA8491Q_ADDR,reg_data,7,END_MODE_STOP); *p_STATUS=reg_data[0]; *p_OUT_X=((0x100*reg_data[1]+reg_data[2])>>2)&0x3FFF; *p_OUT_y=((0x100*reg_data[3]+reg_data[4])>>2)&0x3FFF; *p_OUT_Z=((0x100*reg_data[5]+reg_data[6])>>2)&0x3FFF; } void Display_X_Value() { if(OUT_X&0x2000){ temp=(0x4000-OUT_X)/-1024.; } else { temp=OUT_X/1024.; } sprintf(out, "%2.3f", temp); } } void Display_Y_Value() { if(OUT_Y&0x2000){ temp=(0x4000-OUT_Y)/-1024.; } else { temp=OUT_Y/1024.; } sprintf(out, "%2.3f", temp); } } void Display_Z_Value() { if(OUT_Z&0x2000){ temp=(0x4000-OUT_Z)/-1024.; } else { temp=OUT_Z/1024.; } sprintf(out, "%2.3f", temp); } } void Display_values(void) { Display_X_Value(); Display_Y_Value(); Display_Z_Value(); Delay_ms(100); } void main(){ while(1) { MMA8491Q_EN = 1; Delay_ms(500); MMA8491Q_Multiple_Read(&STATUS, &OUT_X, &OUT_Y, &OUT_Z); MMA8491Q_EN = 0; if(STATUS==0x0F) { Display_values(); } } }
■本製品のサポートについて
本製品はメーカーがリリースしているMMA8491Qのデータシート及び本製品の回路図を見て、その使い方をご理解頂き実際にプログラミングやマイコンから本製品を制御できる技術者向けの製品です。
本製品はMMA8491Qの機能をそのまま使った製品ですので、使い方はMMA8491Qのデータシートにてご理解頂く必要があります。本ページでは参考として使い方のプログラム例を示していますのでこれらをご参考にお使い下さい。
本製品の技術的なサポート、I2C通信による使い方、ハードウエアの設計方法等について当方マイクロテクニカではサポートを行っておりません。ご質問頂きましてもご回答致しかねます。本製品のMMA8491Qについての使い方等で技術的なご質問がある場合には、直接メーカーのサポートをご利用下さい。(但しデータシートに既に記載されている内容については回答が得られませんので、必ずデータシートをよくお読みの上、ご質問下さい。)