Общие сведения:
Trema-модуль Датчик жестов, приближения, освещенности, цвета — способен определять уровень освещённости в Lux (как общий, так и по трём каналам спектра - красный, зелёный, синий), приближение объектов (препятствий) и жесты (движение объектов влево, вправо, вверх, вниз, к датчику и от него). У более ранней модели APDS9930 имеются только функции определения приближения и уровня общей освещённости.
Видео:
Спецификация:
- Входное напряжение питания (VCC): 5В постоянного тока;
- Ток, потребляемый ИК-светодиодом через драйвер: 100 / 50 / 25 / 12.5 мА (устанавливается программно);
- Ток потребляемый модулем без учёта ИК-светодиода:
- В режиме измерений уровня освещённости: до 250 мкА;
- В режиме определения приближений: до 790 мкА;
- В режиме обнаружения жестов: до 790 мкА;
- В режиме ожидания: до 38 мкА;
- В спящем режима: до 10 мкА;
- Частота тактирования шины I2C: до 400 кГц;
- Рабочая температура: -30 ... +85 °С;
- Температура хранения: -40 ... +85 °С;
- Габариты: 30x30 мм.
Все модули линейки "Trema" выполнены в одном формате
Подключение:
Для удобства подключения к Arduino воспользуйтесь Trema Shield, Trema Power Shield, Motor Shield или Trema Set Shield.
Модуль подключается к аппаратной шине I2C Arduino. Для удобства подключения, предлагаем воспользоваться TremaShield.
Модуль удобно подключать 4 способами, в зависимости от ситуации:
Способ - 1 : Используя проводной шлейф и Piranha UNO
Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO.
Способ - 2 : Используя Trema Set Shield
Модуль можно подключить к любому из I2C входов Trema Set Shield.
Способ - 3 : Используя проводной шлейф и Shield
Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.
Питание:
Напряжение питания модуля 5В постоянного тока, подаётся на выводы «VCC» и «GND» модуля.
Подробнее о модуле:
Модуль построен на базе датчика APDS9960, в состав которого входят:
- ИК-светодиод с программируемым драйвером;
- 4 фотодиода для обнаружения жестов;
- 3 фотодиода, реагирующих на разные спектры для определения цвета;
- 1 фотодиод общей освещённости;
- Уф- и ИК-фильтры;
- Усилители с программируемым коэффициентом усиления;
- МК;
- АЛУ;
- АЦП;
- ОЗУ;
- и множество дополнительных блоков.
Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза.
Примеры:
1. Определение жестов
// Подключаем библиотеки: // #include <Wire.h> // Для работы с шиной I2C #include <SparkFun_APDS9960.h> // Для работы с датчиком APDS-9960 SparkFun_APDS9960 apds = SparkFun_APDS9960(); // Определяем объект apds, экземпляр класса SparkFun_APDS9960 // void setup(){ // Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек // Инициируем работу датчика: // if(apds.init()){ // Если инициализация прошла успешно, то ... Serial.println("Initialization OK!"); // Выводим сообщение об успешной инициализации датчика }else{Serial.println("Initialization ERROR!");} // Иначе, выводим сообщение оо ошибке инициализации датчика // // Устанавливаем коэффициент усиления приёмника: // Доступные значения: 1х, 2х, 4х, 8х (GGAIN_1X, GGAIN_2X, GGAIN_4X, GGAIN_8X). Чем выше коэффициент тем выше чувствительность if(apds.setGestureGain(GGAIN_2X)){ // Если установлен коэффициент усиления приёмника в режиме обнаружения жестов, то ... Serial.println("Set gain OK!"); // Выводим сообщение об успешной установке коэффициента усиления приёмника }else{Serial.println("Set gain ERROR!");} // Иначе, выводим сообщение об ошибке при установке коэффициента усиления приёмника // Прочитать установленный коэффициент усиления приёмника можно так: uint8_t i = apds.getGestureGain(); // в переменную i сохранится значение: GGAIN_1X, или GGAIN_2X, или GGAIN_4X, или GGAIN_8X // Устанавливаем силу тока драйвера ИК-светодиода: // Доступные значения: 100мА, 50мА, 25мА, 12.5мА (LED_DRIVE_100MA, LED_DRIVE_50MA, LED_DRIVE_25MA, LED_DRIVE_12_5MA). Чем выше сила тока, тем выше чувствительность. if(apds.setGestureLEDDrive(LED_DRIVE_100MA)){ // Если устанавлена сила тока драйвера (яркость) ИК-светодиода для обнаружения жестов, то ... Serial.println("Set LED drive OK!"); // Выводим сообщение об успешной установке силы тока драйвера }else{Serial.println("Set LED drive ERROR!");} // Иначе, выводим сообщение об ошибке при установке силы тока драйвера // Прочитать установленную силу тока можно так: uint8_t i = apds.getGestureLEDDrive(); // в переменную i сохранится значение: LED_DRIVE_100MA, или LED_DRIVE_50MA, или LED_DRIVE_25MA, или LED_DRIVE_12_5MA // Разрешаем режим обнаружение жестов: // if(apds.enableGestureSensor(false)){ // Если механизм обнаружения жестов (false - без прерываний на выходе INT) запущен, то ... Serial.println("Start gesture sensor OK!"); // Выводим сообщение об успешном запуске механизма обнаружения жестов }else{Serial.println("Start gesture sensor ERROR!");} // Иначе, выводим сообщение об ошибке запуска механизма обнаружения жестов // Запретить работу механизма обнаружения жестов можно так: bool j = apds.disableGestureSensor(); // в переменную j сохранится результат выполнения функции (true/false) // Ждём завершение инициализации и калибровки: // delay(500); // } // // void loop(){ // // Выводим название зафиксированного жеста: // if(apds.isGestureAvailable()){ // Если зафиксировано движение, то ... switch(apds.readGesture()){ // Сверяем значение соответствующее жесту ... case DIR_UP: Serial.println("UP" ); break; // Зафиксировано движение вперёд или вверх (зависит от положения датчика) case DIR_DOWN: Serial.println("DOWN" ); break; // Зафиксировано движение назад или вниз (зависит от положения датчика) case DIR_LEFT: Serial.println("LEFT" ); break; // Зафиксировано движение влево case DIR_RIGHT: Serial.println("RIGHT"); break; // Зафиксировано движение вправо case DIR_NEAR: Serial.println("NEAR" ); break; // Зафиксировано движение к датчику case DIR_FAR: Serial.println("FAR" ); break; // Зафиксировано движение от датчика default: Serial.println("NONE" ); break; // Зафиксировано движение, но жест не опознан } // } // // // Приостанавливаем выполнение скетча на 0,1 секунду: // delay(100); // Чтоб не перегружать шину I2C постоянными запросами } //
2. Определение освещённости и цвета
// Подключаем библиотеки: // #include <Wire.h> // Для работы с шиной I2C #include <SparkFun_APDS9960.h> // Для работы с датчиком APDS-9960 SparkFun_APDS9960 apds = SparkFun_APDS9960(); // Определяем объект apds, экземпляр класса SparkFun_APDS9960 // // Объявляем переменные: // uint16_t lightAmbient = 0; // Определяем переменную для хранения освещённости общей в люксах uint16_t lightRed = 0; // Определяем переменную для хранения освещённости красного спектра в люксах uint16_t lightGreen = 0; // Определяем переменную для хранения освещённости зелёного спектра в люксах uint16_t lightBlue = 0; // Определяем переменную для хранения освещённости синего спектра в люксах // void setup(){ // Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек // Инициируем работу датчика: // if(apds.init()){ // Если инициализация прошла успешно, то ... Serial.println("Initialization OK!"); // Выводим сообщение об успешной инициализации датчика }else{Serial.println("Initialization ERROR!");} // Иначе, выводим сообщение об ошибке инициализации датчика // // Разрешаем режим определения освещённости: // if(apds.enableLightSensor(false)){ // Если режим определения освещённости запущен (false - без прерываний на выходе INT), то ... Serial.println("Start light sensor OK!"); // Выводим сообщение об успешном запуске режима определения освещённости }else{Serial.println("Start light sensor ERROR!");} // Иначе, выводим сообщение об ошибке запуска режима определения освещённости // Запретить режим определения освещённости можно так: bool j = apds.disableLightSensor(); // в переменную j сохранится результат выполнения функции (true/false) // Ждём завершение инициализации и калибровки: // delay(500); // } // // void loop(){ // // Читаем значения освещённости в переменные: // if(apds.readAmbientLight (lightAmbient) // Если прочитано значение общей освещённости && apds.readRedLight (lightRed) // И прочитано значение освещённости красного спектра, и && apds.readGreenLight (lightGreen) // И прочитано значение освещённости зелёного спектра, и && apds.readBlueLight (lightBlue) ){ // И прочитано значение освещённости синего спектра, то ... Serial.println((String) "Ambient=" + lightAmbient + ", Red=" + lightRed + ", Green=" + lightGreen + ", Blue=" + lightBlue + " lx"); // Выводим все прочитанные значения }else{Serial.println("Read light ERROR!");} // Иначе, выводим сообщение об ошибке чтения освещённости // // Приостанавливаем выполнение скетча на 1 секунду: // delay(1000); // Чтоб не перегружать шину I2C постоянными запросами } //
3. Определение приближения
// Подключаем библиотеки: // #include <Wire.h> // Для работы с шиной I2C #include <SparkFun_APDS9960.h> // Для работы с датчиком APDS-9960 SparkFun_APDS9960 apds = SparkFun_APDS9960(); // Определяем объект apds, экземпляр класса SparkFun_APDS9960 // // Объявляем переменные: // uint8_t proximityData = 0; // Определяем переменную для хранения значения приближения // void setup(){ // Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек // Инициируем работу датчика: // if(apds.init()){ // Если инициализация прошла успешно, то ... Serial.println("Initialization OK!"); // Выводим сообщение об успешной инициализации датчика }else{Serial.println("Initialization ERROR!");} // Иначе, выводим сообщение оо ошибке инициализации датчика // // Устанавливаем коэффициент усиления приёмника: // Доступные значения: 1х, 2х, 4х, 8х (PGAIN_1X, PGAIN_2X, PGAIN_4X, PGAIN_8X). Чем выше коэффициент тем выше чувствительность if(apds.setProximityGain(PGAIN_2X)){ // Если установлен коэффициент усиления приёмника в режиме определения расстояния, то ... Serial.println("Set gain OK!"); // Выводим сообщение об успешной установке коэффициента усиления приёмника }else{Serial.println("Set gain ERROR!");} // Иначе, выводим сообщение об ошибке при установке коэффициента усиления приёмника // Прочитать установленный коэффициент усиления приёмника можно так: uint8_t i = apds.getProximityGain(); // в переменную i сохранится значение: PGAIN_1X, или PGAIN_2X, или PGAIN_4X, или PGAIN_8X // Разрешаем режим определения приближения: // if(apds.enableProximitySensor(false)){ // Если механизм определения приближения (false - без прерываний на выходе INT) запущен, то ... Serial.println("Start proximity sensor OK!"); // Выводим сообщение об успешном запуске механизма определения приближения }else{Serial.println("Start proximity sensor ERROR!");} // Иначе, выводим сообщение об ошибке запуска механизма определения приближения // Запретить работу механизма определения приближения можно так: bool j = apds.disableProximitySensor(); // в переменную j сохранится результат выполнения функции (true/false) // Ждём завершение инициализации и калибровки: // delay(500); // } // // void loop(){ // // Читаем определённое датчиком значение приближения: // if(apds.readProximity(proximityData)){ // Если значение приближения корректно прочитано в переменную proximityData, то .. Serial.println((String) "Proximity="+proximityData); // Выводим значение приближения }else{Serial.println("Reading proximity value ERROR!");} // Иначе, выводим сообщение об ошибке чтения приближения // // Приостанавливаем выполнение скетча на 1 секунду: // delay(1000); // Чтоб не перегружать шину I2C постоянными запросами } //
Жесты:
- Trema-модуль Датчик жестов, приближения, освещенности, цвета способен реагировать на следующие жесты:
- UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве).
- DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве).
- LEFT - Движение руки перед датчиком ВЛЕВО.
- RIGHT - Движение руки перед датчиком ВПРАВО.
- NEAR - Приближение руки К датчику.
Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону. - FAR Удаление руки ОТ датчика.
Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх. - NONE Датчик зафиксировал движение, но не смог его распознать.
Ссылки:
- DataSheet;
- Библиотека SparkFun_APDS9960;
- Trema-модуль Датчик жестов, приближения, освещенности, цвета;
- Датчик APDS9930 (более ранняя модель);
Обсуждение