Skip to content

APDS-9960 — датчик приближения

Оптический датчик приближения (Proximity) по I2C, отдаёт сырое значение 0–255. Работает и с оригинальным чипом Broadcom/Avago, и с распространённым на рынке клоном.

APDS-9960 — датчик приближения (Proximity)

Компонент опрашивает оптический датчик APDS-9960 по I2C и отдаёт сырое значение приближения объекта (0-255). Работает и с оригинальным чипом Broadcom/Avago, и с распространённым на рынке клоном — подробнее о том, почему это важно и как их отличить, см. THEORY.md.

Компонент реализует только режим Proximity. Датчик также умеет измерять освещённость/цвет (ALS/RGB) и распознавать жесты (Gesture), но эти режимы здесь не задействованы — у клонов, которые чаще всего оказываются в руках учеников, они работают нестабильно.

Файлы

  • include/Apds9960.h / src/Apds9960.cpp — драйвер.
  • src/main.cpp — тестовый стенд: печатает proximity в Serial Monitor и зажигает светодиод при приближении объекта.
  • tools/proximity_view.py — живой график proximity на компьютере (см. раздел “Визуализация” ниже).
  • THEORY.md — физика ИК-приближения, регистры, проблема клонов.
  • WIRING.md — схема подключения.
  • Lesson.md — методический план урока для учителя.

Подключение (кратко)

APDS-9960ESP32 (по умолчанию в main.cpp)
VCC3.3V
GNDGND
SDAGPIO21
SCLGPIO22

Полная схема, включая важное примечание про пин VL, — в WIRING.md.

Быстрый старт

  1. Собрать схему по WIRING.md.
  2. Прошить: pio run -e esp32dev -t upload.
  3. Открыть Serial Monitor на 115200 бод.
  4. При старте датчик сообщает свой ID (см. main.cpp:19-29) — оригинал, известный клон или неопознанный чип. Любой из трёх статусов означает, что можно работать дальше.
  5. Поднося руку к датчику, наблюдать изменение Prox: в мониторе.

Визуализация

Serial Monitor с текстовыми числами — не самый наглядный формат для группы учеников. tools/proximity_view.py читает тот же вывод и рисует живой график PDATA с линиями текущих порогов калибровки:

cd tools
pip install -r requirements.txt
python3 proximity_view.py /dev/ttyUSB0   # порт по умолчанию — /dev/ttyUSB0

Serial Monitor прошивки на момент запуска скрипта должен быть закрыт — иначе порт занят и Python не сможет его открыть. Подробнее, зачем нужен этот график и что на нём смотреть, — Lesson.md, блок IV.

Калибровка порогов

Драйвер намеренно не решает, какое значение считать “близко” — сырой разброс PDATA сильно отличается от экземпляра к экземпляру (см. THEORY.md, раздел “Проблема клонов”). Пороги THRESHOLD_NEAR/CLOSE/VERY_CLOSE заданы как пример в main.cpp:12-14 — их нужно подобрать под свой датчик, ориентируясь на реальные показания в Serial Monitor.

API драйвера

МетодНазначение
begin(sda, scl)Инициализация I2C и proximity-движка. false — только если чип вообще не отвечает на шине.
readProximity(uint8_t &outValue)Сырое значение PDATA (регистр 0x9C), 0-255. false при ошибке транзакции.
getDeviceId()ID, прочитанный при begin() (регистр 0x92).
isAlive(timeoutMs)Была ли недавняя успешная транзакция с датчиком.

Используемые регистры

Полный разбор — в THEORY.md. Здесь только таблица соответствия коду (Apds9960.h:29-33):

РегистрАдресРоль в этом драйвере
ENABLE0x80Включение чипа и proximity-движка (PON, PEN)
PPULSE0x8EЧисло/длительность ИК-импульсов подсветки
CONTROL0x8FМощность ИК-светодиода и усиление приёмника
ID0x92Идентификатор чипа
PDATA0x9CРезультат измерения приближения

Известные ограничения

  • Диапазон значений PDATA — 0-255, но реальный “рабочий” диапазон зависит от конкретного экземпляра датчика (клоны, состояние оптики, засветка).
  • Gesture и ALS/RGB не реализованы (см. выше).
  • Если Prox всегда равен 0 при поднесённой руке — проверьте перемычку VL, см. WIRING.md.