Sensor Gerakan APDS-9960 dengan Arduino
Sensor gesture APDS-9960 memungkinkan pendeteksian gerakan tangan seperti sapuan dan kedekatan. Dalam tutorial ini, kami akan menunjukkan cara menghubungkan APDS-9960 ke Arduino dan memprogramnya untuk mengenali gerakan. Hasilnya akan menjadi pengaturan sederhana yang dapat mendeteksi pergerakan dan melaporkannya melalui monitor serial. Panduan ini akan membantu Anda memahami pengkabelan dan kode yang diperlukan untuk memulai dengan sensor gesture. (dalam video pada 00:30)

Penjelasan Perangkat Keras
APDS-9960 adalah sensor serbaguna yang menggabungkan penginderaan warna RGB, penginderaan cahaya sekitar, penginderaan kedekatan, dan kemampuan deteksi gerakan. Ia berkomunikasi dengan Arduino melalui I2C, yang memungkinkan integrasi mudah dengan pengkabelan minimal. Sensor hanya beroperasi pada 3.3V, sehingga penting memastikan tingkat tegangan yang tepat untuk menghindari kerusakan perangkat. Dalam proyek ini, kita akan menggunakan Arduino untuk membaca data gerakan. Sensor mengeluarkan informasi gerakan melalui interupsi, yang memungkinkan Arduino merespons cepat terhadap gerakan tangan. Integrasi APDS-9960 dengan Arduino membuka banyak kemungkinan untuk proyek interaktif, termasuk perangkat yang dikendalikan dengan gerakan.
Rincian Lembar Data
| Produsen | Broadcom |
|---|---|
| Nomor suku cadang | APDS-9960 |
| Tegangan logika/IO | 2.7 - 3.6 V |
| Tegangan catu daya | 3.3 V |
| Arus keluaran (per saluran) | 1 mA |
| Arus puncak (per saluran) | 10 mA |
| Panduan frekuensi PWM | 100 Hz |
| Ambang logika masukan | 0.3 kali VDD(rendah), 0.7 x VDD(tinggi) |
| Penurunan tegangan / RDS(on)/ saturasi | 0,5 V maks. |
| Batas termal | -40 sampai +85 °C |
| Paket | 6-pin LGA |
| Catatan / varian | Mendukung komunikasi I2C |
- Pastikan tegangan catu daya tidak melebihi 3.6 V untuk mencegah kerusakan.
- Gunakan resistor pull-up pada jalur I2C untuk komunikasi yang dapat diandalkan.
- Jauhkan sensor dari sinar matahari langsung agar pembacaan akurat.
- Pastikan menginisialisasi sensor dengan benar dalam kode.
- Periksa sambungan kabel untuk menghindari input yang mengambang.
Petunjuk Pengkabelan

Untuk menghubungkan APDS-9960 ke Arduino, mulailah dengan menyambungkan daya. Gunakan kabel merah untuk menghubungkan pin VCC pada APDS-9960 ke pin 3.3V pada Arduino. Selanjutnya, hubungkan pin GND pada sensor ke pin GND pada Arduino menggunakan kabel hitam. Sekarang, untuk komunikasi I2C, hubungkan pin SDA APDS-9960 ke pin A4 pada Arduino. Demikian pula, hubungkan pin SCL ke pin A5 pada Arduino. Terakhir, hubungkan pin INT sensor ke pin 2 pada Arduino. Ini akan memungkinkan Arduino merespons interupsi yang dihasilkan oleh sensor.
Contoh Kode & Panduan Langkah demi Langkah
Kode yang disediakan menginisialisasi sensor APDS-9960 dan menyiapkan Arduino untuk membaca gerakan. Berikut cuplikan singkat dari fungsi setup:
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
attachInterrupt(0, interruptRoutine, FALLING);
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
}
}Pada cuplikan ini, kita menginisialisasi monitor serial dan mengatur pin interupsi. Sensor diinisialisasi, dan pesan konfirmasi dicetak ke konsol. Selanjutnya, kita memeriksa gerakan di fungsi loop:
void loop() {
if( isr_flag == 1 ) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
}Di sini, perulangan terus-menerus memeriksa gerakan. Ketika sebuah gerakan terdeteksi, interupsi dinonaktifkan, dan fungsi `handleGesture` dipanggil untuk memproses gerakan tersebut. Akhirnya, fungsi `handleGesture` memproses gerakan yang terdeteksi:
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
// Additional cases...
}
}
}Dalam fungsi ini, isyarat dibaca, dan tindakan yang sesuai diambil berdasarkan arah yang terdeteksi. Hal ini memungkinkan kontrol interaktif berdasarkan gerakan tangan. Untuk memahami kode secara lengkap, silakan merujuk pada program lengkap yang dimuat di bawah artikel.

Demonstrasi / Apa yang Diharapkan
Setelah penyiapan selesai, Anda dapat mengharapkan Arduino membaca gestur dan menampilkan arah yang terdeteksi pada monitor serial. Tes sederhana meliputi menggerakkan tangan Anda ke atas, ke bawah, ke kiri, atau ke kanan di depan sensor. Jika semuanya terhubung dengan benar, Anda akan melihat keluaran yang sesuai di monitor serial, yang mengonfirmasi pengenalan gestur. Berhati-hatilah terhadap input yang mengambang, karena dapat menyebabkan pembacaan yang tidak konsisten (dalam video pada 05:20).
Tanda Waktu Video
- 00:00- Pendahuluan
- 01:15- Gambaran Umum Perangkat Keras
- 03:00- Instruksi Pengkabelan
- 04:30- Tinjauan Kode
- 06:15- Demonstrasi
/*
* Code for APDS-9960 Gesture sensor for Arduino
* This code is to detect gestures of your hand, either moving it up, down, left, or right; other gestures.
* can be detected and used to control something else.
* Watch the APDS-9960 Gesture sensor video https://youtu.be/qzSgZV_fbxI
* Get this code from https://robojax.com
* Code used in video by Ahmad Shamshiri for Robojax.com
* on December 31, 2016, at 6:53 AM in Ajax, Ontario, Canada
* Permission granted to share this code, given that this
* note is kept with the code.
* Disclaimer: this code is "AS IS" and for educational purposes only.
GestureTest.ino
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
Tests the gesture sensing abilities of the APDS-9960. Configures
APDS-9960 over I2C and waits for gesture events. Calculates the
direction of the swipe (up, down, left, right) and displays it
on a serial console.
To perform a NEAR gesture, hold your hand
far above the sensor and move it close to the sensor (within 2
inches). Hold your hand there for at least 1 second and then move it
away.
To perform a FAR gesture, hold your hand within 2 inches of the
sensor for at least 1 second and then move it away (out of
range) of the sensor.
Hardware Connections:
IMPORTANT: The APDS-9960 can only accept 3.3V!
Arduino Pin APDS-9960 Board Function
3.3V VCC Power
GND GND Ground
A4 SDA I2C Data
A5 SCL I2C Clock
2 INT Interrupt
Resources:
Include Wire.h and SparkFun_APDS-9960.h
Development environment specifics:
Written in Arduino 1.0.5
Tested with SparkFun Arduino Pro Mini 3.3V
This code is beerware; if you see me (or any other SparkFun
employee) at the local, and you've found our code helpful, please
buy us a round!
Distributed as-is; no warranty is given.
***************************************************************
*/
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // create servo object to control a servo
// Pins
#define APDS9960_INT 2 // Needs to be an interrupt pin
// Constants
// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
// Set interrupt pin as input
pinMode(APDS9960_INT, INPUT);
// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Initialize interrupt service routine
attachInterrupt(0, interruptRoutine, FALLING);
// Initialize APDS-9960 (configure I2C and initial values)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Start running the APDS-9960 gesture sensor engine
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");
}
}
}
/****************************************************************
Modified for RoboJax by A.B.S. on May 09, 2017
in Ajax, Ontario, Canada. www.RoboJax.com
Original Source:
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
Distributed as-is; no warranty is given.
****************************************************************/
#include <Wire.h>
// added by RoboJax
#include <Servo.h>
#include <SparkFun_APDS9960.h>
Servo myservo; // create servo object to control a servo // added by RoboJax
// Pins
#define APDS9960_INT 2 // Needs to be an interrupt pin
// Constants
// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
// Set interrupt pin as input
pinMode(APDS9960_INT, INPUT);
// Initialize Serial port
Serial.begin(9600);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Initialize interrupt service routine
attachInterrupt(0, interruptRoutine, FALLING);
// Initialize APDS-9960 (configure I2C and initial values)
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Start running the APDS-9960 gesture sensor engine
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); // added by RoboJax
break;
case DIR_RIGHT:
Serial.println("RIGHT");
myservo.write(0); // added by RoboJax
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
Hal-hal yang mungkin Anda butuhkan
-
Amazon
-
eBay
-
AliExpressPurchase APDS-9960 gesture sensor from AliExpresss.click.aliexpress.com
Sumber daya & referensi
Belum ada sumber daya.
Berkas📁
File lainnya
-
Datasheet APDS9960ini adalah lembar data untuk chip APDS9960. lihat file ini untuk mempelajari lebih lanjut tentangnya.
robojax-gesture-APDS9960_datasheet.pdf0.89 MB -
APDS9960 Gesture LibraryArduino library for the APDS9960 gesture, proximity, and color sensor. Provides functions to initialize the sensor, read gesture data, and configure detection thresholds. Supports I2C interface and operates at 3.3V.
robojax-APDS9960-gesture-library.zip0.30 MB -
APDS9960 Gesture DatasheetDatasheet for the APDS9960 digital proximity, ambient light, RGB and gesture sensor. Features I2C interface, gesture detection with directional output, and operates at 2.4-3.6V.
robojax-APDS9960-gesture-datasheet.pdf0.89 MB -