Рубрики
Схемы на Arduino

Осциллограф 10 Гц – 50 кГц на Arduino Nano

В этой статье мы рассмотрим создание самодельного (DIY) осциллографа на основе платы Arduino и ЖК графического дисплея 128×64, способного работать в диапазоне от 10 Гц до 50 кГц. Это достаточно широкий диапазон, причем наш осциллограф не будет использовать внешний АЦП (аналогово-цифровой преобразователь), только плату Arduino.

Результаты работы осциллографа будут отображаться на сравнительно большом ЖК дисплее (ST7920) с разрешением 128×64 пикселов. Область для вывода результатов измерений будет иметь размер 96×64, а размер информационной области будет составлять 32×64 пикселов.

Также на нашем сайте вы можете посмотреть проект осциллографа на основе платы Arduino с выводом изображения на экран компьютера.

Необходимые компоненты

  1. Плата Arduino Nano R3 (купить на AliExpress).
  2. Конденсатор 100 мкФ (купить на AliExpress).
  3. ST7920 LCD 128×64 (графический ЖК дисплей) (купить на AliExpress).
  4. Потенциометр (2 шт.) (купить на AliExpress).
  5. Кнопочный переключатель, мгновенный (Momentary) (3 шт.).

Стоимость комплектующих для сборки данного осциллографа, как вы можете видеть, сравнительно небольшая. Если вы раньше не работали с графическим дисплеем, используемом в данном проекте, то на нашем сайте вы можете прочитать статью про подключение графического ЖК дисплея ST7920 к плате Arduino.

Работа схемы

Схема осциллографа 10 Гц – 50 кГц на основе платы Arduino Nano и ЖК дисплея ST7920 представлена на следующем рисунке.

Данный осциллограф будет обладать следующими особенностями:

  • автоспуск (дисплей очень стабильный);
  • скорость сканирования: 0.02ms/div~10ms/div, 9 уровней отображения;
  • функция удержания (Hold function): «замораживает» изображение на экране дисплея.

Первоначально подобный осциллограф был описан в блоге Wu Hanqing, но автор этого проекта внес в него небольшие изменения. Как можно видеть из представленного в конце статьи видео, осциилограф обеспечивает достаточно четкую картинку на сравнительно большом экране, хорошо работает автопуск. Вертикальная позиция изображения регулируется с помощью потенциометра 50 кОм, для управления контрастностью дисплея используется потенциометр 10 кОм. Нами осциллограф протестирован с помощью генератора синусоидальных и прямоугольных импульсов.

Данный осциллограф не является профессиональным инструментом, однако он хорошо подойдет для образовательных целей, а также для тестирования несложных устройств.

Исходный код программы (скетча)

Видео, демонстрирующее работу осциллографа

Источник статьи

35 ответов к “Осциллограф 10 Гц – 50 кГц на Arduino Nano”

Собрал как есть, без малейших изменений — работает, ничего не зависает. Проверял сигнал в розетке через делитель 1/100 (1мОм+100кОм) — очень симпатичная синусоида выходит, жаль нельзя картинку приложить. Дисплей у меня с подстроечником контраста на плате, поэтому его не ставил. В остальном схема полностью работает как есть

Если кто будет делать такой делитель — берите резисторы мощностью от 2 ватт, не потому что ток большой — ток там меньше 1 мА, а потому что конструктивно более слабые резисторы меньше размером и их будет пробивать напряжением, подключается ноль со стороны 100кОм и далее на gnd, фаза со стороны 1мОм, вход сигнала брать между резисторами, напряжение там соответственно 2.1-2.2 вольт AC. Удобно собрать это сразу в штепсельной вилке, чтоб не получить удар током. Ну и подключать сперва в розетку а уж затем ко входу.

Спасибо вам за конструктивный комментарий к данному проекту

Можете на любом ресурсе в сети выложить, а здесь ссылку на нее написать, а я ее тогда в статью вставлю.

Изначально устройство зависало на первичном изображении, но после полной сборки устройства и подключения 15 вывода жк дисплея к GND, устройство заработало исправно. Также убрал из скетча изображение(динозаврика) за ненадобностью, для этого удалил строки с 13 по 85, 99 и 100.

Да, хорошо, спасибо вам за конструктивный комментарий по существу статьи

Добрый день
подскажите почему может все зависать на заставке?
то есть просто загорается экран с динозавром и надписью arduino scope и больше ничего не происходит?

Добрый вечер. Сложно однозначно сказать, причин может быть много. Попробуйте убрать из функции void loop( ) весь код и вставить туда какой нибудь очень простой код, например, код мигания встроенным светодиодом. Если этот код заработает вы хотя бы будете знать что у вас программа до void loop( ) доходит. После этого можете добавлять в функцию void loop( ) понемногу код из приведенной статьи и, таким образом, сможете выявить на каком фрагменте кода происходит зависание программы

Добрый день. Подскажите пожалуйста, до скольки вольт принимает данный осциллограф? Судя по видео установлен предел в 3В, если так то можно ли как то увеличить данный параметр? (может возможно добавить в эту схему делитель?)

Здравствуйте, я не знаю почему автор этого проекта на видео показывает только диапазон до 3В, ведь аналоговые контакты платы Ардуино могут считывать уровень до 5В. С помощью делителя напряжения, конечно же, можно увеличить этот предел

картинка общая высвечивается а синусоиду не могу вывести, переделал на тот же дисплей но с кристалом ks0108

все выводится, пришлось допиливать код что бы синусоиду вывести, нехватает пару строчек

А не могли бы вы здесь, в комментарии, написать эту пару строчек, которые вам помогли, чтобы облегчить задачу другим людям, которую будут читать эту статью. Был бы признателен

в коде
PORTA = 0b00000000;
DDRA = 0b00000000;
ADMUX=0x60;
ADCSRA= 0xE2;

{

ADCSRA |= 0x40; //Включаем АЦП
while((ADCSRA & 0x10)==0); //ждем завершения
PORTA=ADCH; //выводим результат
только после передачи сигнала из порта в регистр все запустилось, поэкспереминтируйте убрав эти строчки, сразу говорю в протеусе не работает, только в реале, может у меня в протеусе дисплей такой но не помогло

Да, хорошо, спасибо. Надеюсь ваш совет поможет другим пользователям, у которых будет возникать такая же проблема

А подскажи пожалуйста, куда в скетче этот код нужно поместить?

Попробовал собрать на Arduino Uno и ips дисплее 0.96 st7735. С небольшой переделкой кода всё работает, но пока отвалилась функция Hold. На вход неплохо было бы поставить операционный усилитель. Тогда будет возможность регулировать чувствительность по напряжению и существенно повысится входное сопротивление.

Дополняю комментарий.
В функции measure содержится ошибка.
При вычислении Vpp мы делим и умножаем на целые числа, от этого на экране Vpp отображается только в целых. Для исправления просто заменяем *5/255 на *0.019607. И кажется, значение в графе V/div надо заменить на ~0.625. (тут я ппока не считал, поэтому примерно)

Хорошо, спасибо за конструктивный комментарий, надеюсь он поможет другим энтузиастам, которые будут собирать данный проект

По поводу операционного усилителя поддерживаю, был бы полезен, но это немного усложнит проект

Все нормально работает. Вариации с подключением дисплея зависят от типа самого дисплея, отсюда и задействование ножки RST. У меня и так заработало. Плохо, что чувствительность по входному напряжению не регулируется. Думаю, добавление входного аттенюатора/делителя как раз поможет.

Спасибо за дельный отзыв. Рад что у вас заработало. Я думаю, аттенюатор добавить несложно в схему

Здравствуйте,а как данные с микроконтроллера будут передаваться на жк дисплей 128х64, если шины данных не задействованы у жк дисплея, и для чего сам конденсатор в схеме?

Добрый вечер. Шины данных не задействованы потому что используется последовательный режим работы, посмотрите статью про подключение графического ЖК дисплея ST7920 к плате Arduino. Конденсатор нужен для устранения постоянной составляющей во входном сигнале и фильтрации нежелательных колебаний.

Нет, не пробовал. Просто в последнее время я так много перевожу проектов с англоязычных источников что мы просто не успеваем их все попробовать

И почему вы так думаете? 50кгц — не такая уж большая частота, на мой взгляд

Собрал я схему. В ней есть ошибки.
Нужно переставить ножки с D9, D8, D7 на D10, D9, D8.
На экране пин CS1 подключить на корпус.
RST подключить на D3 и в коде изменить U8GLIB_ST7920_128X64_4X u8g (6, 5, 4);
на U8GLIB_ST7920_128X64_4X u8g (6, 5, 4, 3);

Спасибо за полезный комментарий к статье. А с вашими доработками проекта у вас все нормально заработало? У данного проекта большое число просмотров и хороший рейтинг на англоязычном источнике, странно, что в нем могли быть такие ошибки. Хотя, может быть, вам попалась плата Arduino с дефектной ножкой D7

Да, но к сожалению мой источник сигналов уехал на некоторое время — потому проверить работу полностью не смог. Как проверю — отпишусь. А ошибки как раз были на англоязычном сайте. Вот оригинал комментария:
Hello Mirko. Your design is very interesting and I made it and when put together, it didn’t work.
I had to add a connection to the LCD. RST (reset on LCD) and D3 (on NANO), in the code I added U8GLIB_ST7920_128X64_4X u8g (6, 5, 4);
on U8GLIB_ST7920_128X64_4X u8g (6, 5, 4, 3);
and key are wrongly assigned, in the diagram: D9, D8, D7 in code 10,9,8.
After these changes, the oscilloscope works. Great project and I’m getting on with the next one. Thanks.

И там еще другой про корпус на ЖКИ — но я его не сохранил.

Хорошо, спасибо вам еще раз. Такие комментарии, как ваши, помогают лучше разобраться в нюансах того или иного проекта. К сожалению, я со студентами не успеваю пробовать все проекты, которые я перевожу. Поэтому помощь таких людей как вы, очень ценна для нашего сайта

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *