Датчик жестов: различия между версиями

Материал из MIK32 микроконтроллер
(Картинка Джека Воробья)
Нет описания правки
 
Строка 28: Строка 28:


=== Способ - 1 :  Используя проводной шлейф и Piranha UNO ===
=== Способ - 1 :  Используя проводной шлейф и Piranha UNO ===
Используя провода «Папа — Мама», подключаем  напрямую к контроллеру 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-х проводной шлейф, к  Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.
Используя 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">
//библиотеки
//библиотеки
Строка 132: Строка 132:
</syntaxhighlight>
</syntaxhighlight>


=== 2. Определение освещённости и цвета ===
===2. Определение освещённости и цвета===
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
//библиотеки
//библиотеки
Строка 185: Строка 185:
</syntaxhighlight>
</syntaxhighlight>


=== 3. Определение приближения ===
===3. Определение приближения===
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
//библиотеки
//библиотеки
Строка 243: Строка 243:
</syntaxhighlight>
</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 Датчик зафиксировал движение, но не смог его распознать.