Простой показометр
С детства мне нравятся всякие мигающие лампочки на панелях управления, движущиеся стрелки и шкалы приборов — непременный атрибут фантастических фильмов о будущем и полетах в космос. Когда мне в руки попал светодиодный матричный индикатор с алиэкспресс, не смог себе отказать в удовольствии как-то применить его в хозяйстве. В результате проекта выходного дня родился очередной показометр, при создании которого пригодились знания 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!