Pull to refresh

Рисуем на экране осциллографа

Abnormal programming *
Hello HabrМоё первое знакомство с осциллографом состоялось в школьном радиокружке, тогда же я узнал про режим X-Y, при котором отключается развёртка и лучом управляется непосредственно напряжениями, подаваемыми на входы X и Y. Снова эта тема всплыла через несколько лет, в университете, когда на лабораторных работах при помощи фигур Лиссажу мы учились определять кратность частот сигналов. Потом пошёл работать в программисты, и следующую пару десятилетий к бегающему по экрану лучику я не возвращался, пока в конце прошлого года мне не позвонили соседи. Наводя порядок в подвале, они наткнулись на старую коробку с электроникой, которую тут же и подарили мне, в обмен на обязательство самому всё забрать. Так мне достался старый аналоговый осциллограф, минимум 25-летней давности. К удивлению, после замены старого сетевого кабеля он сразу же заработал, и я решил применить свои программистские навыки, чтоб нарисовать что-нибудь на экране.

В Интернете нашлись примеры созданных на компьютере звуковых файлов, которые надо проигрывать, подключив входы осциллографа к правому и левому каналам аудиокарточки. Некоторые из них даже не страшно слушать человеческому уху. Мне же захотелось управлять лучом осциллографа прямо из программы, в реальном времени, так что я выбрал микроконтроллер. У Arduino DUE есть прямо на борту два 12-битных цифро-аналоговых-преобразователя, а тактовая частота 84 MHz и 96 KB памяти снижают требования к оптимизации программ. При написании кода можно поставить читаемость кода впереди скорости, при этом контроллер всё равно справляется с созданием довольно сложных изображений. Никаких шилдов или иной внешней электроники не требуется, осциллограф можно подключать прямо к выходам ардуинки:

image

Была создана простейшая графическая библиотека с функциями для рисования точек и линий, плюс возможностью задать скорость рисования. Не думаю, что есть смысл пересказывать алгоритм Брезенхайма, я его практически без изменений портировал из Википедии. Все исходные тексты лежат в свободном доступе на GitHub-е. Программа состоит из десятка классов наследников GraphBase, каждый из них рисует на экране простой сюжетик. Например, движущийся текст, ёлочку, или праздничный салют. Осциллограф был поставлен ёлку в виде электронной открытки, так что мотивы в основном новогодние.

Лучше один раз увидеть, чем сто раз прочитать, так что сразу перехожу к видео:


Результаты экспериментов и выводы:
  • Я пробовал подключить к микроконтроллеру и современный цифровой осциллограф, но картинка на аналоговом намного приятней. Плавно угасающее послесвечение люминофора создаёт «тёплую ламповую» атмосферу.
  • Arduino DUE в доли секунды справляется с расчётом тригонометрических функций, скорости хватило для вычисления координат «цветка» в реальном времени. Для фигур Лиссажу нужен больший объём вычислений, так что микроконтроллеру приходится сперва рассчитывать таблицу синусов и использовать целочисленную арифметику.
  • VisualStudio с бесплатным плагином Visualmicro намного удобней родной IDE Arduino.
  • Рисовать на осциллографе довольно просто. Отладка кода на Arduino может быть сложной, но в данном случае почти не понадобилась.
  • ЦАП-ы имеют конечное быстродействие, поэтому когда при переходе от одной линии к другой переключается сначала напряжение на выходе Х, а потом на выходе Y, на экране появляются артефакты. Заметны в виде отдельных точек, например на кадрах с плавающей надписью „2014“.


В общем, по-моему, получилось весьма симпатично. Следующий логический шаг – заменить осциллограф парой зеркал на гальванометрах, и рисовать на стене лазерным лучом.
Tags: осциллографардуино
Hubs: Abnormal programming
Total votes 108: ↑103 and ↓5 +98
Comments 48
Comments Comments 48