ДатчикиДвижение

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 В.

ПРАКТИКА

Подключение

Контакт модуляКонтакт платыНазначение
VIN3V3ESP32-DevKitC V4 с ESP32-WROOM-32E; питание модуля строго 3,3 В. Саму DevKitC питать от USB.
GNDGNDОбщая земля.
SDAGPIO21SDA явно задан в Wire.begin(21, 22, 100000); GPIO 3,3 В.
SCLGPIO22SCL явно задан в 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 — условные единицы. Этот скетч не декодирует жесты; для них требуется отдельный режим и проверка направлений относительно платы.

Проекты с этим компонентом

Все проекты

Связанные проекты пока не опубликованы.

Связанные материалы и компоненты