- PVSM.RU - https://www.pvsm.ru -

Пояснение переводчика: в статье речь пойдет об изготовлении устройства, которое позволяет делать фотографии изображения в различных участках спектра электромагнитных волн.
Цитата из Википедии: спектрозональная съёмка производится для получения изображений деталей объекта, неразличимых в видимом свете.
В статье много фото.
В данном случае автор приводит пример самостоятельного изготовления подобного непростого устройства.
Я уже давно планировал собрать эту систему, и как только у меня появилось свободное время, направился в наш местный хакспейс (TAMI [1]), где этим и занялся. Состоит оно в итоге из нескольких сотен светодиодов, посаженных на одну шину I2C, и темного ящика, который на 1/3 изнутри обклеен алюминиевой фольгой (альтернатива – пенополистирол) для максимально равномерного рассеивания света, а на 2/3 черным картоном для минимизации отражения лучей. Все светодиоды я объединил группами по 4 штуки, чтобы добиться большей яркости.
Начался весь проект с покупки светодиодов, которые обошлись мне около $0.5 каждый.

Затем я красиво разместил их все на алюминиевом листе, который также выступил в роли теплоотвода.

Каждая группа из 4-х светодиодов подключена к МОП-транзистору и мультиплексору (pca9685). Я подумываю заменить этот pca9685 [2] на pca9635 [3] (1кГц против 97кГц) и добавить фототранзистор для настройки ШИМ светодиодов с обратной связью. Также можно проверить время нарастания и спада свечения каждой группы. В качестве источника постоянного тока я задействовал драйвер LDD-700H [4], а в качестве контроллера Raspberry Pi (код будет приведен далее).

Тестирование светодиодов перед установкой:
Дополнительное тестирование (белый лист А4 и эталон отражения):
Все цвета я проанализировал спектрометром: получилось от ~370нм до ~880нм, а цветовая температура белого 2.7К, 6К, 10К:

Пардон за косячное фото экрана – получил бракованный дисплей для планшета x61t
Далее нужно просверлить большое отверстие в центре алюминиевой пластины под монохроматическую камеру.
Памятка себе: найти фотодиод FDS010 [5]?). Для получения реальных значений ШИМ и яркости света фотодиод/фототранзистор должен соответствовать спектру светодиодов. Нашел подходящий в ящике инструментов (FDS10X10?, S2387-1010R?, 340нм-110нм ?).

Думаю, пока этого будет достаточно. Похоже, что стандартным решением для преобразования тока фотодиода в напряжение является LTC1050 [6].
Съемка экрана планшета (лист авокадо) на телефон. Изображение получено с монохроматической камеры, еще не откалиброванной и не синхронизированной со светодиодами.
Апдейт по сборке: добавил сенсорный дисплей – нужно еще исправить драйвер eGalax (apt install xserver-xorg-input-evdev, отредактировать /etc/X11/xorg.conf, заменить libinput на evdev, apt install xinput-calibrator, поменять местами оси x-y дисплея).

Все запитано от одного БП (драйвер светодиодов 15В, дисплей 12В, Pi 5В).

Просверлил отверстие

Тест системы с временным держателем камеры
Притащил из TAMI несколько кусков анодированного алюминия, из которых собрал настраиваемый кронштейн для камеры.

Дополнительные фото
Апдейт: важно, чтобы в объектив попадал только отраженный от тестируемого объекта свет, поэтому я измерил отверстие и подобрал подходящую ПВХ-трубу, которая вошла в него достаточно плотно. Обрезал я ее коротковато – по факту оказалось, что лучше ее сделать длиннее.

Измерение отверстия

Измерение ПВХ-трубы

Установил объектив с более широким углом обзора
Похоже, что мне удалось добиться улучшения, несмотря на слишком короткую трубу (думаю, желательна длина от 10см). В качестве временного решения я ее наращу с помощью черного картона и оберну внешнюю сторону фольгой.


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

Обновленный вид установки

Добавил магнитный фиксатор дверцы
Еще одно видео. Здесь потеряна пара кадров из-за недостатка питания для Pi. На этот раз снимал лист картофеля с обработкой изображения при помощи OpenCV (функция CLAHE [7]).
Находясь в ожидании заказанного апгрейда в виде Nvidia Jetson, решил поработать над косметикой.

Дополнительные фото
И вот мой «презент» готов к ведению многозональной съемки.
Как и обещал, привожу:
Кодfrom __future__ import division import time import Adafruit_PCA9685 import cv2 from pyueye import ueye import ctypes import datetime pwm = Adafruit_PCA9685.PCA9685(address = 0x40) #1st pwm1 = Adafruit_PCA9685.PCA9685(address = 0x41) #2nd pwm2 = Adafruit_PCA9685.PCA9685(address = 0x42) #3rd pwm.set_pwm_freq(1000) pwm1.set_pwm_freq(1000) pwm2.set_pwm_freq(1000) spec = "avo_leaf" #name of speciment led = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31] lux = [1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931] #temporary initial value 0, 4095 for x,y in zip(led, lux): if (x < 16): pwm.set_pwm(x,y,0) #led on 1st mux elif ( x>14 and x<32): pwm1.set_pwm(x-16,y,0) #led on 2nd mux elif (x>31 and x<33): pwm2.set_pwm(x-32,y,0) #led on 3rd mux else: print(x) hcam = ueye.HIDS(1) pccmem = ueye.c_mem_p() memID = ueye.c_int() hWnd = ctypes.c_voidp() ueye.is_InitCamera(hcam, hWnd) sensorinfo = ueye.SENSORINFO() ueye.is_GetSensorInfo(hcam, sensorinfo) ueye.is_AllocImageMem(hcam, sensorinfo.nMaxWidth, sensorinfo.nMaxHeight,24, pccmem, memID) ueye.is_SetImageMem(hcam, pccmem, memID) nret = ueye.is_FreezeVideo(hcam, ueye.IS_WAIT) if (nret == 0): print("camera") else: print("____problem!!!____") FileParams = ueye.IMAGE_FILE_PARAMS() FileParams.pwchFileName = spec + "_led_"+str(x+1)+"_cam_"+ datetime.datetime.now().strftime("%s") + ".bmp" FileParams.nFileType = ueye.IS_IMG_BMP FileParams.ppcImageMem = None FileParams.pnImageID = None nret = ueye.is_ImageFile(hcam, ueye.IS_IMAGE_FILE_CMD_SAVE, FileParams, ueye.sizeof(FileParams)) if (nret == 0): print("camera") else: print("____problem!!!____") ueye.is_FreeImageMem(hcam, pccmem, memID) ueye.is_ExitCamera(hcam) if (x < 16): pwm.set_pwm(x,0,0) #led off 1st mux elif ( x>14 and x<32): pwm1.set_pwm(x-16,0,0) #led off 2nd mux elif (x>31 and x<33): pwm2.set_pwm(x-32,0,0) #led off 3rd mux else: print(x)
В целом получился занятный проект, и я планирую довести его до ревизии 2.0. В частности:
В качестве дополнения рекомендую ознакомиться с реализацией продвинутого аналога подобной системы специалистами NASA [10]. Вот их небольшое видео:
Конкурс статей от RUVDS.COM [11]. Три денежные номинации. Главный приз — 100 000 рублей.
Автор: Дмитрий Брайт
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/378572
Ссылки в тексте:
[1] TAMI: https://telavivmakers.org/index.php/Main_Page
[2] pca9685: https://cdn-shop.adafruit.com/datasheets/PCA9685.pdf
[3] pca9635: https://www.nxp.com/docs/en/data-sheet/PCA9635.pdf
[4] LDD-700H: https://www.mouser.com/ds/2/260/LDD-H-spec-766227.pdf
[5] FDS010: https://www.thorlabs.com/newgrouppage9.cfm?objectgroup_id=285
[6] LTC1050: https://www.analog.com/media/en/technical-documentation/data-sheets/1050fb.pdf
[7] CLAHE: https://docs.opencv.org/3.1.0/d5/daf/tutorial_py_histogram_equalization.html
[8] Raspberry Pi: https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/#buy-now-modal
[9] Nvidia Jetson Nano: https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-nano/?nvid=nv-int-mn-78458
[10] продвинутого аналога подобной системы специалистами NASA: https://www.nasa.gov/ames/las/midar
[11] Конкурс статей от RUVDS.COM: https://bit.ly/3bDQroY
[12] Источник: https://habr.com/ru/post/685896/?utm_source=habrahabr&utm_medium=rss&utm_campaign=685896
Нажмите здесь для печати.