Хочу поделиться информацией по датчику - измерителю спектра AS7343. Стоит дешево, в продаже полно готовых платок для ардуины.
Я его прикупил довольно давно, но валялся без дела так как нормальный спектрофотометр у меня есть, поэтому особого стимула возится с датчиком не было. Собственно мне нужен был просто измеритель DLI для улицы, спектрометр тут не нужен, но имея на руках чип и не попробовать....
И тут Ваге под руку ссылку кинул, где он уже несколько лет назад поднимал на форуме тему построения спектрометра на датчиках типа AS7341 Тогда тема продолжения не имела и дальше пары постов типа таких не пошла:
Таки доехал до меня сенсор AS7341, ... Данные получаются, но вот что с ними дальше делать и как интерпретировать пока вообще без малейшего понятия.))
.......
на каждое изменение параметров ATIME,ASTEP,GAIN мы будем получать совершенно новых попугаев, которых всякий раз надо будет перекалибровывать )))
Короче. На случай если кому-то это еще интересно, вот базовая информация. Товарищи электронщики, даташиты таки читать надо... Правда даташитов на этот чип много, и одним не отделаться.
Итак, на борту у AS7343 14 каналов.
Из них один (FD) для детектирования мерцаний - не нужен. Остается 13.
Один канал ( VIS ) без светофильтра детектирует видимый свет - для спектрофотометра не нужен. Для нормальной измерялки интенсивности (PPFD или PAR по старому) - не нужен.
Из оставшихся три (FZ, FY, FXL) с довольно широким охватом по спектру, остальные более узкоспектральные. Итого 12 полезных каналов.
1. Работа собственно с микросхемой.
Тут вроде все относительно просто. Но есть тонкости.
Подключается стандартно по I2C. У меня на кабеле от мышки длиной почти 2 метра (190см) работает отлично на частоте 400кгц.
На борту 6 канальный АЦП, поэтому все 12 нужных каналов одновременно прочесть не может. Но есть режим автопереключения каналов, когда все датчики читаются пачками по шесть - за три такта все датчики прочитаны.
И тут у меня была первая засада. В прочитанных датчиках были явно перепутаны каналы (последовательность не такая, какая указана в даташите для этого режима). Кроме того, было впечатление, что на один канал в одном месте подключены одновременно два разных датчика. Потратил ОЧЕНЬ много времени (два дня), чтобы понять, в какой же реально последовательности микруха выдает каналы на выход. Не понял. Пришлось разбираться как конфигурировать каналы самостоятельно. Для этого у производителя есть отдельный большой даташит очень глубоко спрятанный в дебрях их сайта. Опустим неинтересные детали, но все заработало только после того, как каналы были переконфигурированы с дефолтного состояния в заданную мною последовательность.
Это я к тому пишу, что если у кого то (как у меня) по умолчанию микруха тупит, не тратьте время, переконфигурирует каналы на заданную вами последовательность, чтобы точно знать в какой регистр какой канал пишет данные, не полагайтесь на сказанное в даташите.
Других проблем с программированием самой микрухи нет.
2. Итак, получили мы с нее данные, и что с ними делать?
Для начала, чтобы не было вопросов, как в процитированных сообщениях выше (про попугаев). Считали с датчика попугаев (RAW_Counts в терминологии даташита), первым делом пересчитываем их в значения не зависящие от примененного усиления АЦП, времени интеграции и количества интеграций. Все это есть в даташите по калибровке (это отдельный даташит). Формула такая:
BasicCounts = RAW_Counts/(Gain*IntegrationTime)
Полученные значения BasicCounts не зависят от усиления (Gain), то есть можно использовать auto-gain и вообще не парится по поводу усиления и что-то там перекалибровывать.
Далее, BasicCounts для каждого канала умножаем на свой поправочный коэффициент в зависимости от Gain - коэффициенты эти очень небольшие, можно и пренебречь, но все же некоторое отклонение от линейности есть. Производитель дает матрицу 13 x 13 (в excel файле) с этими коэффициентами.
В итоге получили поканальные замеры, не зависящие от Gain и от нелинейности.
Далее, казалось бы, чего проще - есть измерения на разных длинах волн, сейчас мы быстренько нарисуем спектр... Ага, щас. Как оказалось - задача не имеет аналитического решения. Сюрприз.
Ну да, можно конечно столбиками нарисовать, или по пикам огибающую. Так себе результат, но хоть что-то. Проблема в том, что чувствительность каналов пересекается по нанометрам...
Даташит по калибровке предлагает следующее решение. Они дают матрицу, 12 столбцов (12 каналов, которые на графике выше, F1, F2 ... NIR) на 800 строк (нанометры от 300 до 1100 с шагом в 1 нм) с поправочными коэффициентами. Эту матрицу умножаем на матрицу данных с 12 каналов (да, мне пришлось гуглить, так как совершенно не помнил как умножать матрицы). Эти коэффициенты определяют вклад каждого канала на данную длину волны в построенном спектре. Причем влияние это крайне нетривиально и выглядит вот так:
И в итоге получаем... опять фигню получаем. С ходу не заработало - пришлось подбирать вручную коэффициенты, слегка меняющие вклад каждого канала в результирующий спектр. И по итогу всей недельной возни датчик стал выдавать мало мальски вменяемые спектры. Не спектрофотометр, конечно, но и зато цена копеечная.
Пока выдаваемые спектры выглядят вот так, не уверен, что буду доводить до ума, так как интерес свой удовлетворил, а на практике мне не надо.