近接センサーを組み込んだハンドヘルド型タッチスクリーンアプリケーションの設計
要約
このアプリケーションノートでは、マキシムのMAX44000近接センサーをハンドヘルド型タッチスクリーンアプリケーションで使用することの利点について説明します。また、アプリケーションにおけるいくつかの考慮事項についても検討します。その中では、クロストークの抑制、ノイズ耐性の強化、システム内のアプリケーションプロセッサに対する負荷の軽減などを取り上げます。付録には、スレッショルドヒステリシスのサンプルCコードを掲載しています。
近接センサーを使用する理由
タッチスクリーンは、スマートフォンにとどまらず、さまざまなハンドヘルド型電子デバイスで使用されています。タッチスクリーンを搭載すると、デバイスの機能性が大幅に向上しますが、新しい課題もいくつか生まれます。タッチスクリーンとの相互作用を認識する方法や、そのタイミングを決めることなどです。たとえば、タッチスクリーンでは、スマートフォンがユーザーの顔と向き合ったときにどのように反応するかを認識する必要があります。耳や頬が何気なく接触しただけでも、誤って意図的なユーザー入力と認識される可能性があります。
こうした問題を回避しつつデバイスの機能を強化するための最も一般的な方法は、スマートフォンに近接センサーを組み込むことです。このセンサーは、近接反応が十分に大きく、ユーザーが通話中であるときに、タッチスクリーンをオフにすることができます。
MAX44000など、赤外線ベースのデジタル出力を備えた近接センサーを内蔵したデバイスを使用すると、こうした処理がディスクリートソリューションに比べて簡単になります。
マキシムの近接センサーの主な利点
マキシムの近接センサーには、いくつかの利点があります。まず、赤外線エミッタは電流ソース構成ではなく電流シンク構成で接続されます。そのため、ユーザーはLEDで使用する電源電圧を妥当な範囲で選択することが可能で、LED性能と消費電力の最適なバランスを実現することができます(図1)。
図1. MAX44000にLEDを接続した回路
MAX44000ファミリはI²Cインタフェースに対応しているため、この汎用バスによって大部分の組み込みシステムに極めて簡単に内蔵することができます。さらに、このデバイスはハードウェア割込みラインをサポートしています。これら2つの特長によって、大部分のハンドヘルド型デバイスにこのセンサーをシームレスに組み込むとともに、センサーからの情報に応えるのに必要なプロセッサリソースの量を最小限に抑えることができます。
その上、マキシムの近接センサーには追加的な機能が内蔵されています。たとえば、MAX44000は、この6ピンIC 1つの中に環境光センサーと近接センサーを統合しています。こうしたソリューションによって、複数のセンサーを使用しなくても、光センサーのあらゆる処理を実行することができます。
アプリケーションの考慮事項
MAX44000は小型UDFN-Optoパッケージ(2mm x 2mm x 0.6mm)に収められているため、ユーザーは小型化が求められるアプリケーションでスペースを節約することができます。さらに、このセンサーはLED駆動回路を内蔵していますが、稼働させるにはエンドユーザーが発光ダイオードを用意する必要があります。この回路はシンク構成で発光ダイオード経由の0mA~110mAを使用して駆動可能であるため、この機能を実現する際に外付けの回路は必要ありません。
図2. MAX44000にバイパスエミッタを備えた回路
この機能を大きな駆動電流で使用する場合は、特に注意が必要です。特に、短い大電流パルスを使用した場合は、電源ラインの電流スパイクによってMAX44000の周囲に何らかのノイズが発生する可能性があります。この問題を回避する方法は2つあります。1つは発光ダイオードにデカップリングコンデンサを組み合わせる方法、もう1つはMAX44000の電源を発光ダイオードの電源から完全に分離する方法です。デカップリングコンデンサは安価という点で有利ですが、MAX44000や発光ダイオードのごく近傍に配置する必要があるという短所があります。エンドユーザーは、もう1つの方法に切り替える前に、まずこちらのソリューションを試すべきです。通常は、このソリューションで十分良好な結果が得られます。図2は過剰な構成になるかもしれませんが、両方のソリューションを同時に示しています。
ガラスが近接センサーに与える影響も慎重に考慮する必要があります。すべてではありませんが、大部分のスマートフォンは、本体の前面がガラスで覆われています。一部のスマートフォンでは、このガラスが黒色です。このガラスは、主に2つの影響を光センサーに与えます。第1に、ICの環境光センサー部分への入射光が減衰するため、その効果を考慮に入れる必要があります。第2に、LEDから放射された光の一部がこのガラスで反射され、センサーに戻ることによって、いくらかのクロストークが発生する場合があります(図3)。
図3. クロストークの仕組み(バッフルなし)
図4. 簡単な光学バッフルの例
* Emitter=Infrared LED Emitter
こうした影響は、いくつかの方法で抑制することができます。1つの方法は、エミッタとレシーバの間に光学バッフルを配置することです(図4)。これによってセンサーに到達し得る光パワーの量が大幅に減少します。もう1つの方法は、LEDとレシーバの両方をできる限りガラスに近付けるとともに、回路基板からの反射を抑制することです。
オン/オフスレッショルドに関する考慮事項
近接センサーをシステムに組み込む際の共通した課題は、スクリーンを通話時にオン/オフするための近接スレッショルドを正しく選択することです。適用可能な使用事例の数をできる限り増やしつつフォールスポジティブが少なくなるように、「トリガポイント」を設定する必要があります。たとえば、スマートフォンを握ったユーザーの髪の毛が近接センサーの前面にある場合、薄い色の髪なら、濃い色の髪よりもはるかに多くの信号を反射します。
MAX44000の近接センサーは、標準的な850nm IR LEDに対して優れた感度(2.7nW/cm²/LSB)を発揮します。これは、MAX44000が黒色ガラスの内側で優れた性能を発揮するだけでなく、濃い色の髪の毛を持つユーザーでも検出可能であるということです。それに加えて、MAX44000の近接センサーは最大100,000luxのDC太陽光を除去し、屋外環境での性能が向上しています。
最後に取り上げる1つの考慮事項は、このセンサーに対するヒステリシスの適用です。その理由は、コンパレータ回路にヒステリシスを追加する理由と同じです。入力信号がスレッショルドに近い場合に何らかのノイズが加わると、望ましくない不規則なスイッチングが出力信号に生じることがあります。同じことが近接センサーにも当てはまります。
ソフトウェアでセンサーを定期的にポーリングする単純な(電力効率の低い)事例を考えてみましょう。カウントがある値を超えて、スクリーンがオンである場合、スクリーンはオフになります。それ以外の場合、スクリーンがすでにオフであれば、スクリーンはオンに戻ります。この仕組みは一見、問題がないように見えるかもしれませんが、カウントがこのスレッショルド付近にとどまるような形でユーザーがデバイスを保持していると、スクリーンがオンとオフを繰り返すため、望ましくありません。
この問題を回避する1つの方法は、ソフトウェアにヒステリシスを設定することです。たとえば、タッチスクリーンのオンからオフへの移行が150カウント以上で発生する場合(近接センサーが8ビットモードで動作中と仮定)、オフからオンへの移行はカウントが135以下に下がった後にしか発生させません。さらに、これらの各レベルが一定時間、持続するようにするのが効果的です。そうすれば、一種の粗雑なローパスフィルタとして機能させることで、ノイズによる望ましくない動作が発生する可能性をさらに低くすることができます。
MAX44000では、そうした機構が内部レジスタでサポートされています。
REGISTER | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | REGISTER ADDRESS |
POWER- ON RESET STATE |
R/W |
Threshold Persist Timer | PRXPST[1:0] | 0x0A | 0x00 | R/W | |||||||
Threshold Persist Timer | ABOVE | PRXTHR[13:8] | 0x0B | 0x00 | R/W | ||||||
PROX Threshold—Low Byte | PRXTHR[7:0] | 0x0C | 0x00 | R/W |
割込みが有効になっている場合(レジスタ0x01、ビット1:0、近接センサーとALS用)、これらのレジスタでは、センサーをI²C経由で常にポーリングしなくても動作可能であるようにチップを設定することができます。レジスタ0x0Aのビット2と3を使用して、前述のような割込みまでの遅延を設定します。この遅延は、スレッショルドを超過する連続サンプル数として1、4、8、16のいずれかを選択することで設定します。レジスタ0x0Bと0x0Cでは、スレッショルドを設定するほか、割込みの起動をカウントがそのスレッショルドを上回ったときに行うか、下回ったときに行うかを設定します。
ヒステリシス機構とこの割込み方式を実装するサンプルコードを付録に掲載しています。I²Cバス経由で読取りや書込みを行う際は、この特定の部品で複数の読取り/書込みを行う場合にレジスタアドレスの自動インクリメントが行われないことに注意してください。これは通常、ごく簡単な実装ですが、ソフトウェアにおいて手動で行う必要があります。I²C互換デバイスで複数のレジスタにわたってデータを読み取る際は、エラーが発生しないように注意することが極めて重要です。詳細については、アプリケーションノート5033 「The Importance of Being Earnest (About Reading from an ADC on the I²C Interface」を参照してください。
付録A:スレッショルドヒステリシスのサンプルコード
#define MAX44000_ADDR 0x94 #define INT_STATUS_REG 0x00 #define OFF_THRESHOLD 4600 #define OFF_DELAY 1 #define ON_THRESHOLD 4000 #define ON_DELAY 3 uint8 screenStatus; // 0 means off, 1 means on /* i2cWriteBytes() Arguments: uint8 address - device address uint8 start_reg - register where the first byte is written uint8 *data - data to write uint8 nbytes - number of bytes to write Consecutively writes several bytes to some i2c device starting at some specified address -- implemented elsewhere */ void i2cWriteBytes(uint8 address,uint8 start_reg,uint8 *data,uint8 nbytes); /* MAX44000InterruptHandler()
下のサンプルコードは、MAX44000の近接センサーが14ビットモードに設定され、割込みが有効になっていると仮定して、MAX44000のINTピン動作時の割込みハンドラを実装するものです。さらに、screenStatusがある時点で1または0に初期化されたと仮定します。詳細については、データシートのレジスタの説明を参照してください。
*/ void MAX44000InterruptHandler() { uint8 i2cData[3]; i2cRead1Byte(MAX44000_ADDR,INT_STATUS_REG,&i2cData); if (i2cData&0x01 != 0) return; // check to make sure interrupt really fired // this simultaneously clears the interrupt flag if (screenStatus) { i2cData[0] = ON_DELAY; i2cData[1] = ON_THRESHOLD >> 8 & 0xBF; // set ABOVE = 0 i2cData[2] = ON_THRESHOLD & 0xFF; } else { i2cData[0] = OFF_DELAY; i2cData[1] = OFF_THRESHOLD >> 8 | 0x40; // set ABOVE = 1 i2cData[2] = OFF_THRESHOLD & 0xFF; } // set the new threshold depending on what the screen status was // set the delay and threshold after each interrupt i2cWriteBytes(MAX44000_ADDR,0x0A,i2cData,3); return; } // MAX44000InterruptHandler