Рубрики
Проекты на Raspberry Pi

Осциллограф на Raspberry Pi и модуле АЦП

Осциллограф является одним из самых востребованных инструментов в мастерской любого радиолюбителя, он позволяет наглядно визуализировать различные сигналы. В данной статье мы рассмотрим создание осциллографа на основе платы Raspberry Pi и модуля АЦП (аналого-цифрового преобразования) с выводом осциллограммы на экран монитора.

Аналогичный проект осциллографа на нашем сайте мы рассматривали на основе платы Arduino – с выводом результатов на экран компьютера, но более востребованным на нашем сайте оказался проект осциллографа на основе платы Arduino и TFT дисплея с диагональю 2,4 дюйма.

Общие принципы работы проекта

Наш проект осциллографа на основе платы Raspberry Pi будет базироваться на выполнении следующих операций:

  1. Осуществление АЦП входного сигнала.
  2. Подготовка данных для визуализации.
  3. Построение графика (осциллограммы).

Структурная схема работы проекта показана на следующем рисунке:

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

Аппаратное обеспечение

  1. Плата Raspberry Pi (купить на AliExpress).
  2. SD карта на 8 или 16 Гб.
  3. LAN/Ethernet кабель.
  4. Источник питания или USB кабель.
  5. ADS1115 ADC (аналого-цифровой преобразователь) (купить на AliExpress).
  6. Фоторезистор (опционально, для теста проекта) (купить на AliExpress).
  7. Резистор 1 или 10 кОм (купить на AliExpress).
  8. Макетная плата.
  9. Соединительные провода.
  10. Монитор (или заменяющее его устройство) для отображения информации.

Программное обеспечение

Для написания кода программы для данного проекта понадобятся модули matplotlib и drawnow, написанные на python. Данные модули будут использоваться для визуализации данных. Также понадобится модуль Adafruit для подключения АЦП ADS1115.

Данный проект будет работать независимо от того, какая операционная система установлена на Raspberry Pi, но мы использовали в нем Raspberry Pi stretch OS – мы надеемся, что вы знакомы с данной операционной системой и вы знаете как подключаться к плате Raspberry Pi по протоколу SSH с использованием специализированного программного обеспечения (например, putty).

Примечание: вполне ожидаемо что данный проект будет успешно работать и на современной Raspberry Pi OS.

Схема проекта

Схема осциллографа на основе платы Raspberry Pi представлена на следующем рисунке.

Для преобразования аналогового входного сигнала в цифровую форму мы использовали модуль АЦП ADS1115. Применение данного модуля необходимо в связи с тем, что плата Raspberry Pi, в отличие, к примеру, от платы Arduino, не имеет собственных встроенных АЦП. Мы использовали модуль АЦП ADS1115 поскольку он имеет хорошую разрешающую способность (16 бит), хороший даташит и неплохие рекомендации по его применению от компании Adafruit.

Модуль АЦП ADS1115 подключается к плате Raspberry Pi по протоколу I2C, его соединения с платой Raspberry Pi следующие:
VDD – 3.3v
GND – GND
SDA – SDA
SCL – SCL

После сборки проекта у вас должна получиться конструкция примерно следующего вида:

Установка необходимых библиотек для Raspberry Pi

Перед тем, как начать писать код программы для нашего проекта осциллографа, мы должны задействовать интерфейс I2C в плате Raspberry Pi и установить необходимо программное обеспечение (библиотеки). Для этого выполните следующую последовательность шагов:

Шаг 1. Включите в Raspberry Pi интерфейс I2C.

Для этого выполните следующую команду:

Когда откроется окно настроек, выберите настройки интерфейсов (interface options), затем выберите I2C и затем нажмите «enable».

Шаг 2. Обновление программного обеспечения Raspberry Pi.

Перед написанием какой-нибудь новой программы для Raspberry Pi всегда желательно устанавливать последние обновления для платы, в этом случае вы сможете быть уверенными в том, что у вас не возникнет проблем совместимости. Для обновления программного обеспечения платы Raspberry Pi выполните следующие команды:

Шаг 3. Установка библиотеки Adafruit ADS1115 для работы с АЦП.

Перед установкой данной библиотеки удостоверьтесь в том, что вы находитесь в корневом каталоге платы:

Затем установите необходимые пакеты:

После этого клонируйте каталог Adafruit для библиотеки с помощью команды:

Смените каталог на тот, в который вы клонировали файлы библиотеки и запустите на выполнение установочный файл:

После завершения процесса установки вы на экране должны увидеть примерно следующую картину:

Шаг 4. Произведите тестирование библиотеки и связи по протоколу I2C.

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

Если вы находитесь в каталоге Adafruit_Python_ADS1x15, то смените каталог на examples с помощью следующей команды:

После этого запустите на выполнение пример sampletest.py, который выведет на экран значения четырех каналов АЦП в форме таблицы:

Если протокол I2C работает исправно и соединение хорошего качества, то вы на экране должны увидеть примерно следующую картину:

Если же показывается сообщение об ошибке, то проверьте надежность соединения модуля АЦП и платы Raspberry Pi и проверьте включен ли протокол I2C в настройках платы.

Шаг 5. Установите Matplotlib

Для того, чтобы визуализировать данные, получаемые от модуля АЦП, нам понадобится модуль (библиотека) matplotlib, который используется для построения всех видов графиков в языке python. Установить данный модуль можно с помощью следующей команды:

После этого вы на экране должны увидеть примерно следующую картину:

Шаг 6. Установите python модуль Drawnow.

Этот модуль позволит нам производить обновления в реальном времени для нашего графика. Данный модуль мы будем устанавливать с помощью установщика pip, поэтому убедитесь в том, что он у вас уже есть в системе. Если нет, то установите его с помощью команды:

После этого модуль Drawnow можно установить с помощью следующей команды:

После этого вы на экране должны увидеть примерно следующую картину:

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

Объяснение программы для Raspberry Pi

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

На этом этапе к плате Raspberry Pi необходимо подключить монитор или VNC просмотрщик чтобы отображать осциллограмму в графическом виде, потому что графики невозможно построить в терминале.

После этого создайте новый python файл. Вы можете дать ему любое имя, однако мы его назвали scope.py.

После создания этого файла первое, что нам необходимо в нем сделать – это подключить используемые модули и библиотеки.

Затем мы создадим объект класса ADS1x15 чтобы с его помощью работать с модулем АЦП ADS1115.

Далее установим коэффициент усиления (gain) АЦП – его следует устанавливать в зависимости от того, какое уровень напряжения вам необходим на выходе АЦП. Для нашего проекта будет достаточен диапазон уровней 0 – 4.09v поэтому мы будем использовать коэффициент усиления равный 1. Для более подробной информации по установке коэффициента усиления вам необходимо обратиться к даташиту ADS1015/ADS1115.

Затем создадим массив для хранения данных осциллограммы, которые мы будем использовать для построения графика. Также объявим переменную, которую мы будем использовать в качестве счетчика.

Далее мы сделаем наш график интерактивным, чтобы мы могли обновлять его в режиме реального времени.

Далее мы начнем процесс АЦП в режиме непрерывного преобразования на канале 0 с коэффициентом усиления gain. Здесь необходимо отметить, что все 4 канала АЦП модуля ADS1115 можно считывать одновременно, но здесь мы использовали только один канал в целях демонстрации.

Затем мы создадим функцию def makeFig, в которой мы будем задавать атрибуты (свойства) нашего графика. Сначала мы установим ограничения для оси y используя функцию plt.ylim, после этого мы зададим название графика (title),  названия его осей (label), стиль графика и его цвет с помощью функции plt.plot(). Далее мы зададим номер канала АЦП, с которого мы будем считывать данные – в нашем случае это канал 0. С помощью функции plt.legend мы будем выводить на графике нужную нам информацию о сигнале.

Далее в программе мы будем использовать бесконечный цикл, в котором непрерывно будут считываться данные с модуля АЦП и на их основе будет строиться график. Для считывания данных с модуля АЦП мы будем использовать следующую команду:

Затем мы будем выводить считанное значение АЦП в окно терминала – для целей контроля. После небольшой задержки мы будем добавлять считанное значение в список val, в котором будут храниться считаные данные с используемого канала АЦП.

После этого мы будем использовать функцию drawnow чтобы построить график.

Чтобы убедиться в том, что на графике у нас самые свежие (последние) данные с АЦП, мы будем удалять данные начиная с индекса 0 после каждых 50 считанных данных.

Тестирование работы проекта

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

Запустите код программы на выполнение.

Если у вас другое имя файла с программой, но не забудьте изменить его в приведенной команде.

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

Чтобы отключить показ этого предупреждения добавьте в программу следующие строчки кода:

Чтобы проверить работу нашего осциллографа вы можете подключить ко входу АЦП потенциометр и вращая его ручку наблюдать как меняется построенный график. Также вы можете подключить на вход нашего осциллографа генератор синусоидальных или прямоугольных колебаний.

Исходный код программы на Python

4 ответа к “Осциллограф на Raspberry Pi и модуле АЦП”

Добрый день! Необходимо запрограммировать raspberry pi pico так, чтобы с двух аналоговых пинов снимались значения со скоростью 20 000 сеплов в секунду каждый и передавались в ком порт компьютера в последовательности: время, 1 значение, 2 значение.
Если можете, помогите пожалуйста

Добрый вечер. К сожалению, прямого решения вашей проблемы я не знаю и такой статьи у нас на сайте нет. У вас что вызывает больше затруднений — считывание значений с контактов с частотой 20 000 сеплов в секунду или их передача в COM порт компьютера? Также могу порекомендовать серию обучающих статей про плату raspberry pi pico на нашем сайте.

Затруднение в считывании, т. е. контроллер работает со своей скоростью, если писать analogread (максимум получалось 6000 значений, хотя частота процессора 133 МГц, а максимальное количество семплов в секунду 500 000), а как ее повысить до нужных 20 000 семплов — не понятно, допустим если через arduino ide программировать

Андрей, я не совсем понял на каком языке вы программируете плату raspberry pi pico? На MicroPython или на C/C++? И чем может помочь ее программирование через arduino ide, по вашему мнению?
Кстати, вот статья про использование АЦП в плате Raspberry Pi Pico на нашем сайте. В ней считывание информации с АЦП осуществляется с помощью функции analog_value.read_u16(), то есть с разрешением 16 бит. Может быть изменяя разрешение АЦП вам удастся повысить количество считываемых отсчетов поскольку чем ниже разрешение тем выше скорость работы АЦП.

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

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