Форум программистов, компьютерный форум, киберфорум
Eddy_Em
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Многоканальный ИК-болометр на MLX90640

Запись от Eddy_Em размещена 25.09.2025 в 16:35
Показов 3384 Комментарии 2

Постепенно дошел до "пре-альфы", ссылка на код на гитхабе.
В release-сборке вполне себе скромненько потребляет:
Code
1
2
3
4
Memory region         Used Size  Region Size  %age Used
             rom:         16 KB       128 KB     12.50%
             ram:       33680 B        40 KB     82.23%
          ccmram:          0 GB         8 KB      0.00%
Самыми жирными являются imdata+confdata в mlxproc.c (16660 байт), да буфер изображения mlx_image (3072Б) с вычисленными параметрами params (10100Б) в mlx90640.c. Ну и килобайтный кольцевой буфер на отправку в USB. Жаль, нет каких-нибудь простых штатных средств, чтобы отсортировать переменные по потребляемой ОЗУ. Нашел лишь в интернете совет, как посмотреть размер на стадии компиляции (хотя, конечно, можно было бы и в gdb посмотреть):
Code
1
char (*__kaboom)[sizeof( confdata )] = 1;
(при сборке gcc ругается и пишет размер в байтах).
Суммарно получилось где-то на 2.5кБ меньше, чем 33680Б. Вот и интересно, где собака порылась. Понятно, стек там неплохой, мелочь всякая локальная в куче, но таки не пара же килобайт? Может, где что завел временно, да забыл?

Протокол символьный. Если ввести '?', 'h' или 'H', получим в терминале:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
https://github.com/eddyem/stm32samples/tree/master/F3:F303/MLX90640multi build#66 @ 2025-09-24
    management of single IR bolometer MLX90640
aa - change I2C address to a (a should be non-shifted value!!!)
c - continue MLX
dn - draw nth image in ASCII
gn - get nth image 'as is' - float array of 768x4 bytes
i0..4 - setup I2C with speed 10k, 100k, 400k, 1M or 2M (experimental!)
l - list active sensors IDs
tn - show temperature map of nth image
p - pause MLX
s - stop MLX (and start from zero @ 'c')
tn - show nth image aquisition time
C - "cartoon" mode on/off (show each new image)
Dn - dump MLX parameters for sensor number n
G - get MLX state
Ia addr [n] - set  device address for interactive work or (with n) change address of n'th sensor
Ir reg n - read n words from 16-bit register
Iw words - send words (hex/dec/oct/bin) to I2C
Is - scan I2C bus
T - print current Tms
По USB эмулирую классический CDC. После подключения udev создает симлинк /dev/mlx_sensor0. Все вспоминаю COKPOWEHEU добрым словом за идею "маркировать" разные устройства (а также интерфейсы в составном устройстве — как, скажем, в контроллере энкодеров астросибовской монтировки) при помощи простого правила udev — через поле iInterface.

Когда у меня уже почти все заработало, нарвался натурально на stack overflow. Поначалу как-то миновало (но странно, почему: я в функцию запихнул стековую переменную размером 10100Б), а потом аукнулось. И эту структуру с пересчитанными коэффициентами я выделил отдельно на куче, а передавал в функции лишь ее адрес (или NULL в случае ошибки).

Однако, таки поначалу я надеялся, что и 8 датчиков можно будет повесить на один STM32, а тут — вона как! 3332 байта на одно изображение, да куча всякой всячины. Сейчас остается 7280Б свободного места. Т.е. хватит еще два датчика добавить, а восьмой — уже некуда. Разве что придумать что-то.
Кстати, можно сократить на 768Б структуру параметров, т.к. я не использую массив маркировок "битых" пикселей. Но это не спасет место, чтобы восьмой датчик впихнуть. Да и ладно: все равно для конкретного устройства нужно пять.

Алгоритм работы простой: вначале производится сбор "сырых" данных калибровочных параметров каждого датчика. Далее собираются отэкспонированные изображения ("подстраница 0" пропускается, собираются лишь "подстраницы 1" - где и есть вся нужная информация) по мере накопления. Если пользователь запрашивает изображение, рассчитываются калибровочные коэффициенты (увы, вся структура 10100 байт занимает, поэтому для всех пяти уже вычисленные хранить негде; во флеш их засовывать не хочется, но, в принципе, это возможно), а затем обрабатываются данные с болометра и выдается в запрашиваемом формате (условная "картинка" в ASCII, температуры в строковом виде или массив в float little-endian).
Из-за расчетов параметров время обработки одного изображения выросло с 8.5мс до 14мс, что совершенно не критично, т.к. изображения обычно на all-sky камерах меняются раз в 30-60 секунд.
Пересылать на компьютер "сырые" данные и обрабатывать там не хочу, т.к. получится уже не самостоятельное устройство (пусть и не склеивает панорамы, но позволяет получать готовые кадры), а "аппаратно-программный комплекс", что не очень хорошо.

Из TODO на дописать/доработать:
- управление питанием (отключать питание датчиков, если кто-то из них заблокирует SCL — а такое бывает иногда);
- отсылку по RS-485 (железка будет на столбе висеть, до компьютера кабель метров 10-15);
- эмуляцию проблем на шине (проверить: будет ли правильно отрабатывать включение/выключение питания и переход между состояниями КА);
- добавить BME280 для определения параметров внешней среды;
- добавить один-два NTC и управление мощным транзистором для подогрева корпуса (осушить в случае осадков или мороси);
- нарисовать печатную плату и корпус;
- изготовить и откалибровать по координатам - чтобы точно можно было "склеить" панораму из пяти снимков в один all-sky (калибровка, боюсь, будет самым длительным процессом).
Размещено в Железо
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Оно конечно очень интересно читать про чужие потуги и получать опыт.
    Но не имея никакого представления о том что это за объекты, как и где они эксплуатируются, какие расстояния между ними, требования к интеграции с существующими системами, какой бюджет разработки, какова цена ошибок и пр.
    Очень трудно додумывать всё это и наслаждаться красотой внедрённых решений.
    Запись от Aledveu размещена 27.09.2025 в 14:01 Aledveu вне форума
  2. Старый комментарий
    Все вопросы - ко мне в ЖЖшку. Здесь нет никакого механизма оповещения о том, что даже комментарий к записи появился...
    Запись от Eddy_Em размещена 28.09.2025 в 20:12 Eddy_Em вне форума
 
Новые блоги и статьи
Новая последнея моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru