Датчик жестов: различия между версиями
| (не показано 9 промежуточных версий 2 участников) | |||
| Строка 27: | Строка 27: | ||
Модуль удобно подключать 4 способами, в зависимости от ситуации: | Модуль удобно подключать 4 способами, в зависимости от ситуации: | ||
| − | === | + | === Способ - 1 : Используя проводной шлейф и Piranha UNO === |
| − | Используя провода «Папа — Мама», | + | Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO. |
| − | [[Файл:Используя_проводной_шлейф_и_Piranha_UNO.png|альт=|безрамки| | + | [[Файл:Используя_проводной_шлейф_и_Piranha_UNO.png|альт=|безрамки|567x567px]] |
| − | === | + | ===Способ - 2 : Используя Trema Set Shield=== |
Модуль можно подключить к любому из I2C входов Trema Set Shield. | Модуль можно подключить к любому из I2C входов Trema Set Shield. | ||
| − | [[Файл:Используя_Trema_Set_Shield.png|альт=|безрамки| | + | [[Файл:Используя_Trema_Set_Shield.png|альт=|безрамки|534x534px]] |
| − | === | + | ===Способ - 3 : Используя проводной шлейф и Shield=== |
| − | Используя 4-х проводной шлейф, | + | Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд. |
| − | [[Файл:Используя_проводной_шлейф_и_Shield.png|альт=|безрамки| | + | [[Файл:Используя_проводной_шлейф_и_Shield.png|альт=|безрамки|555x555px]] |
| − | == Питание: == | + | ==Питание:== |
Напряжение питания модуля 5В постоянного тока, подаётся на выводы «VCC» и «GND» модуля. | Напряжение питания модуля 5В постоянного тока, подаётся на выводы «VCC» и «GND» модуля. | ||
| − | == Подробнее о модуле: == | + | ==Подробнее о модуле:== |
Модуль построен на базе датчика APDS9960, в состав которого входят: | Модуль построен на базе датчика APDS9960, в состав которого входят: | ||
| − | * ИК-светодиод с программируемым драйвером; | + | *ИК-светодиод с программируемым драйвером; |
| − | * 4 фотодиода для обнаружения жестов; | + | *4 фотодиода для обнаружения жестов; |
| − | * 3 фотодиода, реагирующих на разные спектры для определения цвета; | + | *3 фотодиода, реагирующих на разные спектры для определения цвета; |
| − | * 1 фотодиод общей освещённости; | + | *1 фотодиод общей освещённости; |
| − | * Уф- и ИК-фильтры; | + | *Уф- и ИК-фильтры; |
| − | * Усилители с программируемым коэффициентом усиления; | + | *Усилители с программируемым коэффициентом усиления; |
| − | * МК; | + | *МК; |
| − | * АЛУ; | + | *АЛУ; |
| − | * АЦП; | + | *АЦП; |
| − | * ОЗУ; | + | *ОЗУ; |
| − | * и множество дополнительных блоков. | + | *и множество дополнительных блоков. |
Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза. | Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза. | ||
| − | == Примеры: == | + | ==Примеры:== |
| − | === 1. Определение жестов === | + | ===1. Определение жестов=== |
| − | + | <syntaxhighlight lang="c"> | |
| + | //библиотеки | ||
| + | #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(1000); //Чтобы не перегружать шину I2C постоянными запросами | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | ===2. Определение освещённости и цвета=== | ||
| + | <syntaxhighlight lang="c"> | ||
| + | //библиотеки | ||
| + | #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(1000); //Чтобы не перегружать шину I2C постоянными запросами | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | ===3. Определение приближения=== | ||
| + | <syntaxhighlight lang="c"> | ||
| + | //библиотеки | ||
| + | #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!"); //Иначе, выводим ошибку инициализации | ||
| + | //Устанавливаем коэффициент усиления приёмника //Доступные значения: 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. | ||
| + | //Разрешаем режим определения приближения | ||
| + | if (apds.enableProximitySensor(false)){ //Режим определения приближения запущен (false - без | ||
| + | //прерываний на выходе INT), то | ||
| + | Serial.println("Start proximity sensor OK!"); //сообщение об успешном запуске определения приближения | ||
| + | } | ||
| + | else Serial.println("Start proximity sensor ERROR!"); //Иначе сообщение об ошибке определения приближения | ||
| + | //Запретить режим определения приближения можно так: bool j = apds.disableProximitySesnor(); | ||
| + | //в переменную j сохранится результат выполнения функции (true/false) | ||
| + | //ждём завершения инициализации и калибровки | ||
| + | delay(500); | ||
| + | } | ||
| + | void loop() { | ||
| + | //Читаем определённое датчиком значение приближения | ||
| + | if (apds.readProximity(ProximityData)){ //Если значение корректно прочитано в переменную proximityData | ||
| + | Serial.println((String) "Proximity = " + proximityData); //то выводим значение приближения | ||
| + | } | ||
| + | else Serial.println("Reading proximity value ERROR!"); //Иначе сообщение об ошибке чтения приближения | ||
| + | |||
| + | delay(1000); //Чтобы не перегружать шину I2C постоянными запросами | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| − | Жесты: | + | ==Жесты:== |
| − | |||
Trema-модуль Датчик жестов, приближения, освещенности, цвета способен реагировать на следующие жесты: | Trema-модуль Датчик жестов, приближения, освещенности, цвета способен реагировать на следующие жесты: | ||
| − | UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве). | + | *UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве). |
| − | DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве). | + | *DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве). |
| − | LEFT - Движение руки перед датчиком ВЛЕВО. | + | *LEFT - Движение руки перед датчиком ВЛЕВО. |
| − | RIGHT - Движение руки перед датчиком ВПРАВО. | + | *RIGHT - Движение руки перед датчиком ВПРАВО. |
| − | NEAR - Приближение руки К датчику. | + | *NEAR - Приближение руки К датчику. |
Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону. | Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону. | ||
| − | FAR Удаление руки ОТ датчика. | + | *FAR Удаление руки ОТ датчика. |
Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх. | Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх. | ||
| − | NONE Датчик зафиксировал движение, но не смог его распознать. | + | *NONE Датчик зафиксировал движение, но не смог его распознать. |
Текущая версия на 23:53, 11 мая 2022
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(1000); //Чтобы не перегружать шину 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(1000); //Чтобы не перегружать шину I2C постоянными запросами
}
3. Определение приближения
//библиотеки
#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!"); //Иначе, выводим ошибку инициализации
//Устанавливаем коэффициент усиления приёмника //Доступные значения: 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.
//Разрешаем режим определения приближения
if (apds.enableProximitySensor(false)){ //Режим определения приближения запущен (false - без
//прерываний на выходе INT), то
Serial.println("Start proximity sensor OK!"); //сообщение об успешном запуске определения приближения
}
else Serial.println("Start proximity sensor ERROR!"); //Иначе сообщение об ошибке определения приближения
//Запретить режим определения приближения можно так: bool j = apds.disableProximitySesnor();
//в переменную j сохранится результат выполнения функции (true/false)
//ждём завершения инициализации и калибровки
delay(500);
}
void loop() {
//Читаем определённое датчиком значение приближения
if (apds.readProximity(ProximityData)){ //Если значение корректно прочитано в переменную proximityData
Serial.println((String) "Proximity = " + proximityData); //то выводим значение приближения
}
else Serial.println("Reading proximity value ERROR!"); //Иначе сообщение об ошибке чтения приближения
delay(1000); //Чтобы не перегружать шину I2C постоянными запросами
}
Жесты:
Trema-модуль Датчик жестов, приближения, освещенности, цвета способен реагировать на следующие жесты:
- UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве).
- DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве).
- LEFT - Движение руки перед датчиком ВЛЕВО.
- RIGHT - Движение руки перед датчиком ВПРАВО.
- NEAR - Приближение руки К датчику.
Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону.
- FAR Удаление руки ОТ датчика.
Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх.
- NONE Датчик зафиксировал движение, но не смог его распознать.