【加速度センサー入門】タップ検出機能を使ってみよう

【加速度センサー入門】シリーズでは、アナログ・デバイセズ社の加速度センサーを中心に、基本的な使い方や応用方法を解説します。前回の記事では、加速度センサー「ADXL345」 と「Arduino」を使い、「自由落下の機能」をご紹介しました。本記事では、ADXL345に搭載されている「タップ検出機能」をご紹介します。

【加速度センサー入門】シリーズ一覧はこちらから

タップ検出機能について

タップ動作とは

スマートフォンやスマートウォッチのディスプレイ(画面)を、指で押す動作のことを「タップ((Tap)」と呼びます。画面を1回押す動作を「シングルタップ」、2回押す動作を「ダブルタップ」と呼び、マウスのクリック・ダブルクリックのようにアイテムの選択・決定をするためのユーザーインターフェースとして「タップ動作」が活用されています。タップ動作の際に生じる力により加速度が発生するため、加速度センサーを活用することが可能です。そのため、加速度センサーを機器に実装しておくことで、既存のメカニカルスイッチを置き換え、シンプルなデザインのユーザーインターフェースの実現が可能となります。

 

 

ADXL345のタップ検出機能について

ADXL345にはタップ動作を検出する機能が組み込まれています。タップ検出機能は「シングル・タップ」または「ダブル・タップ」を検出できます。タップ検出は、下図のイメージ図のように設定した加速度閾値レベルと動作継続時間を元に、タップ検出割込みを発生させることができます。そのためホストプロセッサー側では加速度データからのタップ検出アルゴリズムを組む必要がありません。またタップ動作が検出されるまでホストプロセッサーをスリープモードにしておくことでシステムの省電力化を行うことも可能です。

 

タップ動作のイメージ
タップ動作のイメージ

タップ検出機能を使ってみよう

加速度センサー「ADXL345」とハードウェアのオープンプラットフォームである「Arduino」を使い、「シングルタップ・ダブルタップの検出機能」プログラムを作成していきます。

 

タップ動作は比較的短い幅の加速度が急峻に発生します。そのためシングルタップの検出に関しては、一定の「閾値」と「パルス幅」以下の加速度が加わるとシングルタップ検出となります。また、ダブルタップに関しては、一定の「閾値」と「パルス幅」以下の加速度が規定した「待ち時間」の間に2回加わるとダブルタップと認識します。ADXL345はこの閾値・パルス幅・規定時間を設定して、柔軟な設定を行うことができます。

準備するもの

今回、加速度センサーを評価するうえで準備したものはこちらです。

 

・Arduino IDE がインストール済みの PC (Arduino IDE のダウンロードはこちらから)

・USB ケーブル (Arduino と PC 接続用)

Arduino Nano 互換品ボード 

加速度センサー ADXL345 

・ブレッドボードとワイヤー

 

上記の部品を組み合わせて、下図のように回路を組んでいきます。Arduino Nano への電源は、PC からの USB バスパワーで供給します。ADXL345は、SPI インターフェースとI2C インターフェースに対応していますが、今回はI2C インターフェースを使用します。

接続図
接続図

プログラムの内容

今回のプログラムではシングルタップ・ダブルタップの両方を検出するようにします。そのためタップに関連するレジスタ設定を行う必要があり、下記に具体的な設定内容を記載します。なおレジスタの詳細についてはデータシートをご確認ください。

 

■タップ機能の有効化設定
TAP_AXESレジスタ(アドレス:0x2A)のBIT[2:0]のTapEnableビットを1にすることで各軸のTap機能を有効にします。今回はZ軸のみを有効にします。

 

■シングルタップを使う場合、検出閾値レベル(Threshold)、継続時間(Latency)に関する2つのレジスタを設定

・THRESH_TAPレジスタ(アドレス0x1D)ではタップ検出の加速度閾値を設定します。今回は2gを閾値としました。
・DURレジスタ(アドレス:0x21)では加速度閾値の継続時間を設定します。今回は10msecに設定しました。

なおシングルタップは、検出閾値を超た加速度値(THRESH_TAP)が継続時間以下(DUR)の場合に検出されます。

 

■ダブルタップを使う場合は、シングルタップの設定レジスタに加えて、LATENTレジスタとWINDOWレジスタを設定
・LATENTレジスタ(アドレス:0x22)はシングルタップ検出後の待ち時間となり、この時間内は閾値を超えてもその加速度を無視をします。今回は20msecとしました。
・WINDOWレジスタ(アドレス:0x23)はLATENT時間後からタップ動作を受け付ける時間です。今回は320msecとしました。

なおダブルタップは、シングルタップ発生後にWindow Timeを下回り、Latency Timeを上回る時間条件でシングルタップを検出した場合に検出されます。

 

■シングル・ダブルタップの割り込み機能の有効化
・INT_ENABLEレジスタ(アドレス0x2E)のBIT[6]はシングルタップ、BIT[5]はダブルタップに割り当てられています。今回は、シングル・ダブル共に有効にしました。

 

プログラムの内容としては、初めにADXL345のレジスタ設定を行い、その後シングルタップ割込みを検出した場合Arduinoのシリアルコンソールに"Single Tap Detected"のログを出力させます。またダブルタップ割り込みを検出した場合は、"Double Tap Detected"のログを出力させます。割込みの使い方に関しては知りたいという方は、「加速度センサーの割込み機能を使ってみよう」の記事をご確認ください。Arduino IDE で作成したプロジェクトファイルはダウンロードできますので、ご興味のある方は下記「資料ダウンロード」より入手ください。

動作確認

作成したプログラムを使って動作確認をしてみます。加速度センサーがのっているボードを指でたたく「タップ動作」を行います。その際にArduinoのシリアルコンソールに "Single Tap Detected" が" Double Tap Detected" がそれぞれ表示され、タップ動作が正常に検出されたことが確認できました。動作確認の様子を動画にしましたのでご確認ください。

なおタップ検出は、指でたたく強さ、タイミングなど個人差があること、また基板・筐体などの状況により力が伝わる強さが変わるため、各レジスタのチューニングが必要になる場合がございます。この記事を参考に評価していただければと思います。

今回検証したサンプルコードのダウンロード

今回実施したArduino のプロジェクトファイルを提供しています。こちらからお申し込みの上、ぜひお試しください。

加速度センサー ADXL345 について

今回使用したADXL345 は、3軸のデジタル出力加速度センサーです。主な特長は以下の通りです。

 

・ADC、演算機能ブロック、FIFO 内蔵で、非常に使いやすいスタンダードな加速度センサー

・加速度データは、デジタルシリアル方式で一般的なI2C/SPIを採用

・3軸タイプのセンサーは直交座標 (X, Y, Z) で、それぞれの軸に働く加速度を取得可能

・最大検出加速度を2g~16gの範囲で設定ができ、サンプリングも~3.2kHzと幅が広いので、衝撃、傾き、モーション検知など様々な用途に応用可能

・消費電流を減らすためのフレキシブルなモードを採用

 

ADXL345 の詳細は、データシートをご参照ください。

また、この加速度センサーは非常に使いやすいので、これから加速度センサーを評価してみたいという方は是非評価ボードでお試しください。

 

最後に

本記事の内容に関してのご質問、または加速度センサーの選定や使い方にお困りのことがありましたら、以下からお問い合わせください。



アナログ・デバイセズ メーカー情報Topへ

アナログ・デバイセズ メーカー情報Topに戻りたい方は以下をクリックしてください。