
APDS-9960
Broadcom / Avago; плата Adafruit · APDS-9960; Adafruit PID 3595 STEMMA QT
Приближение, RGBC и направленные жесты по I²C. Пример на Adafruit PID 3595 STEMMA QT и ESP32-DevKitC V4 при питании 3,3 В.
Автор: SLDV LAB
Опубликовано · Обновлено
О МОДУЛЕ
Что делает APDS-9960; Adafruit PID 3595 STEMMA QT
APDS-9960 объединяет фотоприёмники цвета и направленные ИК-каналы с собственным ИК-светодиодом. Может обнаруживать приближение предмета и последовательность отражений при движении руки, из которой драйвер распознаёт простые направления жеста.
Для определённого подключения выбран Adafruit PID 3595 STEMMA QT с регулятором и согласованием I²C. Здесь используется только питание VIN 3,3 В и контроллер с GPIO 3,3 В.
В источниках Adafruit есть противоречие: руководство допускает VIN 3–5 В и называет INT выходом логики 3 В, но опубликованные схема и PCB STEMMA QT соединяют INT через R2 10 кОм с VIN. У APDS-9960 абсолютный предел напряжения на выходе составляет 3,8 В; это предел повреждения, а не рабочее напряжение. Поэтому подключение 5 В в этой карточке не используется, в том числе при свободном INT. Не переносите подключение на другую ревизию без сверки её схемы.
Значение proximity 0–255 характеризует отражённый сигнал и не является расстоянием в сантиметрах. Результат зависит от отражающей способности, засветки и геометрии. RGBC также требует собственной калибровки для классификации цвета. Окно корпуса должно пропускать нужный спектр и не возвращать свет встроенного LED прямо в сенсор.
Ниже приведена базовая проверка proximity и RGBC. Для интерфейса жестов библиотека предоставляет отдельный режим, который нужно проверить в выбранном корпусе и ориентации платы. Движение руки не заменяет защищённую кнопку для аварийного останова.
На фото модуль Adafruit APDS-9960 PID 3595 STEMMA QT без отдельной неприсоединённой гребёнки. APDS-9960. Фото: Kattni Rembor / Adafruit. Оригинал: https://learn.adafruit.com/assets/89833 . Лицензия фотографии: CC BY-SA 3.0, https://creativecommons.org/licenses/by-sa/3.0/ . Изменения: Выделена плата без отдельной неприсоединённой гребёнки. Удалены исходный фон и фон в четырёх монтажных и шести сигнальных отверстиях. Пропорциональное масштабирование, размещение на предоставленном фоне и JPEG-сжатие. Геометрия, цвет, маркировка и видимые детали не перерисовывались. Адаптация фотографии распространяется по той же лицензии.
Схема распиновки
Авторская схема SLDV LAB для Adafruit PID 3595 STEMMA QT в режиме VIN = 3,3 В и GPIO 3,3 В. В руководстве и схеме Adafruit расходятся сведения об INT; пример 5 В не применяется. Аппаратная проверка не выполнялась.
Источники: 1, 2, 3, 4, 5. Авторская схема SLDV LAB по фактам документации.
Характеристики
- Функции
- Приближение, RGBC, жесты
- Адрес I²C
- 0x39
- Разрядность proximity
- 8 бит
- Разрядность регистров RGBC
- 16 бит
- Жесты драйвера Adafruit
- Вверх / вниз / влево / вправо
- Регулятор и согласование I²C на PID 3595
- Да
- Интерфейс
- I²C
- Питание модуля
- В этой карточке Adafruit PID 3595 STEMMA QT: VIN 3,3 В и GPIO 3,3 В. В опубликованной схеме INT подтянут через 10 кОм к VIN; не подавать 5 В даже при неподключённом INT. 3Vo — выход регулятора. Голая APDS-9960: VDD 2,4–3,6 В.
ПРАКТИКА
Подключение
| Контакт модуля | Контакт платы | Назначение |
|---|---|---|
| VIN | 3V3 | ESP32-DevKitC V4 с ESP32-WROOM-32E; питание модуля строго 3,3 В. Саму DevKitC питать от USB. |
| GND | GND | Общая земля. |
| SDA | GPIO21 | SDA явно задан в Wire.begin(21, 22, 100000); GPIO 3,3 В. |
| SCL | GPIO22 | SCL явно задан в Wire.begin(21, 22, 100000); GPIO 3,3 В. |
| INT, 3Vo | Не подключать | Пример с опросом. 3Vo — выход регулятора; INT — открытый сток с подтяжкой 10 кОм к VIN в опубликованной схеме. При VIN 3,3 В высокий уровень INT около 3,3 В. |
Подходит для ESP32, Arduino. Выберите контакты по документации своей платы.
ВАШ ПРОЕКТ · ВАШ ДАТЧИК
Интегрируйте модуль с ChatGPT
Скопируйте запрос в ChatGPT. Укажите свою плату и среду разработки — получите подключение и код для своего проекта.
Помоги интегрировать APDS-9960. Уточни breakout, контроллер, режим (приближение, цвет или жесты), ориентацию и окно корпуса. Основа: Adafruit PID 3595 STEMMA QT, ESP32-DevKitC V4 с ESP32-WROOM-32E, SDA GPIO21/SCL GPIO22, VIN и GPIO 3,3 В, 0x39, Arduino-ESP32 3.0.7 и Adafruit APDS9960 1.3.1. Не предлагать VIN 5 В: опубликованная схема подтягивает INT к VIN через 10 кОм вопреки общему описанию руководства; свободный INT не устраняет это ограничение. Дай полный пример с проверкой инициализации, готовности, ошибок I²C и насыщения. Базовый пример ниже читает RGBC/proximity; для жестов отдельно включи enableProximity и enableGesture и объясни ограничения readGesture. Не переводить 8-битный proximity в сантиметры без калибровки.
Библиотеки
Установите библиотеку для своей среды и откройте пример из её документации.
Что именно прописать
- Библиотека
Adafruit APDS9960 Library 1.3.1Зависимость Adafruit BusIO.
- Адрес I²C
0x39Штатный фиксированный адрес.
- Инициализация
apds.begin(100, APDS9960_AGAIN_4X, 0x39, &Wire)Запрошенное время интегрирования 100 мс и усиление RGBC 4×.
- Режим примера
enableProximity(true); enableColor(true)Режим жестов в этом скетче не включён.
ESP32-DevKitC V4 · 3,3 В · полный скетч
cpp#include <Wire.h>
#include <Adafruit_APDS9960.h>
Adafruit_APDS9960 apds;
bool readBytes(uint8_t reg, uint8_t *data, uint8_t count) {
Wire.beginTransmission(0x39);
Wire.write(reg);
if (Wire.endTransmission(false) != 0) return false;
if (Wire.requestFrom(uint8_t(0x39), count) != count) {
while (Wire.available()) Wire.read();
return false;
}
for (uint8_t i = 0; i < count; ++i) data[i] = Wire.read();
return true;
}
bool writeRegister(uint8_t reg, uint8_t value) {
Wire.beginTransmission(0x39);
Wire.write(reg);
Wire.write(value);
return Wire.endTransmission() == 0;
}
bool clearSaturation() {
Wire.beginTransmission(0x39);
Wire.write(uint8_t(0xE7)); // AICLEAR: command only, no payload
return Wire.endTransmission() == 0;
}
uint16_t little16(const uint8_t *p) {
return uint16_t(p[0]) | (uint16_t(p[1]) << 8);
}
void setup() {
Serial.begin(115200);
if (!Wire.begin(21, 22, 100000)) {
Serial.println(F("I2C bus initialization failed"));
while (true) delay(1000);
}
Wire.setTimeOut(25); // Arduino-ESP32: milliseconds
if (!apds.begin(100, APDS9960_AGAIN_4X, 0x39, &Wire)) {
Serial.println(F("APDS9960 initialization failed"));
while (true) delay(1000);
}
uint8_t config2 = 0;
if (!readBytes(0x90, &config2, 1) ||
!writeRegister(0x90, (config2 & 0x30) | 0xC1) ||
!clearSaturation()) {
Serial.println(F("APDS9960 saturation setup failed"));
while (true) delay(1000);
}
// CONFIG2: keep LED_BOOST, enable PSIEN/CPSIEN, reserved bit 0 = 1.
apds.enableProximity(true);
apds.enableColor(true);
}
void loop() {
delay(200);
uint8_t status = 0;
if (!readBytes(0x93, &status, 1)) {
Serial.println(F("APDS9960 I2C status error"));
return;
}
if ((status & 0x03) != 0x03) {
Serial.println(F("Waiting for valid color and proximity data"));
return;
}
if (status & 0xC0) {
Serial.println(F("APDS9960 saturation; reduce light or gain"));
if (!clearSaturation()) {
Serial.println(F("APDS9960 saturation clear I2C error"));
}
return; // wait for the next measurement cycle
}
uint8_t data[9];
if (!readBytes(0x94, data, sizeof(data))) {
Serial.println(F("APDS9960 incomplete data read"));
return;
}
Serial.print(F("R=")); Serial.print(little16(data + 2));
Serial.print(F(" G=")); Serial.print(little16(data + 4));
Serial.print(F(" B=")); Serial.print(little16(data + 6));
Serial.print(F(" Clear=")); Serial.print(little16(data));
Serial.print(F(" Proximity_raw=")); Serial.println(data[8]);
}
Полный скетч для ESP32-DevKitC V4 с ESP32-WROOM-32E, Arduino-ESP32 3.0.7 и Adafruit APDS9960 1.3.1. Плата DevKitC питается от USB; модуль подключён к её 3V3, GND, GPIO21 и GPIO22. Внешние подтяжки к 5 В недопустимы. Wire.setTimeOut(25) задаёт тайм-аут транзакции 25 мс в API ESP32. Инициализация и режимы используют библиотеку; собственный helper читает STATUS 0x93 и последовательность 0x94–0x9C с проверкой ACK и числа байтов, поскольку стандартные getColorData/readProximity не выдают отдельный код ошибки шины. CONFIG2 включает PSIEN/CPSIEN с сохранением LED_BOOST и обязательного reserved bit 0; после насыщения команда AICLEAR 0xE7 без данных сбрасывает защёлкнутые флаги с проверкой ACK. API/регистры статически сверены; компиляция и аппаратный тест не выполнялись. Serial Monitor: 115200 бод. Приближайте и отдаляйте матовый предмет, затем сравните цвета при неизменном освещении. Результат proximity — условные единицы. Этот скетч не декодирует жесты; для них требуется отдельный режим и проверка направлений относительно платы.
Проекты с этим компонентом
Все проектыСвязанные проекты пока не опубликованы.
