Датчик жестов APDS-9960 с Arduino
Датчик жестов APDS-9960 позволяет обнаруживать жесты рук, такие как свайпы и близость. В этом руководстве мы покажем, как подключить APDS-9960 к Arduino и запрограммировать его для распознавания жестов. Результатом будет простая установка, которая может обнаруживать движения и передавать их через последовательный монитор. Этот гайд поможет вам понять проводку и код, необходимые для начала работы с датчиком жестов. (в видео на 00:30)

Аппаратное обеспечение объяснено
APDS-9960 — это универсальный сенсор, который сочетает в себе возможности RGB-цветового sensing, определения уровня окружающего света, определения близости и распознавания жестов. Он совместим с Arduino через I2C, что обеспечивает легкую интеграцию с минимальным количеством проводов. Сенсор работает только на 3,3 В, поэтому важно обеспечить правильные уровни напряжения, чтобы избежать повреждения устройства. В этой сборке мы будем использовать Arduino для считывания данных жестов. Сенсор передает информацию о жестах через прерывания, что позволяет Arduino быстро реагировать на движения рук. Интеграция APDS-9960 с Arduino открывает множество возможностей для интерактивных проектов, включая устройства с управлением жестами.
Технические характеристики
| Производитель | Бродком |
|---|---|
| Номер детали | APDS-9960 |
| Логическое/входное напряжение | 2.7 - 3.6 В |
| Напряжение питания | 3,3 В |
| Выходной ток (на канал) | 1 мА |
| Пиковый ток (на канал) | 10 мА |
| Рекомендации по частоте PWM | 100 Гц |
| Входные логические пороги | 0.3 x VDD(низкий), 0.7 x VДД(высокий) |
| Падение напряжения / RДС(включено)/ насыщение | 0.5 В макс |
| Термические ограничения | -40 до +85 °C |
| пакет | 6-pin LGA |
| Заметки / варианты | Поддерживает I2C-связь |
- Убедитесь, что напряжение питания не превышает 3,6 В, чтобы избежать повреждений.
- Используйте подтягивающие резисторы на линиях I2C для надежной связи.
- Держите датчик подальше от прямых солнечных лучей для точных показаний.
- Убедитесь, что датчик правильно инициализирован в коде.
- Проверьте соединения проводки, чтобы избежать "плавающих" входов.
Инструкции по проводке

Для подключения APDS-9960 к Arduino начните с подключения питания. Используйте красный провод, чтобы соединить вывод VCC APDS-9960 с выводом 3.3В на Arduino. Далее подключите вывод GND сенсора к заземляющему выводу на Arduino с помощью черного провода. Теперь, для связи по I2C, подключите вывод SDA APDS-9960 к выводу A4 на Arduino. Аналогично, подключите вывод SCL к выводу A5 на Arduino. Наконец, подключите вывод INT сенсора к выводу 2 на Arduino. Это позволит Arduino реагировать на прерывания, сгенерированные сенсором.
Примеры кода и пошаговая инструкция
Предоставленный код инициализирует датчик APDS-9960 и настраивает Arduino для считывания жестов. Вот краткий фрагмент функции настройки:
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- Инструкции по проводке
- 04:30- Прогулка по коду
- 06:15- Демонстрация
/*
* Код для датчика жестов APDS-9960 для Arduino
* Этот код предназначен для обнаружения жестов вашей руки: движения вверх, вниз, влево или вправо; другие жесты могут быть обнаружены и использованы для управления чем-то еще.
*
* Посмотрите видео о датчике жестов APDS-9960 https://youtu.be/qzSgZV_fbxI
* Получите этот код на https://robojax.com
*
* Код, использованный в видео, Ахмада Шамшири для Robojax.com
* 31 декабря 2016 года, в 6:53 AM в Ajax, Ontario, Canada
* Разрешение на распространение этого кода дано при условии, что это
* замечание будет сохранено вместе с кодом.
* Отказ от ответственности: этот код является "КАК ЕСТЬ" и предназначен только для образовательных целей.
*
* GestureTest.ino
* Датчик RGB и жестов APDS-9960
* Шон Хаймел @ SparkFun Electronics
* 30 мая 2014 года
* https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
*
* Тестирует способности датчика жестов APDS-9960. Конфигурирует
* APDS-9960 через I2C и ждет событий жестов. Вычисляет
* направление свайпа (вверх, вниз, влево, вправо) и отображает это
* в консоли.
*
* Чтобы выполнить жест 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
*
* Этот код - beerware; если вы увидите меня (или любого другого сотрудника 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 А.Б.С. 9 мая 2017 года в Аякс, Онтарио, Канада. www.RoboJax.com
*
* Оригинальный источник:
* APDS-9960 RGB и датчик жестов
* Шон Хаймел @ SparkFun Electronics
* 30 мая 2014 года
* 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");
}
}
}
Ресурсы и ссылки
Ресурсов пока нет.