Raspberry Pi: чтение аналоговых входов с помощью Python (MCP3008)
В этом руководстве вы узнаете, как считывать аналоговые сигналы на GPIO Raspberry Pi с помощью программы на Python. Raspberry Pi может считывать только цифровые сигналы. Для чтения аналоговых сигналов нам нужен аналогово-цифровой преобразователь (АЦП), такой как MCP3008, например. В качестве примера мы считаем значения с потенциометра, но пример можно применить к любому аналоговому датчику. Мы будем использовать интерфейс gpiozero.
Предварительные требования
Перед тем как продолжить это руководство, ознакомьтесь со следующими предварительными требованиями.
Познакомьтесь с платой Raspberry Pi — если вы не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.
Вы должны знать, как запускать и создавать файлы Python на вашем Raspberry Pi. Нам нравится программировать наш Raspberry Pi через SSH, используя расширение в VS Code. У нас есть подробное руководство по этой теме: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.
Знакомство с GPIO Raspberry Pi
GPIO расшифровывается как General Purpose Input Output (контакты общего назначения ввода/вывода), и они позволяют подключать и управлять электронным оборудованием, таким как светодиоды, моторы и датчики, к вашему Raspberry Pi.
Большинство моделей плат Raspberry Pi имеют двойной ряд из 40 контактов GPIO. Расположение контактов обычно одинаково для большинства моделей Raspberry Pi.
Если вы не знакомы с GPIO Raspberry Pi, мы рекомендуем ознакомиться с нашим руководством по распиновке Raspberry Pi:
Обзор проекта
Чтобы показать вам, как считывать аналоговые сигналы с GPIO Raspberry Pi, мы создадим простой проект для управления яркостью светодиода с помощью потенциометра. Таким образом, вы научитесь считывать аналоговые сигналы с Raspberry Pi и выводить ШИМ-сигналы.
Для введения в ШИМ-сигналы с Raspberry Pi прочитайте следующее руководство:
Чтобы узнать, как работают потенциометры, вы можете прочитать это руководство:
Необходимые компоненты
Для этого проекта вам понадобятся следующие компоненты:
Вот список необходимых компонентов:
Плата Raspberry Pi — читайте Лучшие стартовые наборы Raspberry Pi
Потенциометр (мы будем использовать 10 кОм, но любой другой номинал тоже подойдёт) или любой аналоговый датчик
Резистор 220 Ом (или аналогичный)
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Чтение аналоговых сигналов с Raspberry Pi
GPIO Raspberry Pi могут считывать только цифровые сигналы — они могут считывать либо HIGH (3.3В), либо LOW (0В), но не могут считывать любые промежуточные напряжения. Чтобы иметь возможность считывать изменяющиеся уровни напряжения, нам нужна микросхема аналогово-цифрового преобразователя, такая как MCP3008.
Знакомство с АЦП MCP3008
На рисунке ниже показана микросхема аналогово-цифрового преобразователя MCP3008.
MCP3008 — это 10-битный аналогово-цифровой преобразователь, который считывает аналоговые сигналы и передаёт их микроконтроллеру по протоколу связи SPI (SPI-сигналы, которые Raspberry Pi может считывать).
MCP3008 имеет 16 выводов. Половина из них — аналоговые входы, которые можно использовать для подключения аналоговых устройств. Остальные 8 выводов подключаются к GPIO Raspberry Pi.
В следующей таблице показана распиновка микросхемы MCP3008. Чтобы правильно определить каждый вывод, расположите микросхему полукруглой меткой вверх и следуйте обозначению на рисунке выше.
Вывод |
Обозначение |
Описание |
|---|---|---|
1 |
CH0 |
Аналоговый вход (канал 0) |
2 |
CH1 |
Аналоговый вход (канал 1) |
3 |
CH2 |
Аналоговый вход (канал 2) |
4 |
CH3 |
Аналоговый вход (канал 3) |
5 |
CH4 |
Аналоговый вход (канал 4) |
6 |
CH5 |
Аналоговый вход (канал 5) |
7 |
CH6 |
Аналоговый вход (канал 6) |
8 |
CH7 |
Аналоговый вход (канал 7) |
9 |
DGND |
Цифровая земля |
10 |
CS/SHDN |
Выбор микросхемы / вывод выключения |
11 |
Din |
Последовательный вход данных |
12 |
Dout |
Последовательный выход данных |
13 |
CLK |
Последовательная тактовая частота |
14 |
AGND |
Аналоговая земля |
15 |
VRef |
Вход опорного напряжения |
16 |
VDD |
Питание +2.7В до 5.5В |
Подключение микросхемы MCP3008 к Raspberry Pi
8 выводов на левой стороне MCP3008 — это восемь различных аналоговых каналов. Вы можете подключить до 8 аналоговых устройств, используя эти каналы. Выводы на правой стороне подключаются к Raspberry Pi.
Самый простой способ подключить микросхему MCP3008 к Raspberry Pi — использовать макетную плату. Разместите микросхему MCP3008 посередине макетной платы. Затем подключите её, как показано в следующей таблице:
Вывод MCP3008 |
Raspberry Pi |
|---|---|
1 |
Аналоговый выход (потенциометр или аналоговый датчик) |
9 |
GND |
10 |
GPIO 8 |
11 |
GPIO 10 |
12 |
GPIO 9 |
13 |
GPIO 11 |
14 |
GND |
15 |
3.3V |
16 |
3.3V |
Вы также можете использовать следующую схему в качестве справки. Мы также подключаем светодиод к GPIO 14.
Включение SPI на Raspberry Pi
По умолчанию связь SPI не включена на Raspberry Pi. Выполните следующую команду в окне терминала Raspberry Pi, чтобы включить SPI:
sudo raspi-config nonint do_spi 0
Чтение аналоговых сигналов с Raspberry Pi — скрипт Python
Библиотека gpiozero содержит класс MCP3008, специально разработанный для чтения аналоговых сигналов с микросхемы MCP3008.
Следующий пример считывает значение с потенциометра и соответствующим образом регулирует яркость светодиода:
считывает значение аналогового входа с потенциометра через микросхему MCP3008;
управляет яркостью светодиода с помощью ШИМ;
изменяет коэффициент заполнения ШИМ в соответствии со входным значением от потенциометра.
Создайте новый файл Python с именем potentiometer_led.py и скопируйте следующий код.
# Полная информация о проекте: https://RandomNerdTutorials.com/raspberry-pi-analog-inputs-python-mcp3008/
from gpiozero import PWMLED, MCP3008
from time import sleep
#создаём объект pot, который ссылается на канал 0 MCP3008
pot = MCP3008(0)
#создаём объект PWMLED с именем led, который ссылается на GPIO 14
led = PWMLED(14)
while True:
if(pot.value < 0.001):
led.value = 0
else:
led.value = pot.value
print(pot.value)
sleep(0.1)
Как считывать аналоговые входы на Raspberry Pi
Считывание аналоговых входов на Raspberry Pi с использованием класса MCP3008 очень просто.
Импортируйте класс MCP3008.
from gpiozero import MCP3008
Создайте объект MCP3008 и передайте в качестве аргумента аналоговый канал, который вы используете. Вы можете создавать различные объекты MCP3008 на разных каналах, если используете несколько аналоговых периферийных устройств.
pot = MCP3008(ANALOG_CHANNEL)
Считывайте значение аналогового входа с помощью свойства value.
pot.value
Как работает код
Теперь, когда вы знаете, как считывать аналоговые входы на GPIO Raspberry Pi, легко понять код.
Вы начинаете с импорта необходимых библиотек:
from gpiozero import PWMLED, MCP3008
from time import sleep
Затем вы создаёте объект с именем pot, который ссылается на канал 0 MCP3008, то есть на канал, к которому подключён потенциометр. Помните, что канал 0 соответствует выводу 1 MCP3008, канал 1 — выводу 2, и так далее.
pot = MCP3008(0)
Вы также создаёте объект PWMLED с именем led для управления светодиодом с помощью ШИМ. Чтобы узнать, как использовать ШИМ на выводах Raspberry Pi, :doc:`следуйте этому руководству </raspberry/rnt/raspberry-pi-pwm-python/index>`_.
led = PWMLED(14)
Для считывания аналогового значения на GPIO, к которому подключён потенциометр, вы просто используете pot.value.
Для регулировки яркости светодиода с помощью ШИМ вам нужно изменить коэффициент заполнения — просто присвойте значение от 0 до 1 свойству led.value, где 0 соответствует полностью выключенному светодиоду, а 1 — полностью включённому.
В этом примере мы используем цикл while, который всегда True, чтобы программа работала бесконечно.
while True:
Мы постоянно проверяем значение потенциометра. Если значение меньше 0.001, мы устанавливаем коэффициент заполнения равным нулю, чтобы выключить светодиод.
if(pot.value < 0.001):
led.value = 0
В противном случае код выполнит блок else, в котором коэффициент заполнения изменяется в соответствии со значением, считанным с потенциометра.
else:
led.value = pot.value
print(pot.value)
Наконец, мы выводим аналоговое значение потенциометра и ждём 0.1 секунды, прежде чем снова проверить значение потенциометра.
print(pot.value)
sleep(0.1)
Демонстрация
Сохраните ваш файл Python. Затем запустите его на вашем Raspberry Pi. Выполните следующую команду в каталоге вашего файла проекта (используйте имя вашего файла):
python potentiometer_led.py
После запуска скрипта поверните потенциометр и наблюдайте, как яркость светодиода изменяется соответствующим образом.
Вы можете остановить выполнение программы, нажав CTRL + C.
Заключение
В этом руководстве вы узнали, как считывать аналоговые значения на GPIO Raspberry Pi с помощью скрипта Python. GPIO Raspberry Pi не могут считывать аналоговые сигналы, поэтому нам нужно использовать микросхему аналогово-цифрового преобразователя, такую как MCP3008, которая передаёт аналоговые сигналы по протоколу связи SPI, который Pi может считывать.
Библиотека gpiozero предоставляет простой интерфейс под названием MCP3008, который позволяет легко получать аналоговые значения с помощью свойства value. В качестве примера мы показали вам, как использовать потенциометр, но вы можете использовать те же методы для любого аналогового датчика, который выдаёт максимум 3.3В.
Мы надеемся, что это руководство было для вас полезным. Если вы хотите узнать больше об основах управления GPIO Raspberry Pi с помощью языка программирования Python, ознакомьтесь с нашими руководствами по Raspberry Pi:
Вы можете ознакомиться со всеми нашими проектами Raspberry Pi по следующей ссылке: