Общие сведения:
Trema-модуль датчик освещённости и приближения APDS-9930 - это цифровой модуль на базе чипа APDS-9933, подключаемый по шине I2C (адрес 0x39), позволяющий получить текущие значения освещённости (лк) и приближения к препятствию. Еще одним применением данного модуля является определение пульсаций источников света.
Видео:
Редактируется
Характеристики:
- Напряжение питания модуля: 3,3 или 5 В постоянного тока (поддерживаются оба уровня).
- Потребляемый ток: настраивается до 100 мА во время измерений приближения.
- Ток потребляемый ИК-светодиодом: 100 / 50 / 25 / 12.5 мА (устанавливается программно).
- Ток потребляемый модулем (без учёта ИК-светодиода): до 3 мА.
- Измеряемый диапазон освещённости: от 0 до 8191 лк.
- Рабочая частота шины I2C: до 400 кГц.
- Адрес модуля на шине I2C: 0x39.
- Уровень логической «1» на шине I2C: до 3,3 В.
- Рабочая температура: -30 … +85 °C
- Габариты: 30x30 мм.
Все модули линейки "Trema" выполнены в одном формате
Подключение:
Модуль подключается к аппаратной или программной шине I2C Arduino. Логические уровни шины I2C не должны превышать напряжение питания.
Модуль удобно подключать 3 способами, в зависимости от ситуации:
Способ - 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 и тд.
Способ - 4: Подключение к программной шине I2C
При использовании программной шины I2C, модуль можно подключить к любым выводам Arduino, но потребуется дополнительно установить библиотеку iarduino_I2C_Software.h, для создания программной шины I2C, указав номера выбранных вами выводов. О том как это сделать читайте ниже в разделе «Подключение библиотеки», а так же на странице Wiki - Расширенные возможности библиотек iarduino для шины I2C.
Питание:
Входное напряжение питания от 3,3 до 5,5 В постоянного тока, подаётся на выводы VIN и GND модуля.
Подробнее о модуле:
Trema датчик освещённости и приближения APDS-9930 построен на базе одноимённого датчика APDS-9930, в состав которого входят: ИК-светодиод с программируемым драйвером, два фотодиода для определения общей освещённости (Ch0) и освещённости в ИК-диапазоне (Ch1), усилители с программируемым коэффициентом усиления, МК, АЛУ, АЦП, ОЗУ, контроллер шины I2C с адресом ведомого 0x39 и множество дополнительных блоков. Результаты освещённости в Lux выводятся с использованием эмпирической формулы для аппроксимации реакции человеческого глаза.
Для работы с модулем предлагаем воспользоваться разработанной нами библиотекой iarduino_APDS9930, позволяющей получать освещённость, коэффициент пульсаций источника света и близость препятствий.
Подробнее про установку библиотеки читайте в нашей инструкции.
Примеры:
Вывод освещённости в люксах:
#include <Wire.h> // Подключаем библиотеку Wire для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_APDS9930. #include <iarduino_APDS9930.h> // Подключаем библиотеку для работы с датчиком APDS-9930. iarduino_APDS9930 apds; // Определяем объект apds для работы с датчиком APDS-9930. // Если у датчика не стандартный адрес, то его нужно указать: iarduino_APDS9930 apds(0xFF); void setup(){ // Serial.begin(9600); // Инициируем передачу данных в монитор на скорости 9600 бит/сек. apds.begin(&Wire); // Инициируем работу датчика, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). } // Функция возвращает значение true/false по которому можно судить об успехе инициализации. // void loop(){ // Serial.print( "Light=" ); // Выводим текст. Serial.print( apds.getLight() ); // Выводим освещённость. Serial.print( " lx. \r\n" ); // Выводим единицу измерения, а так же символы конца и перевода строки. delay(100); // } //
Вывод коэффициента пульсаций в %:
#include <Wire.h> // Подключаем библиотеку Wire для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_APDS9930. #include <iarduino_APDS9930.h> // Подключаем библиотеку для работы с датчиком APDS-9930. iarduino_APDS9930 apds; // Определяем объект apds для работы с датчиком APDS-9930. // Если у датчика не стандартный адрес, то его нужно указать: iarduino_APDS9930 apds(0xFF); void setup(){ // Serial.begin(9600); // Инициируем передачу данных в монитор на скорости 9600 бит/сек. apds.begin(&Wire); // Инициируем работу датчика, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). } // Функция возвращает значение true/false по которому можно судить об успехе инициализации. // void loop(){ // Serial.print( "Pulsation=" ); // Выводим текст. Serial.print( apds.getPulsation() ); // Выводим коэффициент пульсаций. Serial.print( " lx. \r\n" ); // Выводим единицу измерения, а так же символы конца и перевода строки. delay(100); // } //
Вывод близости препятствия:
#include <Wire.h> // Подключаем библиотеку Wire для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_APDS9930. #include <iarduino_APDS9930.h> // Подключаем библиотеку для работы с датчиком APDS-9930. iarduino_APDS9930 apds; // Определяем объект apds для работы с датчиком APDS-9930. // Если у датчика не стандартный адрес, то его нужно указать: iarduino_APDS9930 apds(0xFF); void setup(){ // Serial.begin(9600); // Инициируем передачу данных в монитор на скорости 9600 бит/сек. apds.begin(&Wire); // Инициируем работу датчика, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). } // Функция возвращает значение true/false по которому можно судить об успехе инициализации. // void loop(){ // Serial.print( "Proximity=" ); // Выводим текст. Serial.println( apds.getProximity() ); // Выводим близость препятствий от 0 (нет препятствий), до 1023 (минимальное расстояние до препятствия). delay(100); // } //
Описание функций библиотеки:
В данном разделе описаны функции библиотеки iarduino_APDS9930 для работы с датчиком освещённости и приближения APDS-9930.
Библиотека iarduino_APDS9930 может использовать как аппаратную, так и программную реализацию шины I2C. О том как выбрать тип шины I2C рассказано ниже в разделе «Подключение библиотеки», а так же на странице Wiki - расширенные возможности библиотек iarduino для шины I2C.
Подключение библиотеки:
- Если используется аппаратная шина I2C:
#include <Wire.h> // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_APDS9930.h // #include <iarduino_APDS9930.h> // Подключаем библиотеку для работы с модулем. iarduino_APDS9930 apds; // Создаём объект apds, для работы с функциями библиотеки iarduino_APDS9930. // void setup(){ // ... // apds.begin(&Wire); // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). ... // Доступны объекты: &Wire, &Wire1, &Wire2... } //
- Если используется программная шина I2C:
#include <iarduino_I2C_Software.h> // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_APDS9930.h SoftTwoWire sWire(3,4); // Создаём объект программной шины I2C указав выводы которым будет назначена роль линий: SDA, SCL. // #include <iarduino_APDS9930.h> // Подключаем библиотеку для работы с модулем. iarduino_APDS9930 apds; // Создаём объект apds, для работы с функциями библиотеки iarduino_APDS9930. // void setup(){ // ... // apds.begin(&sWire); // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire). ... // } //
- В обоих примерах сначала подключается библиотека для работы с шиной I2C. Для аппаратной шины библиотека
Wire.h
(предустановлена в Arduino IDE), а для программной шины библиотека iarduino_I2C_Software.h, с созданием объекта которому указываются выбранные вами выводы шины, в примере выводы(3-SDA, 4-SCL)
. - Далее подключается библиотека и создаётся объект для работы с модулем.
- В коде
Setup()
, при инициализации работы с модулем указывается ссылка на объект работы с выбранной шиной I2Cbegin(&ШИНА)
. Остальные строки кода одинаковы для любой шины I2C.
Функция begin();
- Назначение: Инициализация работы с датчиком.
- Синтаксис: begin();
- Параметры:
- &ШИНА - Ссылка на объект для работы с шиной I2C на которой находится модуль.
- Для аппаратной шины: &Wire, &Wire1, &Wire2..., если подключена библиотека Wire.h
- Для программной шины: ссылка на объект библиотеки iarduino_I2C_Software.h.
- Параметр является не обязательным, по умолчанию используется ссылка &Wire.
- Возвращаемые значения: bool - результат инициализации (true или false).
- Примечание: Функцию достаточно вызвать один раз в коде setup().
- Пример:
apds.begin(); // Инициируем работу датчика без проверки.
if(apds.begin()){Serial.println("OK!" );} // Инициируем работу датчика и выводим сообщение «OK!» при успехе. else {Serial.println("ERR!");} // Если инициализация провалилась, то выводим сообщение «ERR!».
Функция reset();
- Назначение: Перезагрузка модуля.
- Синтаксис: reset();
- Параметры: Нет
- Возвращаемые значения: bool - результат перезагрузки (true или false).
- Примечание: Результат перезагрузки идентичен результату инициализации.
- Пример:
apds.reset(); // Перезагружаем датчик без проверки.
if(apds.reset()){Serial.println("OK!" );} // Перезагружаем датчик и выводим сообщение «OK!» при успехе. else {Serial.println("ERR!");} // Если перезагрузка не выполнена, то выводим сообщение «ERR!».
Функция getLight();
- Назначение: Чтение освещённости в люксах.
- Синтаксис: getLight();
- Параметры: Нет.
- Возвращаемые значения: uint16_t - уровень освещённости от 0 лк до 8191 лк.
- Примечание: Чем выше коэффициент пульсаций источника света, тем выше будет разброс значений возвращаемых данной функцией.
- Пример:
uint16_t i; // Объявляем переменную i. i = apds.getLight(); // Читаем освещённость в переменную i.
Функция getPulsation();
- Назначение: Чтение коэффициента пульсаций источника света в %.
- Синтаксис: getPulsation();
- Параметры: Нет.
- Возвращаемые значения: uint8_t - коэффициент пульсаций от 0% до 100%.
- Примечание: Выполнение функции занимает около 100 мс.
- Пример:
uint8_t i; // Объявляем переменную i. apds.getPulsation(); // Читаем коэффициент пульсаций в переменную i.
Функция getProximity();
- Назначение: Чтение близости к препятствию.
- Синтаксис: getProximity();
- Параметры: Нет.
- Возвращаемые значения: uint16_t - уровень близости к препятствию, от 0 (нет препятствий), до 1023 (минимальное расстояние до препятствия).
- Примечание: Уровень близости нелинеен по отношению к расстоянию и зависит от цвета препятствия.
- Пример:
uint16_t i; // Объявляем переменную i. apds.getProximity(); // Читаем уровень близости препятствий в переменную i.
Функция setCurrentDiode();
- Назначение: Функция задаёт ток протекающий через светодиод датчика. Светодиод используется в импульсном режиме для определения близости препятствий.
- Синтаксис: setCurrentDiode( [ ТОК СВЕТОДИОДА ] );
- Параметры: ТОК СВЕТОДИОДА - задаётся одной из констант:
- APDS9930_DIODE_100 - установить ток через светодиод в 100 мА.
- APDS9930_DIODE_50 - установить ток через светодиод в 50 мА
- APDS9930_DIODE_25 - установить ток через светодиод в 25 мА
- APDS9930_DIODE_12 - установить ток через светодиод в 12,5 мА
- Возвращаемые значения: bool - результат применения новых настроек (true или false).
- Примечание:
- По умолчанию задан ток в 25 мА.
- Пример:
apds.setCurrentDiode(APDS9930_DIODE_50); // Установить ток через светодиод в 50 мА.
Применение:
- Получение данных для метеостанций.
- Проверка осветительных приборов на наличие пульсаций.
- Проверка уровня освещённости в помещениях.
- Используя чтение близости, модуль можно превратить в:
- Бесконтактный тахометр.
- Счетчик объектов прошедших по конвейеру.
- Датчик препятствий.
- Датчик линии.
- Бесконтактный тахометр.
Обсуждение