Датчик жестов

Материал из me-robotics wiki

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 Датчик зафиксировал движение, но не смог его распознать.