Датчик жестов: различия между версиями
Artecoll (обсуждение | вклад) (Картинка Джека Воробья) |
Нет описания правки |
||
(не показаны 3 промежуточные версии 1 участника) | |||
Строка 28: | Строка 28: | ||
=== Способ - 1 : Используя проводной шлейф и Piranha UNO === | === Способ - 1 : Используя проводной шлейф и Piranha UNO === | ||
Используя провода «Папа — Мама», | Используя провода «Папа — Мама», подключаем напрямую к контроллеру Piranha UNO. | ||
[[Файл:Используя_проводной_шлейф_и_Piranha_UNO.png|альт=|безрамки|567x567px]] | [[Файл:Используя_проводной_шлейф_и_Piranha_UNO.png|альт=|безрамки|567x567px]] | ||
=== Способ - 2 : Используя Trema Set Shield === | ===Способ - 2 : Используя Trema Set Shield=== | ||
Модуль можно подключить к любому из I2C входов Trema Set Shield. | Модуль можно подключить к любому из I2C входов Trema Set Shield. | ||
[[Файл:Используя_Trema_Set_Shield.png|альт=|безрамки|534x534px]] | [[Файл:Используя_Trema_Set_Shield.png|альт=|безрамки|534x534px]] | ||
=== Способ - 3 : Используя проводной шлейф и Shield === | ===Способ - 3 : Используя проводной шлейф и Shield=== | ||
Используя 4-х проводной шлейф, | Используя 4-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд. | ||
[[Файл:Используя_проводной_шлейф_и_Shield.png|альт=|безрамки|555x555px]] | [[Файл:Используя_проводной_шлейф_и_Shield.png|альт=|безрамки|555x555px]] | ||
== Питание: == | ==Питание:== | ||
Напряжение питания модуля 5В постоянного тока, подаётся на выводы «VCC» и «GND» модуля. | Напряжение питания модуля 5В постоянного тока, подаётся на выводы «VCC» и «GND» модуля. | ||
== Подробнее о модуле: == | ==Подробнее о модуле:== | ||
Модуль построен на базе датчика APDS9960, в состав которого входят: | Модуль построен на базе датчика APDS9960, в состав которого входят: | ||
* ИК-светодиод с программируемым драйвером; | *ИК-светодиод с программируемым драйвером; | ||
* 4 фотодиода для обнаружения жестов; | *4 фотодиода для обнаружения жестов; | ||
* 3 фотодиода, реагирующих на разные спектры для определения цвета; | *3 фотодиода, реагирующих на разные спектры для определения цвета; | ||
* 1 фотодиод общей освещённости; | *1 фотодиод общей освещённости; | ||
* Уф- и ИК-фильтры; | *Уф- и ИК-фильтры; | ||
* Усилители с программируемым коэффициентом усиления; | *Усилители с программируемым коэффициентом усиления; | ||
* МК; | *МК; | ||
* АЛУ; | *АЛУ; | ||
* АЦП; | *АЦП; | ||
* ОЗУ; | *ОЗУ; | ||
* и множество дополнительных блоков. | *и множество дополнительных блоков. | ||
Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза. | Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза. | ||
== Примеры: == | ==Примеры:== | ||
=== 1. Определение жестов === | ===1. Определение жестов=== | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
//библиотеки | //библиотеки | ||
Строка 128: | Строка 128: | ||
} | } | ||
} | } | ||
delay( | delay(1000); //Чтобы не перегружать шину I2C постоянными запросами | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== 2. Определение освещённости и цвета === | ===2. Определение освещённости и цвета=== | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
//библиотеки | //библиотеки | ||
Строка 181: | Строка 181: | ||
else Serial.println("Read light ERROR!"); //Иначе сообщение об ошибке чтения освещённости | else Serial.println("Read light ERROR!"); //Иначе сообщение об ошибке чтения освещённости | ||
delay( | delay(1000); //Чтобы не перегружать шину I2C постоянными запросами | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== 3. Определение приближения === | ===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 Датчик зафиксировал движение, но не смог его распознать. |
Текущая версия от 20: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 Датчик зафиксировал движение, но не смог его распознать.