Как собрать и спаять модуль распознавания жестов на базе APDS-9960

Если ты хочешь добавить в свой проект управление жестами — смахни вверх, вниз, влево, вправо — и не хочешь связываться с камерами и машинным обучением, то APDS-9960 это именно тот датчик, с которого стоит начать. Маленький, дешёвый, работает по I2C и умеет не только в жесты, но и в цвет, проксиметрию и освещённость. Разберёмся, как его правильно спаять, подключить и заставить работать.

Что за зверь 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 логика — нужен стабилизатор.

Если берёшь готовый модуль — тебе нужен только он, провода и микроконтроллер. Всё остальное уже распаяно.

Распиновка и подключение

На готовом модуле восемь пинов. Вот они:

  1. VIN — питание (3.3V, некоторые модули допускают 5V если на борту стабилизатор)
  2. GND — земля
  3. 3V3 — выход стабилизатора 3.3V (если есть на модуле)
  4. SCL — тактовая линия I2C
  5. SDA — линия данных I2C
  6. INT — прерывание (активный низкий уровень)
  7. PS — питание проксиметрического светодиода
  8. 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 ножками. Впаять его паяльником нереально, нужен фен и паста. Вот минимальная обвязка:

  1. Подключи VDD (3.3V) через конденсатор 100 нФ к GND как можно ближе к чипу
  2. Подтяни SDA и SCL резисторами 4.7 кОм к VDD
  3. Подключи кварц 12 МГц с нагрузочными конденсаторами 22 пФ (если не используешь внутренний осциллятор)
  4. Пин PS подключи через резистор 100 Ом к VDD — это питание ИК-светодиода для жестов
  5. Пин INT подтяни к VDD через 10 кОм
  6. Все выводы GND соедини с общей землёй

Если не хочешь заморачиваться с голым чипом — бери готовый модуль. Разница в цене копеечная, а головной боли ноль.

Адрес I2C и проверка подключения

APDS-9960 имеет фиксированный адрес I2C: 0x39. Он не настраивается. Если твой сканер I2C не находит устройство по этому адресу — проблема в подключении или питании.

Быстрый тест: загрузи скетч I2C Scanner в Arduino, подключи только VCC, GND, SDA, SCL. Если видишь 0x39 — всё ок. Если нет — проверь подтяжки, питание и пайку контактов.

Настройка датчика для работы с жестами

Датчик не начинает работать сам по себе после подачи питания. Его нужно инициализировать и настроить. Вот последовательность, которая реально работает:

  1. Включи проксиметрию — без неё жесты не работают. Запиши 0x01 в регистр ENABLE (адрес 0x80)
  2. Включи движок жестов — запиши 0x41 в регистр ENABLE (0x80). Это активирует и проксиметрию, и жесты
  3. Настрой усиление проксиметрии — регистр CONTROL (0x8F). Значение 0x20 — усиление 4x, хороший старт
  4. Настрой усиление фотодиодов — регистр GCONF3 (0xAA). Значение 0x00 — усиление 1x
  5. Настрой порог жеста — регистр GPENTH (0xA0) для входа и GEXTH (0xA1) для выхода. Начни с значений 0x05 и 0x10
  6. Настрой направления — регистр GCONF4 (0xAB). Бит 0 включает движок жестов, бит 1 — маска прерывания

После этой настройки датчик начнёт накапливать данные о жестах во внутреннем FIFO-буфере. Когда буфер заполнится (обычно 4 сэмпла), на пине INT появится низкий уровень — сигнал, что жест распознан.

Как читать жесты

Когда срабатывает прерывание, нужно прочитать данные из регистров жестов. Вот алгоритм:

  1. Проверь регистр GSTATUS (0xAE) — бит 0 должен быть 1, если данные готовы
  2. Прочитай регister GDAT (0xFC) — там количество сэмплов в FIFO
  3. Читай данные блоками по 4 байта из регистра 0xFC (High, Low, High, Low — это Up, Down, Left, Right)
  4. Анализируй последовательность переходов между фотодиодами

Каждый сэмпл — это значения с четырёх фотодиодов. Когда рука проходит слева направо, сначала срабатывает левый фотодиод, потом правый. Датчик фиксирует эти переходы и определяет направление.

Библиотека 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 — не идеальный датчик, но для простого управления жестами в компактных проектах он один из лучших вариантов по соотношению цена/простота/функциональность.

radio-blog.ru — электроника и технологии