今日、ほとんどの電話には、アプリを開いたり閉じたり、音楽を開始したり、通話に参加したりするためのジェスチャー制御機能が備わっています。これは時間を節約するための非常に便利な機能であり、ジェスチャーでデバイスを制御するのもクールです。以前は、加速度計を使用して、ジェスチャー制御ロボットとジェスチャー制御エアマウスを構築していました。しかし今日、私たちはジェスチャーセンサーAPDS9960をArduinoとインターフェースすることを学びます 。このセンサーには、色を検出するためのRGBセンサーもあります。これは、このチュートリアルでも使用されます。そのため、ジェスチャーと色の検出に別々のセンサーを使用する必要はありませんが、色検出専用のセンサーが利用可能です。これは、Arduinoでカラーソーターマシンを構築するためにすでに使用しているTCS3200カラーセンサーです。
必要なコンポーネント
- Arduino UNO
- APDS9960RGBおよびジェスチャーセンサー
- 16x2 LCD
- DPDTスイッチ
- 100Kポットと10K抵抗
- ジャンパーケーブル
APDS-9960デジタル近接RGBおよびジェスチャセンサーの概要
APDS9960は多機能センサーです。ジェスチャー、周囲光、および光のRGB値を検出できます。このセンサーは近接センサーとしても使用でき、主にスマートフォンで使用され、通話中にタッチスクリーンを無効にします。
このセンサーは4つのフォトダイオードで構成されています。これらのフォトダイオードは、オンボードLEDによって送信される反射IRエネルギーを検出します。したがって、ジェスチャが実行されるたびに、このIRエネルギーが妨害されてセンサーに反射し、センサーがジェスチャに関する情報(方向、速度)を検出し、デジタル情報に変換します。このセンサーは、反射したIR光を検出することで障害物の距離を測定するために使用できます。 RGBカラーを検知するためのUVおよびIRブロッキングフィルターを備えており、各カラーの16ビットデータを生成します。
APDS-9960センサーのピン配列を以下に示します。このセンサは、I上で動作2 C通信プロトコル。1µAの電流を消費し、3.3Vで給電されるため、5Vピンで接続しないように注意してください。ここでINTピンはI駆動するために使用される割り込みピン、ある2 C通信を。また、PSジャンパーが接続されていない場合、VLピンはオンボードLEDのオプションの電源ピンです。PSジャンパーが閉じている場合は、VCCピンに電力を供給するだけで、モジュールとIRLEDの両方に電力が供給されます。
回路図
ArduinoとAPDS960の接続は非常に簡単です。 DPDTボタンを使用して、RGBセンシングとジェスチャセンシングの2つのモードを切り替えます。まず、APDS9960のI2C通信ピンSDAとSCLをそれぞれArduinoピンA4とA5に接続します。前述のように、センサーの動作電圧は3.3Vであるため、APDS9960のVCCとGNDはArduinoの3.3VとGNDに接続されています。 APDS9960の割り込みピン(INT)はArduinoのD2ピンに接続されています。
ためのLCD、データピン(D4-D7)は、デジタルピンアルドゥイーノのD6-D3とRSとENピンに接続されているD6とアルドゥイーノのD7に接続されています。LCDのV0はポットに接続され、100KポットはLCDの明るさを制御するために使用されます。DPDTボタンには、3つのピンのみを使用しました。2番目のピンは入力用にArduinoのD7ピンに接続され、他の2つはGNDとVCCに接続され、その後に10Kの抵抗が続きます。
ジェスチャーとカラーセンシングのためのArduinoのプログラミング
プログラミングの部分はシンプルで簡単で、デモビデオ付きの完全なプログラムはこのチュートリアルの最後にあります。
まず、Sparkfun製のライブラリをインストールする必要があります。このライブラリをインストールするには、 [スケッチ]-> [ライブラリを含める]-> [ライブラリの管理]に 移動し ます。
検索バーに「SparkfunAPDS9960」と入力し、ライブラリが表示されたらインストールボタンをクリックします。
そして、私たちは行く準備ができています。始めましょう。
したがって、最初に、必要なすべてのヘッダーファイルをインクルードする必要があります。最初のヘッダーファイル LiquidCrystal.h は、LCD機能に使用されます。第二ヘッダーファイル Wire.hは Iのために使用される2 C通信と最後 SparkFun_APDS996.hは APDS9960センサに使用されます。
#include
次の行では、ボタンとLCDのピンを定義しました。
const int buttonPin = 7; const int rs = 12、en = 11、d4 = 6、d5 = 5、d6 = 4、d7 = 3; LiquidCrystal lcd(rs、en、d4、d5、d6、d7);
次の部分では、デジタルピン2に接続されている割り込みピンのマクロと、ボタンの現在の状態を 表す 1つの変数 buttonState 、および割り込みサービスルーチンの isr_flag を 定義し ました。
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
次に、SparkFun_APDS9960のオブジェクトが作成され、ジェスチャの動きにアクセスしてRGB値を取得できるようになります。
SparkFun_APDS9960 apds = SparkFun_APDS9960(); uint16_tambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
セットアップ 機能、最初の行は、ボタン(低/高)の値を取得することであり、第二および第三のラインの定義は、入力として割り込みボタンピン。 apds.init() はAPDS9960センサーを初期化し、 lcd.begin(16,2) はLCDを初期化します。
void setup() { buttonState = digitalRead(buttonPin); pinMode(APDS9960_INT、INPUT); pinMode(buttonPin、INPUT); apds.init(); lcd.begin(16、2); }
内 ループ 機能最初の行は、ボタン、それが中に記憶から値を取得し buttonStateの 変数先に定義しました。次の行では、ボタンからの値を確認しています。値が高い場合は光センサーを有効にし、低い場合はジェスチャーセンサーを初期化します。
attachInterrupt()は、 この場合には、センサの割り込みで外部割込みを使用する関数です。この関数の最初の引数は割り込み番号です。Arduino UNOには、INT.0とINT.1で示される2つの割り込みピンデジタルピン-2と3があります。そして、それをピン2に接続したので、そこに0を書き込みました。2番目の引数は、後で定義される関数 interruptRoutine() を呼び出します。最後の引数は FALLINGである ため、ピンがHighからLowになったときに割り込みがトリガーされます。Arduino割り込みの詳細については、こちらをご覧ください。
void loop() { buttonState = digitalRead(buttonPin); if(buttonState == HIGH) { apds.enableLightSensor(true); }
次の部分では、ボタンピンをチェックします。高い場合は、RGBセンサーのプロセスを開始します。次に、光センサーが値を読み取っているかどうかを確認します。値を読み取れない場合は、「 ライト値の読み取りエラー 」 を出力します。 そして、値を読み取ることができる場合は、3つの色の値を比較し、最も高い方の色をLCDに印刷します。
if(buttonState == HIGH) { if(!apds.readAmbientLight(ambient_light)- !apds.readRedLight(red_light)- !apds.readGreenLight(green_light)- !apds.readBlueLight(blue_light)){ lcd.print( "ライト値の読み取りエラー"); } else { if(red_light> green_light) { if(red_light> blue_light) { lcd.print( "Red"); 遅延(1000); lcd.clear(); } ……。 ………..
次の行で、ボタンピンを再度確認し、ボタンピンが低い場合は、ジェスチャーセンサーを処理します。次に、 isr_flag を確認し、それが1の場合、関数 detachInterrupt() が呼び出されます。この関数は、割り込みをオフにするために使用されます。次の行は、 後で 定義される関数である handleGesture() を呼び出します。次の行では、 isr_flag をゼロに定義し、割り込みをアタッチします。
else if(buttonState == LOW) { if(isr_flag == 1) { detachInterrupt(0); handleGesture(); isr_flag = 0; attachInterrupt(0、interruptRoutine、FALLING); } }
次は interruptRoutine() 関数です。この関数は、 isr_flag 変数1をオンにして、割り込みサービスを初期化できるようにするために使用されます。
voidinterruptRoutine()。 { isr_flag = 1; }
handleGesture() 関数は次の部分で定義されています。この機能は、最初にジェスチャセンサーの可用性をチェックします。使用可能な場合は、ジェスチャ値を読み取り、それがどのジェスチャ(UP、DOWN、RIGHT、LEFT、FAR、NEAR)であるかを確認し、対応する値をLCDに出力します。
void handleGesture() { if(apds.isGestureAvailable()) { switch(apds.readGesture()) { case DIR_UP: lcd.print( "UP"); 遅延(1000); lcd.clear(); ブレーク; ケースDIR_DOWN: lcd.print( "DOWN"); 遅延(1000); lcd.clear(); ブレーク; ケースDIR_LEFT: lcd.print( "LEFT"); 遅延(1000); lcd.clear(); ブレーク; ケースDIR_RIGHT: lcd.print( "RIGHT"); 遅延(1000); lcd.clear(); ブレーク; ケースDIR_NEAR: lcd.print( "NEAR"); 遅延(1000); lcd.clear(); ブレーク; ケースDIR_FAR: lcd.print( "FAR"); 遅延(1000); lcd.clear(); ブレーク; デフォルト: lcd.print( "NONE"); 遅延(1000); lcd.clear(); } } }
最後に、コードをArduinoにアップロードし、センサーが初期化されるのを待ちます。ボタンがオフになっている間は、ジェスチャーモードになっていることを意味します。ですから、手を左、右、上、下の方向に動かしてみてください。以下のために 遠く ジェスチャー、2-3秒のためのセンサー2〜4インチの距離であなたの手を維持し、それを削除。そして、のために 近く のジェスチャーその後、近くにそれを取ると、それを削除し、センサから遠くに手を保ちます。
次に、ボタンをオンにしてカラーセンシングモードにし、センサーの近くにある赤、青、緑のオブジェクトを1つずつ取り出します。オブジェクトの色を印刷します。