APDS-9960 ジェスチャーセンサーとArduino
APDS-9960 ジェスチャーセンサーは、スワイプや近接といった手のジェスチャーを検出できます。本チュートリアルでは、APDS-9960 を Arduino に接続し、ジェスチャーを認識するようにプログラムする方法を示します。結果として、動きを検出してシリアルモニターで報告できるシンプルなセットアップが得られます。本ガイドは、ジェスチャーセンサーを始めるために必要な配線とコードの理解に役立ちます(ビデオ内 00:30)

ハードウェア解説
APDS-9960は、RGBカラー検出、周囲光検出、近接検出、ジェスチャー検出機能を組み合わせた多用途センサです。I2C経由でArduinoと通信し、配線を最小限に抑えて簡単に統合できます。センサは3.3Vでのみ動作するため、デバイスを損傷しないよう適切な電圧レベルを確保することが不可欠です。 この製作では、Arduinoを使ってジェスチャーデータを読み取ります。センサは割り込みを通じてジェスチャ情報を出力するため、Arduinoは手の動きに迅速に反応できます。APDS-9960をArduinoと統合することで、ジェスチャー制御デバイスを含む多くのインタラクティブなプロジェクトの可能性が広がります。
データシートの詳細
| 製造業者 | ブロードコム |
|---|---|
| 部品番号 | APDS-9960 |
| ロジック/入出力電圧 | 2.7〜3.6 V |
| 電源電圧 | 3.3ボルト |
| 出力電流(チャンネルごと) | 1 mA |
| ピーク電流(チャンネルあたり) | 10 mA |
| PWM周波数に関するガイダンス | 100ヘルツ |
| 入力ロジック閾値 | 0.3×VDD(低)、0.7×Vディー・ディー(高い) |
| 電圧降下 / Rドレイン・ソース間のオン抵抗/ 彩度 | 最大0.5 V |
| 温度制限 | -40〜+85 °C |
| パッケージ | 6ピンLGA |
| 備考 / バリエーション | I2C通信に対応 |
- 損傷を防ぐため、供給電圧が3.6 Vを超えないことを確認してください。
- 信頼性の高い通信のために、I2Cラインにはプルアップ抵抗を使用してください。
- 正確な測定のため、センサーを直射日光の当たらない場所に置いてください。
- コード内でセンサーを正しく初期化していることを確認してください。
- 配線の接続を確認して、入力が浮遊しないようにしてください。
配線手順

APDS-9960をArduinoに配線するには、まず電源を接続します。赤い配線を使ってAPDS-9960のVCCピンをArduinoの3.3Vピンに接続してください。次に、黒い配線を使ってセンサのGNDピンをArduinoのGNDピンに接続します。 次にI2C通信のために、APDS-9960のSDAピンをArduinoのA4ピンに接続します。同様にSCLピンをArduinoのA5ピンに接続します。最後にセンサのINTピンをArduinoのピン2に接続します。これによりセンサが生成する割り込みにArduinoが応答できるようになります。
コード例と解説
提供されたコードはAPDS-9960センサーを初期化し、Arduinoがジェスチャーを読み取るように設定します。以下はsetup関数の簡単な抜粋です:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
attachInterrupt(0, interruptRoutine, FALLING);
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
}
}このコードスニペットでは、シリアルモニタを初期化し、割り込みピンを設定します。センサーを初期化し、確認メッセージをコンソールに出力します。 次に、ループ関数内でジェスチャーをチェックします:
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}ここでは、ループがジェスチャーを継続的にチェックします。ジェスチャーが検出されると割り込みが無効化され、ジェスチャーを処理するためにhandleGesture関数が呼び出されます。 最後に、handleGesture関数が検出されたジェスチャーを処理します:
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
// Additional cases...
}
}
}この関数ではジェスチャーを読み取り、検出された方向に応じて対応するアクションを実行します。これにより手の動きに基づくインタラクティブな制御が可能になります。 コードを完全に理解するには、記事の下に掲載されている全文のプログラムを参照してください。

デモンストレーション/何を期待するか
セットアップが完了すると、Arduinoはジェスチャーを読み取り、検出した方向をシリアルモニターに表示します。簡単なテストとしては、センサーの前で手を上、下、左、または右に動かすことが含まれます。配線が正しく行われていれば、シリアルモニターに対応する出力が表示され、ジェスチャー認識が確認できます。フローティング入力には注意してください。不安定な読み取りにつながる可能性があります(ビデオの05:20で)。
動画のタイムスタンプ
- 00:00- はじめに
- 01:15- ハードウェアの概要
- 03:00- 配線手順
- 午前4:30- コードの解説
- 06:15- デモンストレーション
/*
* Arduino用のAPDS-9960ジェスチャーセンサーのコード
* このコードは、手を上下左右に動かすジェスチャーを検出するためのものです。他のジェスチャーも検出でき、別の何かを制御するために使用できます。
*
* APDS-9960ジェスチャーセンサーの動画を見る https://youtu.be/qzSgZV_fbxI
* このコードはhttps://robojax.comから入手できます。
*
* 動画内で使用されたコードは、Ahmad ShamshiriによってRobojax.comのために
* 2016年12月31日、カナダのオンタリオ州アジャックスで午前6時53分に
* 作成されました。このコードを共有する許可が与えられており、
* このノートはコードと共に保持されることが条件です。
* 免責事項:このコードは「現状のまま」であり、教育目的のみです。
*
* GestureTest.ino
* APDS-9960 RGBおよびジェスチャーセンサー
* Shawn Hymel @ SparkFun Electronics
* 2014年5月30日
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* APDS-9960のジェスチャー検出能力をテストします。
* I2C経由でAPDS-9960を構成し、ジェスチャーイベントを待ちます。
* スワイプの方向(上、下、左、右)を計算し、シリアルコンソールに表示します。
*
* NEARジェスチャーを行うには、手を
* センサーの上で遠くに持ち上げ、センサーの近く(2インチ以内)まで動かします。
* 1秒以上その状態を保ち、その後手を離します。
*
* FARジェスチャーを行うには、手を
* センサーの2インチ以内で1秒以上保持し、その後センサーの範囲外(出す)まで動かします。
*
* ハードウェア接続:
*
* 重要:APDS-9960は3.3Vのみを受け付けます!
*
* Arduinoピン APDS-9960ボード機能
*
* 3.3V VCC 電源
* GND GND グランド
* A4 SDA I2Cデータ
* A5 SCL I2Cクロック
* 2 INT 割り込み
*
* リソース:
* Wire.hおよびSparkFun_APDS-9960.hを含めてください。
*
* 開発環境の詳細:
* Arduino 1.0.5で記述されています。
* SparkFun Arduino Pro Mini 3.3Vでテストされています。
*
* このコードはビアウェアです。もし私(または他のSparkFunの
* 従業員)を地元で見かけたら、私たちのコードが役に立ったと思ったら、
* 一杯ごちそうしてください!
*
* 現状のままで配布されています。保証はありません。
*/
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // サーボを制御するためのサーボオブジェクトを作成する
// ピン
#define APDS9960_INT 2 // 割り込みピンである必要があります。
// 定数
// グローバル変数
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
// 割り込みピンを入力に設定する
pinMode(APDS9960_INT, INPUT);
// シリアルポートを初期化する
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// 割り込みサービスルーチンを初期化する
attachInterrupt(0, interruptRoutine, FALLING);
// APDS-9960を初期化する(I2Cと初期値を設定する)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// APDS-9960ジェスチャーセンサーエンジンの動作を開始します
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}
}
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
break;
case DIR_RIGHT:
Serial.println("RIGHT");
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
/*
* RoboJaxによってA.B.S.が2017年5月9日に修正
* カナダ、オンタリオ州アジャックスで。 www.RoboJax.com
*
* 元のソース:
* APDS-9960 RGBおよびジェスチャーセンサー
* Shawn Hymel @ SparkFun Electronics
* 2014年5月30日
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* 現状のまま配布されています;保証はありません。
*/
#include <Wire.h>
// RoboJaxによって追加されました
#include <Servo.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // サーボを制御するためのサーボオブジェクトを作成する // RoboJaxによって追加されました
// ピン
#define APDS9960_INT 2 // 割り込みピンでなければなりません
// 定数
// グローバル変数
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
myservo.attach(9); // 9ピンにサーボをサーボオブジェクトに接続します。
// 割込みピンを入力として設定する
pinMode(APDS9960_INT, INPUT);
// シリアルポートを初期化します
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// 割り込みサービスルーチンを初期化する
attachInterrupt(0, interruptRoutine, FALLING);
// APDS-9960を初期化する(I2Cと初期値を設定)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// APDS-9960 ジェスチャーセンサーエンジンの動作を開始します。
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}
}
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}
void interruptRoutine() {
isr_flag = 1;
}
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
myservo.write(180); // RoboJaxによって追加されました
break;
case DIR_RIGHT:
Serial.println("RIGHT");
myservo.write(0); // RoboJaxによって追加されました
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
リソースと参考文献
まだリソースはありません。