Если ты хочешь добавить в свой проект управление жестами — смахни вверх, вниз, влево, вправо — и не хочешь связываться с камерами и машинным обучением, то APDS-9960 это именно тот датчик, с которого стоит начать. Маленький, дешёвый, работает по I2C и умеет не только в жесты, но и в цвет, проксиметрию и освещённость. Разберёмся, как его правильно спаять, подключить и заставить работать.
- Что за зверь APDS-9960 и что он реально умеет
- Что понадобится для сборки
- Распиновка и подключение
- Если собираешь на своей плате с нуля
- Адрес I2C и проверка подключения
- Настройка датчика для работы с жестами
- Как читать жесты
- Практические ограничения, о которых молчат
- Частые ошибки при сборке
- Как лучше сделать: готовый модуль или своя плата
- Пример минимального скетча для Arduino
- Итог: что делать дальше
Что за зверь APDS-9960 и что он реально умеет
APDS-9960 — это многофункциональный сенсор от Broadcom (ранее Avago). На крошечной платке собраны четыре фотодиода, светодиоды для подсветки, ИК-излучатель и процессор, который всё это обрабатывает.
Что он может:
- Распознавать четыре направления жестов: вверх, вниз, влево, вправо
- Определять приближение объекта (проксиметрия)
- Измерять освещённость и цвет (RGB + clear)
- Работать через I2C с напряжением 3.3V
Чего он не может: не распознаёт сложные жесты вроде вращения, не понимает касания, не работает через непрозрачные материалы. Если тебе нужно просто «махнул рукой — переключил трек», этого датчика хватит с головой.
Что понадобится для сборки
Готовые модули на APDS-9960 продаются на AliExpress и маркетплейсах — выглядят как маленькая плата с восемью пинами. Но если ты хочешь впаять сам или собрать на своей плате, вот что нужно:
| Компонент | Назначение | На что обратить внимание |
|---|---|---|
| APDS-9960 (чип или модуль) | Основной сенсор | Если берёшь голый чип — нужна обвязка и кварц. Модуль уже всё содержит. |
| Резистор 4.7 кОм | Подтяжка линии SDA (I2C) | На готовых модулях уже впаян. Если собираешь с нуля — обязателен. |
| Резистор 4.7 кОм | Подтяжка линии SCL (I2C) | То же самое. |
| Конденсатор 100 нФ (керамика) | Бypass питания | Ставится как можно ближе к пинам VCC и GND чипа. |
| Конденсатор 1 мкФ (керамика или тантал) | Фильтр питания | Для стабильности напряжения, особенно если питание не очень чистое. |
| Конденсатор 4.7 мкФ | Стабилизатор на модуле | На готовых платах уже есть. |
| Стабилизатор 3.3V (если нужно) | Питание датчика | APDS-9960 работает от 3.3V. Если у тебя 5V логика — нужен стабилизатор. |
Если берёшь готовый модуль — тебе нужен только он, провода и микроконтроллер. Всё остальное уже распаяно.
Распиновка и подключение
На готовом модуле восемь пинов. Вот они:
- VIN — питание (3.3V, некоторые модули допускают 5V если на борту стабилизатор)
- GND — земля
- 3V3 — выход стабилизатора 3.3V (если есть на модуле)
- SCL — тактовая линия I2C
- SDA — линия данных I2C
- INT — прерывание (активный низкий уровень)
- PS — питание проксиметрического светодиода
- GND — ещё один пин земли
Подключение к Arduino или ESP32 тривиальное:
- VIN → 3.3V (или 5V, если модуль с стабилизатором)
- GND → GND
- SCL → SCL (например, GPIO22 на ESP32, A5 на Arduino Uno)
- SDA → SDA (например, GPIO21 на ESP32, A4 на Arduino Uno)
- INT → любой GPIO (опционально, для прерываний)
Пин INT — это то, что реально упрощает жизнь. Вместо того чтобы постоянно опрашивать датчик, ты настраиваешь прерывание и обрабатываешь жест только когда он произошёл. Подтяжка на этом пине — 10 кОм к 3.3V.
Если собираешь на своей плате с нуля
Голый чип APDS-9960 — это QFN-корпус с 38 ножками. Впаять его паяльником нереально, нужен фен и паста. Вот минимальная обвязка:
- Подключи VDD (3.3V) через конденсатор 100 нФ к GND как можно ближе к чипу
- Подтяни SDA и SCL резисторами 4.7 кОм к VDD
- Подключи кварц 12 МГц с нагрузочными конденсаторами 22 пФ (если не используешь внутренний осциллятор)
- Пин PS подключи через резистор 100 Ом к VDD — это питание ИК-светодиода для жестов
- Пин INT подтяни к VDD через 10 кОм
- Все выводы GND соедини с общей землёй
Если не хочешь заморачиваться с голым чипом — бери готовый модуль. Разница в цене копеечная, а головной боли ноль.
Адрес I2C и проверка подключения
APDS-9960 имеет фиксированный адрес I2C: 0x39. Он не настраивается. Если твой сканер I2C не находит устройство по этому адресу — проблема в подключении или питании.
Быстрый тест: загрузи скетч I2C Scanner в Arduino, подключи только VCC, GND, SDA, SCL. Если видишь 0x39 — всё ок. Если нет — проверь подтяжки, питание и пайку контактов.
Настройка датчика для работы с жестами
Датчик не начинает работать сам по себе после подачи питания. Его нужно инициализировать и настроить. Вот последовательность, которая реально работает:
- Включи проксиметрию — без неё жесты не работают. Запиши 0x01 в регистр ENABLE (адрес 0x80)
- Включи движок жестов — запиши 0x41 в регистр ENABLE (0x80). Это активирует и проксиметрию, и жесты
- Настрой усиление проксиметрии — регистр CONTROL (0x8F). Значение 0x20 — усиление 4x, хороший старт
- Настрой усиление фотодиодов — регистр GCONF3 (0xAA). Значение 0x00 — усиление 1x
- Настрой порог жеста — регистр GPENTH (0xA0) для входа и GEXTH (0xA1) для выхода. Начни с значений 0x05 и 0x10
- Настрой направления — регистр GCONF4 (0xAB). Бит 0 включает движок жестов, бит 1 — маска прерывания
После этой настройки датчик начнёт накапливать данные о жестах во внутреннем FIFO-буфере. Когда буфер заполнится (обычно 4 сэмпла), на пине INT появится низкий уровень — сигнал, что жест распознан.
Как читать жесты
Когда срабатывает прерывание, нужно прочитать данные из регистров жестов. Вот алгоритм:
- Проверь регистр GSTATUS (0xAE) — бит 0 должен быть 1, если данные готовы
- Прочитай регister GDAT (0xFC) — там количество сэмплов в FIFO
- Читай данные блоками по 4 байта из регистра 0xFC (High, Low, High, Low — это Up, Down, Left, Right)
- Анализируй последовательность переходов между фотодиодами
Каждый сэмпл — это значения с четырёх фотодиодов. Когда рука проходит слева направо, сначала срабатывает левый фотодиод, потом правый. Датчик фиксирует эти переходы и определяет направление.
Библиотека Adafruit_APDS9960 делает всё это за тебя. Достаточно вызвать gesture() и получить результат: GESTURE_UP, GESTURE_DOWN, GESTURE_LEFT, GESTURE_RIGHT или GESTURE_NONE.
Практические ограничения, о которых молчат
Вот что я выяснил на практике, а не из даташита:
- Расстояние — жесты работают на расстоянии 5–15 см от датчика. Ближе — насыщение, дальше — не ловит
- Скорость — рука должна двигаться не слишком быстро. Если махнуть за 0.2 секунды — датчик может не успеть
- Освещение — прямой солнечный свет с ИК-составляющей может мешать. В помещении работает стабильно
- Материал окошка — датчик должен быть прикрыт тёмным материалом, пропускающим ИК. Обычный чёрный акрил или плёнка от старого ТВ. Прозрачный пластик не подходит — он рассеивает ИК
- Один жест за раз — нельзя сделать два жеста подряд без паузы. Между жестами нужно держать руку вне зоны видимости хотя бы 0.5–1 секунду
Частые ошибки при сборке
Ошибка 1: Подают 5V на голый чип без стабилизатора. APDS-9960 работает от 3.3V. Подашь 5V — сгорит. Проверь даташит своего модуля: если на нём есть стабилизатор (маленький чип с тремя ногами), можно 5V. Если нет — только 3.3V.
Ошибка 2: Забывают подтяжки на I2C. Без резисторов 4.7 кОм на SDA и SCL шина не работает. На готовых модулях они есть, но если собираешь на своей плате — обязательно поставь.
Ошибка 3: Не включают проксиметрию перед жестами. Движок жестов использует данные проксиметрии. Если проксиметрия выключена — жесты не работают. Это неочевидно из даташита.
Ошибка 4: Слишком яркое окошко. Если окошко над датчиком слишком прозрачное или отсутствует — ИК-свет от светодиода отражается от поверхности и возвращается обратно, датчик «слепнет». Нужен ИК-фильтр.
Ошибка 5: Читают жесты без проверки прерывания. Если постоянно опрашивать датчик в цикле, можно пропустить жест или прочитать неполные данные. Лучше использовать пин INT и прерывание.
Как лучше сделать: готовый модуль или своя плата
Зависит от твоей задачи:
- Прототип или хобби-проект — бери готовый модуль. Стоит дёшево, уже со всей обвязкой, паяешь четыре провода и работает. Никакой разводки платы, никакой пайки SMD.
- Серийное устройство или компактный форм-фактор — тогда имеет смысл впаять голый чип на свою плату. Но это уже история про пайку феном, пасту и вероятный брак при первых попытках.
- Нужна только проксиметрия без жестов — можно даже не подключать регистры жестов, настроить только проксиметрию и использовать её как датчик приближения.
Пример минимального скетча для Arduino
Если используешь библиотеку Adafruit, всё сводится к нескольким строчкам:
#include <Wire.h>
#include <Adafruit_APDS9960.h>
Adafruit_APDS9960 apds;
void setup() {
Serial.begin(115200);
if (!apds.begin()) {
Serial.println("APDS-9960 не найден");
while (1);
}
apds.enableProximity(true);
apds.enableGesture(true);
}
void loop() {
uint8_t gesture = apds.readGesture();
if (gesture == APDS9960_DOWN) Serial.println("Вниз");
if (gesture == APDS9960_UP) Serial.println("Вверх");
if (gesture == APDS9960_LEFT) Serial.println("Влево");
if (gesture == APDS9960_RIGHT) Serial.println("Вправо");
}
Обрати внимание: readGesture() блокирует выполнение, пока не появится жест. Для неблокирующего кода используй пин INT и прерывание — это лучше, если у тебя есть другие задачи в loop().
Итог: что делать дальше
Если ты только начинаешь — купи готовый модуль APDS-9960, подключи по I2C к Arduino или ESP32, поставь библиотеку Adafruit и проверь на примерах. Убедись, что над датчиком стоит ИК-фильтр (кусочек тёмного пластика), и что питание 3.3V.
Когда заработает — экспериментируй с настройками усиления и порогов, чтобы подогнать чувствительность под свой корпус и расстояние. Если датчик не находит — проверь подтяжки, питание и адрес I2C. Если жесты работают через раз — замедли движение руки и проверь окошко.
APDS-9960 — не идеальный датчик, но для простого управления жестами в компактных проектах он один из лучших вариантов по соотношению цена/простота/функциональность.



