【加速度センサー入門】シリーズでは、アナログ・デバイセズ社の加速度センサーを中心に、基本的な使い方や応用方法を解説します。前回の加速度センサーの割り込み機能を使ってみよう では、ADXL345の機能のひとつである「割り込み機能」を活用したデータ取得方法を使い方を紹介しました。今回はFIFO機能の活用方法について解説したいと思います。
【加速度センサー入門】シリーズ一覧はこちらから
ADXL345 のFIFO 機能について
FIFO「First In First Out」は、レジスタ・メモリーなどのデータ格納領域に対して、最初に格納したデータが最初に出てくる構造を指します。FIFOを活用することで、デバイス間での通信タイミングに柔軟性を持たせることができます。
ADXL345 は32段のFIFOバッファーが内蔵されているため、X、Y、Z軸の3軸加速度データを最大32サンプル分保持することができます。センサー内蔵のFIFOを使うことで、ホストプロセッサーはデータ取得のためのアクセス回数を減らすことができ、他のタスクに集中することができます。また、アクセス回数を減らすことでホストプロセッサ―はより長い期間スリープにしておくことが可能となり、システムの低消費電力化が行えます。
下図にセンサーFIFO搭載「あり」と「なし」の加速度センサーとプロセッサーの通信イメージ図を作成してみました。図のように加速度センサーは一定周期でサンプリングを行っています。
「FIFOがない場合」は、ホストプロセッサーはサンプリング毎にデータを取得する必要があり、常にセンサーからのデータに気を配る必要があります。
一方、「FIFOが搭載されている場合」は、FIFOにデータがたまった時点でデータを取りに行けば良いため、ホストプロセッサーは別の処理に集中ができます(例えばSDカードに加速度データを書き込む、データの演算処理を行うなど)。また、消費電流の観点でもデータ取得毎に行うホストプロセッサーののSleep動作・Wake動作の回数を削減できるため、結果としてシステムの消費電力を下げることができます。
ADXL345hのFIFOの設定は、FIFO_CTRLレジスタで設定できる4つのモードに対応しています。
① Bypass mode:FIFO非使用(Default 設定)
② FIFO mode:FIFOが満杯になると、データを読み出すまでデータを保持する
(満杯の状態では、新しい加速度データは更新されません。また、FIFOデータを読み出すと、新しいデータの保存が再開されます。)
③ Stream mode:FIFOMODEとの違いはFIFOが満杯の状態では新しいデータが最も古いデータを上書きする。
④ Trigger mode: アクティブ割込みイベントと組み合わせた使用方法が可能なモード
(割り込み要因の中で発生した最初のアクティブイベントを使うことで通常はStream modeと同様に動作し、イベント検出後はFIFO modeの動作になります。そのため、アクティブイベント発生前後のサンプルを保存することができます。)
また、FIFOの状態を知るための割込み機能として、Overrun割り込み、Watermark割り込みの機能があります。
① Overrun 割り込み:FIFOが満杯(32サンプル)になった際に割り込みが発生します
② Watermark 割り込み:指定した任意のサンプル数に達した場合に割り込みが発生します
FIFOモードや割り込み機能を選択することでユーザーアプリケーションに合わせた柔軟な設計を可能にします。
FIFOについての詳しい内容は、データシート及びApplication Note[AN-1025]をご確認ください。
FIFO機能を使ってみよう
加速度センサーADXL345 とハードウェアのオープンプラットフォームであるArduinoを使いFIFO機能を使ってみます。
準備するもの
加速度センサーを評価するうえで準備したものはこちらです。
・Arduino IDE がインストール済みの PC (Arduino IDE のダウンロードはこちらから)
・USB ケーブル (Arduino と PC 接続用)
・ブレッドボードとワイヤー
上記の部品を組み合わせて、下図のように回路を組んでいきます。Arduino Nano への電源は、PC からの USB バスパワーで供給します。ADXL345は、SPI インターフェースとI2C インターフェースに対応していますが、今回はI2C インターフェースを使用します。
プログラムの内容
ADXL345のFIFOバッファーにX,Y,Zの3軸加速度データが16サンプル分格納され、その際に発行される割り込み信号をArduinoで受信し、その後格納されたデータを一括して取得するプログラムを作成しました。
FIFO機能を活用するためにレジスタをいくつか設定する必要があります。下記に主な内容を記載します。
◎BW_RATEレジスタ(アドレス0x2C):
更新レートの設定レジスタです。今回はデフォルトの100Hz(10msec)とします。
◎FIFO_CTLレジスタ(アドレス0x38):
BIT[7:6]はFIFOのモード設定に対応しています。今回はFIFO modeとしたので、BIT[7:6]=0x01とします。また、BIT[4:0]はサンプル数の設定ビットとなります。FIFO modeの場合は、ウォーターマーク割込みが発生するためのデータ数になり、今回は16個なのでBIT[4:0]=0x0Fで設定します。
◎INT_ENABLEレジスタ(アドレス0x2E):
割り込み有効の設定レジスタです。BIT[2]=1を設定し、Watermark割り込みを有効にします。
以上の設定により割り込み発生タイミングは 「更新レート*サンプル数 = 10msec*16 = 160msec」 となり、割り込み検出時にはINT1ピンが Low→Highへ変化します。
プログラムではINT1ピンの変化を検知した後、INT_SOURCEレジスタ(アドレス0x30)の読み込みを行い、割り込み要因を確認します。Watermark割り込みBITが1の場合は、ADXL345_FIFO_STATUS(アドレス:0x39)をリードしFIFOに格納されているサンプル数を確認します。その後格納サンプル分のデータを取り込みます。
なおFIFOに保存されたデータは、Standbyモード時でも保持されています。もし一括でクリアしたい場合は、FIFO_CTLレジスタでモードをBypassモードに選択する必要があります。
ADXL345 のレジスタの詳細及び使い方はデータシート及びApplication Note[AN-1025]をご確認ください。
また、 Arduino IDE で作成したプロジェクトファイルはダウンロードできますので、ご興味のある方は下記「資料ダウンロード」より入手ください。
動作確認
下図の通りシリアルモニター上ではX、Y、Zの3軸分の加速度データが16サンプル分読み込みとれていることが確認できました。また、AnalogDisocveryを使いINTピン、I2Cのクロックピン・データピンをモニターしたところ、設定したサンプル数に達した時間160msecでINT1ピンがLow→Highに変化していることが確認できます。また図の通り、Arduino側では割り込み後、FIFOに格納されたデータを一括取得しているため(図の緑色の箇所)、割込みがくるまでの時間(図のピンク色の箇所)を長く確保でき、スリープ動作や別の作業にリソースを割り当てることが可能です。
なお前回の記事「加速度センサーの割り込み機能を使ってみよう 」ではDataReady割り込みを使用し、10msecおき毎回サンプリングデータを取得しています。こちらも併せてご参照ください。
また、FIFOの機能に関しては、他にも便利な使い方があります。アクティブ割り込みと組み合わせたFIFOトリガーモードの例なども今後ご紹介したいと思います。
FIFOを使った平均化処理について
センサー側にFIFOが内蔵しているメリットをは他にもあります。一般的にセンサーからのデータはノイズの影響により値が一定になりにくいのですが、複数サンプルデータを平均化することで安定した結果を得ることができます。そのため、センサー側にFIFOバッファーがあることで、複数のデータを一括で取得し平均化を同時に行うことで、ホストプロセッサーは平均するためのデータ数分を常に保持しておく必要がないので、結果RAMの容量を削減することができます。
例えば今回実験で使用したArudino NanoのマイコンはRAM領域が2Kbyteしかありません。加速度データは2Byteで構成され、3軸分だと6Byteとなります。さらに32個分のデータを保持すると、32 x 6Byte=192Byteの容量が必要となり、全体の約10%を占めてしまいます。そのため、小規模のマイコンにおいては、センサー側に搭載されているFIFOを活用することで、ホスト側のメモリー容量を効率的に使用することができます。
今回検証したサンプルコードのダウンロード
今回実施したArduino のプロジェクトファイルを提供しています。こちらからお申し込みの上、ぜひお試しください!
加速度センサー ADXL345 について
今回使用したADXL345 は、3軸のデジタル出力加速度センサーです。主な特長は以下の通りです。
・ADC、演算機能ブロック、FIFO 内蔵で、非常に使いやすいスタンダードな加速度センサー
・加速度データは、デジタルシリアル方式で一般的なI2C/SPIを採用
・3軸タイプのセンサーは直交座標 (X, Y, Z) で、それぞれの軸に働く加速度を取得可能
・最大検出加速度を2g~16gの範囲で設定ができ、サンプリングも~3.2kHzと幅が広いので、衝撃、傾き、モーション検知など様々な用途に応用可能
・消費電流を減らすためのフレキシブルなモードを採用
ADXL345 の詳細は、データシートをご参照ください。
また、この加速度センサーは非常に使いやすいので、これから加速度センサーを評価してみたいという方はぜひ評価ボードでお試しください。
最後に
本記事の内容に関してのご質問、または加速度センサーの選定や使い方にお困りのことがありましたら、以下からお問い合わせください。
おすすめ記事/資料はこちら
ADcmXL3021 標準的な機械ネジで設置できる高性能3軸MEMS センサー
アナログ・デバイセズ メーカー情報Topへ
アナログ・デバイセズ メーカー情報Topに戻りたい方は以下をクリックしてください。