Построение контроллеров на Raspberry Pi #4: считывание аналоговых данных с помощью RPi
Продолжение полезной серии статей про построение контроллеров на Raspberry Pi. В данной статье мы рассмотрим, как можно считывать аналоговые данные с помощью Raspberry Pi.
Введение
RPi (Raspberry Pi) обладает возможностью выполнять различные электронные функции, такие как чтение цифровых данных с электрического кнопочного выключателя, управление двигателем постоянного тока, мигание светодиодами. Единственная недоступная для выполнения электронная функция – это считывание электрических сигналов и данных с аналоговых устройств. Хотя RPi и обладает множеством GPIO выводов, HDMI, разъемами аудио, LCD и камеры, он не способен считывать аналоговые сигналы, поскольку ему не хватает схемы АЦП (аналого-цифрового преобразователя, ADC). Подключить АЦП к Raspberry Pi довольно просто, но есть еще один метод, который может быть использован для считывания аналоговых электрических сигналов или данных: здесь вы узнаете, как считывать электрические сигналы с аналоговых устройств с помощью RPi, используя метод переходных процессов. Электронные компоненты и схема, необходимые для чтения аналоговых электрических сигналов, показаны на структурной схеме на рисунке 1. Кроме того, перечень элементов предоставляет список всех электронных компонентов, необходимых для сборки данного проекта.
Перечень компонентов
- Raspberry Pi (Model A+,B, B+, Pi 2 или Pi 3);
- (R1) резистор 1 кОм (коричневый, черный, коричневый, золотой), 0,25 Вт, 5%;
- (R2) резистор 1 кОм (коричневый, черный, коричневый, золотой), 0,25 Вт, 5%;
- (R3[POT1]) потенциометр 10 кОм;
- (C1) конденсатор 220 нФ или 100 нФ (220 нФ = 0.2 мкФ и 100 нФ = 0.1 мкФ);
- переходник для GPIO контактов Raspberry Pi;
- беспаечная макетная плата;
- перемычки;
- (VCC1) батарейный отсек 6 вольт.
Метод переходных процессов: чтение аналоговых данных
Как кратко упоминалось в введении, Raspberry Pi не умеет считывать электрические аналоговые сигналы или данные. Причина отсутствия этого функционала заключается в том, что у микроконтроллера BCM (Broadcom) в Raspberry Pi нет встроенной схемы аналого-цифрового преобразователя. Два альтернативных метода, которые могут позволить RPi считывать электрические аналоговые сигналы, заключаются в подключении внешней микросхемы АЦП (MCP3008) или использовании простой схемы заряда-разряда. В данном проекте мы будем использовать схему заряда-разряда для чтения электрических аналоговых сигналов. Схема заряда-разряда позволяет RPi считывать непрерывные данные, используя метод переходных процессов. Работа метода переходных процессов основана на наблюдении, как реагирует RC цепь (резистор-конденсатор) на фронт импульса (переход от низкого уровня к высокому) в течение заданного периода времени. Поведение электрического отклика RC цепи основано на заряде и разряде конденсатора, принимающего электрический импульс или ступенчатый сигнал. Рисунок 2 показывает модель электрической схемы базовой RC цепи. Осциллограммы прикладываемого ступенчатого сигнала и отклика цепи заряда-разряда показаны на рисунке 3. Для создания RC цепи и получения формы сигнала отклика я использовал бесплатный программный пакет моделирования схем Micro-Cap.
Кроме того, как показано на рисунке 3, сигнал входного импульса подается на RC цепь на 5 мс (миллисекунд). Конденсатор (C1) заряжается в течение этого времени через резисторы R1 и R2. После того, как конденсатор полностью зарядится, при спаде импульса входного сигнала конденсатор разряжается через резистор R3. Время разряда устанавливается на 1 мс. Эти заряд и разряд конденсатора могут быть выполнены с помощью кода на питоне, реализованного на RPi. Поскольку этот цикл заряда и разряда выполняется непрерывно, в скрипте на питоне используется программный счетчик для предоставления эквивалентного непрерывного значения данных аналогового устройства, считываемых Raspberry Pi. Значение программного счетчика постоянно обновляется и отображается в основном коде приложения, находящемся в бесконечном цикле. Если вам интересно электрическое поведение RC цепи, ниже приведен файл Micro-Cap. Ниже приведены две принципиальные схемы, показывающие цепи заряда и разряда, подключенные к RPi. На рисунках 4 и 5 показано, что цепи заряда и разряда подключены к GPIO выводам 18 и 23 Raspberry Pi.
Теперь, когда мы разобрались с базовыми знаниями о том, как считывать электрические аналоговые сигналы или данные, используя метод переходных процессов, давайте соберем схему устройства с аналоговым интерфейсом на Raspberry Pi!
Сборка схемы устройства с аналоговым интерфейсом на Raspberry Pi
С помощью электронных компонентов из списка выше вы теперь можете собрать схему устройства с аналоговым интерфейсом на Raspberry Pi. Размещение и соединение компонентов на макетной плате показано на рисунке 6 ниже. На рисунке 7 приведена принципиальная схема устройства.
Ниже приведена фотография собранной схемы аналогового интерфейса устройства на Raspberry Pi.
Перед тем, как перейти к этапу тестирования аналогового интерфейса, проверьте соединения схемы на наличие ошибок. Если ошибок нет, то давайте загрузим Python скрипт для проверки аналогового интерфейса для Raspberry Pi.
Тестирование функции аналогового чтения и схемы интерфейса
Мы собрали схему аналогового интерфейса для Raspberry Pi и теперь готовы ее проверить! Для этого потребуется небольшой код приложения на Python. Код приложения приведен в листинге 1 ниже. Код приложения на питоне может быть напечатан в LXTerminal после открытия редактора nano командой sudo nano pot_step.py
. Кроме того, код на питоне может быть сохранен на вашей SD карте для RPi.
После сохранения скрипта на питоне введите в консоли команду sudo python pot_step.py
. На экране должен появиться поток аналоговых данных. При повороте потенциометра, аналоговые значения должны меняться, как показано на рисунке 9. Поздравляю с созданием аналогового интерфейса для Raspberry Pi! Я добавил небольшое видео, демонстрирующее работу этого этой удивительной схемы аналогового интерфейса. Вы можете продолжить эксперимент, заменив потенциометр 10 кОм на фотоэлемент. Размахивание рукой над фотоэлементом будет изменять измеряемую освещенность, показывая ее значение на экране.
####################################
# Листинг 1.
# Код аналогового чтения
####################################
# Добавить библиотеки в скрипт
import RPi.GPIO as GPIO
import time
# Инициализировать GPIO как объект
GPIO.setmode(GPIO.BCM)
# Определить GPIO выводы с переменными a_pin и b_pin
a_pin = 18
b_pin = 23
# Создать функцию разряда для чтения данных конденсатора
def discharge():
GPIO.setup(a_pin, GPIO.IN)
GPIO.setup(b_pin, GPIO.OUT)
GPIO.output(b_pin, False)
time.sleep(0.005)
# Создать функцию для захвата аналогового значения счетчика
def charge_time():
GPIO.setup(b_pin, GPIO.IN)
GPIO.setup(a_pin, GPIO.OUT)
count = 0
GPIO.output(a_pin, True)
while not GPIO.input(b_pin):
count = count +1
return count
# Создать функцию аналогового чтения для чтения данных заряда и разряда
def analog_read():
discharge()
return charge_time()
# Обеспечить цикл для отображения значения счетчика аналоговых данных на экране
while True:
print(analog_read())
time.sleep(1)
В следующий раз, мы рассмотрим, как подключить LCD дисплей к Rapberry Pi и отобразить на нем сообщения, используя язык программирования Python.
Надеюсь, статья оказалась полезной. Оставляйте комментарии!