Использование scilab gui для измерений rgb и lux

Использование scilab gui для измерений rgb и lux
Использование scilab gui для измерений rgb и lux
Anonim

Использование графического интерфейса Scilab для измерений RGB и Lux

Собирайте данные через USB с оптического датчика BH1745NUC, а затем отобразите цветовые характеристики и значения освещенности.

Вспомогательная информация

  • В этой статье представлен Scilab.
  • В двух предыдущих статьях представлена информация о включении USB-связи в проект EFM8: Связь с микроконтроллером EFM8 через USB и EFM8 Sound Synthesizer: воспроизведение мелодий через USB.
  • Этот проект является расширением функциональности, описанной в Design Color Sensor, с измерениями, отображаемыми через светодиодный модуль RGB, часть 1 и часть 2. Этот проект, а также проект, описанный в этой статье, используют печатную плату специального назначения; обратитесь к разделу «Специальная конструкция печатной платы с микроконтроллером EFM8» для руководства по включению микроконтроллеров EFM8 в ваше пользовательское оборудование.

Удобная система оптического анализа

Цель этого проекта - превратить нашу схему EFM8-plus-BH1745NUC в систему на основе USB для мониторинга и анализа цветовых характеристик и освещенности любого света, освещающего датчик. Вы можете использовать эту систему для определения содержимого RGB, генерируемого любым источником света, но целью является общая оценка окружающего освещения. Эта система предоставляет информацию о двух наиболее важных аспектах окружающего освещения: освещенность, которую можно охарактеризовать как «эффективную яркость» (подробнее здесь) и спектральный состав, который влияет на физиологическую и психологическую реакцию человека на условия освещения (подробнее по спектральному составу здесь, в разделе «Цвета белых»).

Графический интерфейс

Это графический пользовательский интерфейс, который мы будем использовать для этого проекта:

Image
Image

GUI работает в Scilab и был разработан с помощью инструментария GUI Builder, который вы можете загрузить через диспетчер модуля ATOMS Scilab:

Image
Image

Вы можете использовать следующую ссылку для загрузки графического интерфейса (это всего лишь один текстовый файл).

Сценарий GUI

Сначала вы используете кнопку «Открыть порт VCP», чтобы установить соединение виртуального COM-порта с микроконтроллером EFM8. Затем выберите желаемый интервал между запросами данных; Минимум 5 секунд. После того, как вы нажмете «Начать сбор данных RGBC», GUI повторно запрашивает данные, пока не нажмете «Остановить сбор данных RGBC». Вертикальные слайдеры и маленький цветной прямоугольник передают данные RGB для самых последних измерений, а на графике показаны все значения люкс с начала текущего периода сбора данных; чтобы очистить график и начать новую запись lux, нажмите «Остановить сбор данных RGBC», затем «Начать сбор данных RGBC».

Функциональность построения графика полезна для отслеживания изменений освещенности - например, вы можете записать, сколько освещенности обеспечивается окнами в течение дня, и эта информация может помочь вам определить подходящий график для искусственного освещения. (Изменения в приведенном выше графике отражают изменения освещенности в помещении, вызванные «частично облачными» погодными условиями.) Ползунки и прямоугольник представляют собой два разных способа отображения информации о цвете: ползунки позволяют точно оценить долю красного, зеленого, и синий свет в падающем излучении, тогда как прямоугольник объединяет красные, зеленые и синие пропорции в один цвет, который представляет, какие длины волн являются доминирующими.

Цвет конвейера

Давайте рассмотрим некоторые примеры того, как GUI сообщает информацию RGB для разных источников света. Следующие графики спектрального состава (доступные здесь) из Национального института стандартов и технологий напоминают нам о том, что мы должны ожидать от солнечного света, ламп накаливания и белых светодиодов; пиковая длина волны чувствительности наших детекторов R, G и B составляет около 625 нм, 535 нм и 455 нм соответственно.

Image
Image

Ниже приведены результаты косвенного солнечного света, проходящего через окно. Обратите внимание, что синий и зеленый доминируют со значительно меньшим количеством красного цвета, что приводит к зеленовато-голубоватому прямоугольнику. Это согласуется с общим спектральным трендом, показанным на приведенном выше графике.

Image
Image

Затем у нас есть результаты для ламп накаливания. Обратите внимание на то, как прямоугольник сразу передает преобладание более длинных (т. Е. Желтых / оранжевых / красных) длин волн. Ползунки также точно показывают, как интенсивность спектра накаливания увеличивается с длиной волны.

Image
Image

Наконец, у нас есть данные для света от белого светодиодного фонарика. Белые светодиоды известны своей большей частью синих длин волн, и это именно то, что мы видим в цветном прямоугольнике и ползунах.

Image
Image

Примечание. Ползунки работают в абсолютном масштабе. Максимальное значение по умолчанию для каждого слайдера составляет 5000. Это хорошо работает для измерения внутри помещений, но интенсивность будет легко превышать это в ситуациях с наружной или другой высокой яркостью. В следующем фрагменте кода показано, где можно настроить максимальные значения:

Image
Image

В поисках Люкс

Не так просто выполнить точные измерения освещенности, факт, о котором вам хорошо известно, если вы прочитали мои три предыдущих статьи по этой теме («Понимание освещенности: что в Lux» и «Измерение и вычисление значений люкс», часть 1 и часть 2). Графический интерфейс, разработанный для этого проекта, следует процедуре расчета, рассмотренной в разделе «Измерение и вычисление значений люкс», часть 2. Вот моя реализация Scilab-script этой процедуры:

Image
Image

Ниже приведен код, который я использую для создания цветного прямоугольника. Метод масштабирования обсуждается в Design Color Sensor с измерениями, отображаемыми через светодиодный модуль RGB, часть 2; Я повторю основные предложения для вашего удобства:

Наша цель здесь - «измерить» цвет, независимо от общей интенсивности света, освещающего фотоприемники. Таким образом, нам необходимо масштабировать значения RGB таким образом, чтобы стандартизировать абсолютное значение измерений при сохранении относительного значения, другими словами, мы максимизируем общую интенсивность, сохраняя при этом долю красного, зеленого и синего в падающем свете, Чтобы достичь этого, мы умножаем наивысшее из трех измерений любым фактором, который увеличивает это самое высокое измерение до максимального значения, затем мы умножаем два других измерения на один и тот же коэффициент.

Image
Image

Важное примечание. Техническое описание для BH1745NUC указывает, что характеристики чувствительности, приведенные в таблице «Электрические характеристики», основаны на измерениях, выполненных с внутренним усилением датчика, установленным в 16 раз. Я считаю, что это ошибка; Я вычислил чувствительность, предполагая, что коэффициент усиления равен 1х. Ошибка такого рода не была бы удивительной с точки зрения общего качества таблицы данных; на самом деле, одна из других спецификаций в этой таблице, похоже, содержит аналогичную ошибку. Кроме того, большинство моих измерений lux показывают, что чувствительность на основе 1x правильная. Я выполнил два эксперимента, один с лампами накаливания и один со свечой, и в обоих случаях мои значения люкс соответствовали теоретическим предсказаниям - разумеется, не в 16 раз. Однако мои значения люкс для наружных условий на открытом воздухе казались слишком низкий, хотя увеличение этих значений в 16 раз сделало бы их слишком высокими. Низкие значения наружного освещения могут быть связаны с некоторой степенью насыщенности или десенсибилизации, которая возникает при очень высоких интенсивностях света - техническое описание указывает, что динамический диапазон датчика простирается только до 40 000 люкс, тогда как прямой солнечный свет может превышать 100 000 люкс. Итог, больше экспериментов необходимо для того, чтобы определить, как оптимизировать измеритель люкс на основе BH1745NUC.

Прошивка

Вот ссылка для загрузки прошивки.

Прошивка

Пожалуйста, обратитесь к разделу «Дизайн цветового датчика» с измерениями, отображаемыми через светодиодный модуль RGB, часть 1 и часть 2, для получения информации о прошивке, используемой в этом проекте. Большинство функций USB, необходимых для связи с Scilab, находятся в исходном файле «USBInterface.c»:


uint16_t xdata USBBytesRcvd = 0; //holds size of received packet uint16_t xdata USBBytesTransmitted = 0; //holds number of bytes actually transmitted uint8_t xdata USBRxPacket(USB_PACKET_SIZE); //packet received from host bit REQUEST_RGBC_DATA = FALSE; bit REQUEST_TEMP_DATA = FALSE; /****************************************************************************** * VCPXpress callback * This function is called by VCPXpress. *****************************************************************************/ VCPXpress_API_CALLBACK(myAPICallback) { uint32_t API_InterruptCode; //get the code that indicates the reason for the interrupt API_InterruptCode = Get_Callback_Source(); //if the USB connection was just opened if (API_InterruptCode & DEVICE_OPEN) { //start the first USB read procedure Block_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesRcvd); /*we will process the received bytes when we get a callback with an RX_COMPLETE interrupt code*/ } if (API_InterruptCode & RX_COMPLETE) //USB read complete { //confirm that the received packet is the proper length if(USBBytesRcvd == USB_CMD_LEN) { //'R' indicates that the host is Requesting data if(USBRxPacket(0) == 'R') { //is the host requesting data from the RGBC sensor? if(USBRxPacket(2) == 'R' & USBRxPacket(3) == 'G' & USBRxPacket(4) == 'B' & USBRxPacket(5) == 'C') { REQUEST_RGBC_DATA = TRUE; } //is the host requesting data from the thermocouple IC? else if(USBRxPacket(2) == 'T' & USBRxPacket(3) == 'E' & USBRxPacket(4) == 'M' & USBRxPacket(5) == 'P') { REQUEST_TEMP_DATA = TRUE; } } } //continue with the next USB read procedure Block_Read(USBRxPacket, USB_PACKET_SIZE, &USBBytesRcvd); } } void TransmitUSB_TempData() { Block_Write(TempDataTx, TEMP_DATA_LEN, &USBBytesTransmitted); } void TransmitUSB_RGBCData() { Block_Write(I2C_RcvData, RGBC_DATA_LEN, &USBBytesTransmitted); }

Вы заметите, что код USB включает запрос данных о температуре в дополнение к запросу для данных RGBC. Это дает вам пример того, как включить дополнительные команды в интерфейс USB (функциональность измерения температуры будет использоваться в будущем проекте).