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

Комментарии (10)


  1. Amomum
    22.02.2022 19:09
    +3

    Спасибо за статью!

    Было бы интересно почитать больше подробностей про сам процесс программирования - какую IDE использовали, насколько все плохо/хорошо с отладкой, какие специфические растопроблемы всплывали, которых на С++ не было бы?


    1. lesha108 Автор
      22.02.2022 19:36
      +2

      Я использую VSCode с плагинами, впечатления описал ранее здесь https://habr.com/ru/post/594885/


      1. Amomum
        23.02.2022 01:04

        Спасибо!


  1. roverseti
    22.02.2022 19:36
    -3

    Присоединяюсь!


  1. ku4in
    22.02.2022 21:10
    +1

    Помнится, в 2012 году собирал бегущую строку на таких индикаторах, микроконтроллере AVR и сдвиговых регисторах. Программировал на ассемблере. Было прикольно! https://vk.com/video10061883_164339516


  1. Astroscope
    22.02.2022 22:42
    +1

    Хорошо, но мало. :)

    Было бы интересно не (только) индикатор напряженности поля, но и измеритель common mode current, как один из редко используемых, но практически важных индикаторов согласования. Скорее всего его можно выполнить как трансформатор тока, просто намотав несколько витков поверх оболочки кабеля.


  1. vkni
    23.02.2022 01:46
    +2

    Спасибо за статью!

    Вы не подскажете, как называются эти самые матричные индикаторы? Очень красивые, страшно хочется что-то такое же.

    Ещё у вас очень забавный код на строке 90 и ниже - очень характерные переприсвоения переменной data, напоминающие про Окамловский псевдо-императивный код и SSE представление в компиляторах.


    1. lesha108 Автор
      23.02.2022 10:20
      +1

      Ищите на алиэкспресс по словам "MAX7219 Dot Matrix Module" или по фото. Там много кто их продаёт


  1. PR200SD
    23.02.2022 10:31

    Делал индикатор на esp с такими панелями, быстрое управление через Modbus TCP.


  1. boodilnik
    24.02.2022 13:19
    +1

    Недавно вдохновившись статьей о механическом дисплее с люминофором -https://habr.com/ru/post/374429/ - от скуки ради и пребывания в карантине, из подручных средств и фотолюминофорного лака для ногтей сделал вот такой показометр. Смысловой нагрузки и полезности в нем никакой - чисто фана ради. Показал бы видео, но не знаю как закинуть сюда.

    Фото