Датчик жестов, приближения, освещенности, цвета (Trema-модуль)

Общие сведения:

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 ShieldTrema Power ShieldMotor 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!");}             // Иначе, выводим сообщение оо ошибке инициализации датчика
                                                                      //
      //  Устанавливаем коэффициент усиления приёмника:               // Доступные значения: 1х, 2х, 4х, 8х (GGAIN_1X, GGAIN_2X, GGAIN_4X, GGAIN_8X). Чем выше коэффициент тем выше чувствительность
          if(apds.setGestureGain(GGAIN_2X)){                          // Если установлен коэффициент усиления приёмника в режиме обнаружения жестов, то ... 
                Serial.println("Set gain OK!");                       // Выводим сообщение об успешной установке коэффициента усиления приёмника
          }else{Serial.println("Set gain ERROR!");}                   // Иначе, выводим сообщение об ошибке при установке коэффициента усиления приёмника
                                                                      // Прочитать установленный коэффициент усиления приёмника можно так: uint8_t i = apds.getGestureGain(); // в переменную i сохранится значение: GGAIN_1X, или GGAIN_2X, или GGAIN_4X, или GGAIN_8X
      //  Устанавливаем силу тока драйвера ИК-светодиода:             // Доступные значения: 100мА, 50мА, 25мА, 12.5мА (LED_DRIVE_100MA, LED_DRIVE_50MA, LED_DRIVE_25MA, LED_DRIVE_12_5MA). Чем выше сила тока, тем выше чувствительность.
          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_50MA, или LED_DRIVE_25MA, или 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;     // Зафиксировано движение, но жест не опознан
              }                                                       //
          }                                                           //
                                                                      //
      //  Приостанавливаем выполнение скетча на 0,1 секунду:          // 
          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.disableLightSensor(); // в переменную 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 + " lx"); // Выводим все прочитанные значения
          }else{Serial.println("Read light ERROR!");}                 // Иначе, выводим сообщение об ошибке чтения освещённости
                                                                      //
      //  Приостанавливаем выполнение скетча на 1 секунду:            //
          delay(1000);                                                // Чтоб не перегружать шину I2C постоянными запросами
      }                                                               //

      3. Определение приближения

      // Подключаем библиотеки:                                       //
      #include <Wire.h>                                               // Для работы с шиной I2C
      #include <SparkFun_APDS9960.h>                                  // Для работы с датчиком APDS-9960
      SparkFun_APDS9960 apds = SparkFun_APDS9960();                   // Определяем объект apds, экземпляр класса SparkFun_APDS9960
                                                                      //
      // Объявляем переменные:                                        //
      uint8_t proximityData = 0;                                      // Определяем переменную для хранения значения приближения
                                                                      //
      void setup(){                                                   //
          Serial.begin(9600);                                         // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек
      //  Инициируем работу датчика:                                  // 
          if(apds.init()){                                            // Если инициализация прошла успешно, то ...
                Serial.println("Initialization OK!");                 // Выводим сообщение об успешной инициализации датчика
          }else{Serial.println("Initialization ERROR!");}             // Иначе, выводим сообщение оо ошибке инициализации датчика
                                                                      //
      //  Устанавливаем коэффициент усиления приёмника:               // Доступные значения: 1х, 2х, 4х, 8х (PGAIN_1X, PGAIN_2X, PGAIN_4X, PGAIN_8X). Чем выше коэффициент тем выше чувствительность
          if(apds.setProximityGain(PGAIN_2X)){                        // Если установлен коэффициент усиления приёмника в режиме определения расстояния, то ... 
                Serial.println("Set gain OK!");                       // Выводим сообщение об успешной установке коэффициента усиления приёмника
          }else{Serial.println("Set gain ERROR!");}                   // Иначе, выводим сообщение об ошибке при установке коэффициента усиления приёмника
                                                                      // Прочитать установленный коэффициент усиления приёмника можно так: uint8_t i = apds.getProximityGain(); // в переменную i сохранится значение: PGAIN_1X, или PGAIN_2X, или PGAIN_4X, или PGAIN_8X
      //  Разрешаем режим определения приближения:                    //
          if(apds.enableProximitySensor(false)){                      // Если механизм определения приближения (false - без прерываний на выходе INT) запущен, то ...
                Serial.println("Start proximity sensor OK!");         // Выводим сообщение об успешном запуске механизма определения приближения
          }else{Serial.println("Start proximity sensor ERROR!");}     // Иначе, выводим сообщение об ошибке запуска механизма определения приближения
                                                                      // Запретить работу механизма определения приближения можно так: bool j = apds.disableProximitySensor(); // в переменную j сохранится результат выполнения функции (true/false)
      //  Ждём завершение инициализации и калибровки:                 //
          delay(500);                                                 //
      }                                                               //
                                                                      //
      void loop(){                                                    //
      //  Читаем определённое датчиком значение приближения:          //
          if(apds.readProximity(proximityData)){                      // Если значение приближения корректно прочитано в переменную proximityData, то ..
                Serial.println((String) "Proximity="+proximityData);  // Выводим значение приближения
          }else{Serial.println("Reading proximity value ERROR!");}    // Иначе, выводим сообщение об ошибке чтения приближения
                                                                      //
      //  Приостанавливаем выполнение скетча на 1 секунду:            //
          delay(1000);                                                // Чтоб не перегружать шину I2C постоянными запросами
      }                                                               //

      Жесты:

        Trema-модуль Датчик жестов, приближения, освещенности, цвета способен реагировать на следующие жесты:
      • UP - Движение руки перед датчиком ВПЕРЁД или ВВЕРХ (зависит от положения датчика в пространстве).
      • DOWN - Движение руки перед датчиком НАЗАД или ВНИЗ (зависит от положения датчика в пространстве).
      • LEFT - Движение руки перед датчиком ВЛЕВО.
      • RIGHT - Движение руки перед датчиком ВПРАВО.
      • NEAR - Приближение руки К датчику.
        Плавно приблизьте руку к датчику сверху на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и быстро уберите в любую сторону.
      • FAR Удаление руки ОТ датчика.
        Быстро приблизьте руку к датчику с любой стороны, на расстояние ≈ 1-5 см., задержите её не менее чем на 1 секунду и плавно уберите от датчика вверх.
      • NONE Датчик зафиксировал движение, но не смог его распознать.

      Ссылки:

      Обсуждение