Датчик жестов
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!"); //Иначе, выводим ошибку инициализации //Устанавливаем коэффициент усиления приёмника //Доступные значения: 1x, 2x, 4x, 8x (GGAIN_1X, и т.д.) //Чем выше коэффициент, тем выше чувствительность if (apds.setGestureGain(GGAIN_2X)){ //Если коэффициент в режиме обнаружения жестов Serial.println("Set gain OK!"); //выводим сообщение об успешной установке коэффициента } else Serial.println("Set gain ERROR!"); //Иначе сообщение об ошибке при установке коэффициента //В переменную i сохранится значение GGAIN_1X, GGAIN_2X, GGAIN_4X или GGAIN_8X. //Устанавливаем силу тока драйвера ИК-светодиода //Доступны значения: 100, 50, 25, 12.5 мА //(LED_DRIVE_12_5MA, LED_DRIVE_100MA и т.д.) //Чем выше сила тока, тем выше чувствительность 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_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; //Зафиксировано движение, но жест не опознан } } 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.disableLightSesnor(); //в переменную 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 + " 1x"); // значения } else Serial.println("Read light ERROR!"); //Иначе сообщение об ошибке чтения освещённости delay(100); //Чтобы не перегружать шину I2C постоянными запросами }
3. Определение приближения
Жесты:
Trema-модуль Датчик жестов, приближения, освещенности, цвета способен реагировать на следующие жесты:
- UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве).
- DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве).
- LEFT - Движение руки перед датчиком ВЛЕВО.
- RIGHT - Движение руки перед датчиком ВПРАВО.
- NEAR - Приближение руки К датчику.
Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону.
- FAR Удаление руки ОТ датчика.
Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх.
- NONE Датчик зафиксировал движение, но не смог его распознать.