
С детства мне нравятся всякие мигающие лампочки на панелях управления, движущиеся стрелки и шкалы приборов – непременный атрибут фантастических фильмов о будущем и полетах в космос. Когда мне в руки попал светодиодный матричный индикатор с алиэкспресс, не смог себе отказать в удовольствии как-то применить его в хозяйстве. В результате проекта выходного дня родился очередной показометр, при создании которого пригодились знания stm32 и rust.
Речь пойдет о использовании довольно широко известного индикатора на 4 матрицах 8х8 светодиодов. Управляется индикатор микросхемами MAX7219. Симпатичная штука, часто используемая в проектах на Arduino. Но сейчас я увлечён rust, поэтому решил сделать показометр с его помощью и bluepill.

Да, самое главное, что же он будет показывать? У меня есть любительская радиостанция, в ходе работы который необходимо контролировать множество параметров. К счастью, у используемого мной трансивера как раз есть линейный выход для подключения внешних индикаторов, причём назначения выходов можно задать из меню трансивера. Я остановился на показателе выходной мощности трансивера и измерителе уровня принимаемого сигнала (так называемый S-метр). В зависимости от уровня сигнала на линейном выходе выдаётся напряжение в диапазоне от 0 до 5 вольт. Довольно удобно для подключения как традиционных стрелочных измерительных головок, так и подключения к микроконтроллерам.
Мне показалось, что двух измерителей маловато и я решил еще сделать индикатор электромагнитного поля. Это такая штука, которой я хотел оценивать насколько во время работы в эфире я себя облучаю ЭМП. Когда радиостанция включается на передачу, по уму вся энергия должна уходить в антенну, а потом корреспондентам, но так бывает не всегда. Если антенна плохо настроена, есть проблемы с соединением кабелей и т.п., то значительная часть энергии теряется и ВЧ волны начинают излучаться где попало. Эту ситуацию как раз можно отследить, используя индикатор электромагнитного поля. По сути это простой широкопол��сный приёмник очень простой конструкции. Иногда для его реализации используется всего один диод.
Я же для себя решил использовать найденную в одном из журналов «Радио» схему, которая использует в качестве приёмника микросхему логарифмического усилителя AD8307. Такой усилитель очень удобен для оценки напряженности поля, поскольку позволяет измерять его в очень широком диапазоне. Вот исходная схема:
В своём индикаторе я запитал микросхему AD8307 прямо от bluepill напряжением 3.3 вольта, а выход усилителя просто подключил к аналого-цифровому преобразователю STM32. В качестве антенны выступил короткий проводок, располагающийся внутри корпуса показометра.
Собственно, это самая сложная часть устройства. Пришлось еще сделать пару резистивных делителей напряжения чтоб согласовать 5 вольтовый выход трансивера с 3,3 вольтовыми входами АЦП.
Пара слов о питании. Индикатор на светодиодах при включении всех пикселей потребляет порядка 800 мА, так что пришлось всё это дело запитать от отдельного адаптера и импульсного стабилизатора на 5 вольт.
Вся конструкция уместилась в небольшой корпус, как видно на КДПВ. В программной части всё тоже очень просто. Программа заняла всего несколько десятков строк на rust. На crates.io нашёлся подходящий драйвер дисплея, что значительно упростило разработку. В программе в бесконечном цикле читаются показания АЦП, масштабируются в линейку из 64 светодиодов и отображаются на индикаторе. Таким образом на показометре формируются три светодиодные полоски высотой в два пикселя каждая. Длина каждой полоски, как можно догадаться, пропорциональна напряжению на соответствующем входе АЦП.
Исходный код можно посмотреть здесь.
Микроконтроллер работает быстро, шину SPI, по которой идёт обмен с данными с MAX7219 я тоже настроил на высокую частоту, так что никаких задержек в отображении нет. Получилось очень динамично. Для качественной оценки уровней сигналов меня вполне устраивает, даже не стал мудрить с калибровкой и шкалами значений. Показометр – это всё же не точный измерительный прибор.
В рамках популяризации embedded rust хочу ещё раз отметить, что программа получилось не сильно сложнее аналогичной для Arduino. Так что смелее экспериментируйте с Rust!
