Raspberry Pi: чтение аналоговых входов с помощью Python (MCP3008)

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

Чтение аналоговых входов Raspberry Pi с помощью Python MCP3008

Предварительные требования

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

  1. Познакомьтесь с платой Raspberry Pi — если вы не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.

  2. Вы должны знать, как запускать и создавать файлы 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

Если вы не знакомы с GPIO Raspberry Pi, мы рекомендуем ознакомиться с нашим руководством по распиновке Raspberry Pi:

Обзор проекта

Чтобы показать вам, как считывать аналоговые сигналы с GPIO Raspberry Pi, мы создадим простой проект для управления яркостью светодиода с помощью потенциометра. Таким образом, вы научитесь считывать аналоговые сигналы с Raspberry Pi и выводить ШИМ-сигналы.

Raspberry Pi чтение аналоговых входов с MCP3008 и потенциометром

Для введения в ШИМ-сигналы с Raspberry Pi прочитайте следующее руководство:

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

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

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

Вот список необходимых компонентов:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Чтение аналоговых сигналов с Raspberry Pi

GPIO Raspberry Pi могут считывать только цифровые сигналы — они могут считывать либо HIGH (3.3В), либо LOW (0В), но не могут считывать любые промежуточные напряжения. Чтобы иметь возможность считывать изменяющиеся уровни напряжения, нам нужна микросхема аналогово-цифрового преобразователя, такая как MCP3008.

Знакомство с АЦП MCP3008

На рисунке ниже показана микросхема аналогово-цифрового преобразователя MCP3008.

Микросхема MCP3008 аналогово-цифровой преобразователь

MCP3008 — это 10-битный аналогово-цифровой преобразователь, который считывает аналоговые сигналы и передаёт их микроконтроллеру по протоколу связи SPI (SPI-сигналы, которые Raspberry Pi может считывать).

MCP3008 имеет 16 выводов. Половина из них — аналоговые входы, которые можно использовать для подключения аналоговых устройств. Остальные 8 выводов подключаются к GPIO Raspberry Pi.

Нумерация выводов MCP3008

В следующей таблице показана распиновка микросхемы 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.

Подключение потенциометра к Raspberry Pi через MCP3008

Включение 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 очень просто.

  1. Импортируйте класс MCP3008.

from gpiozero import MCP3008
  1. Создайте объект MCP3008 и передайте в качестве аргумента аналоговый канал, который вы используете. Вы можете создавать различные объекты MCP3008 на разных каналах, если используете несколько аналоговых периферийных устройств.

pot = MCP3008(ANALOG_CHANNEL)
  1. Считывайте значение аналогового входа с помощью свойства 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

После запуска скрипта поверните потенциометр и наблюдайте, как яркость светодиода изменяется соответствующим образом.

Raspberry Pi управление светодиодом с потенциометром Raspberry Pi управление светодиодом с потенциометром

Вы можете остановить выполнение программы, нажав 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 по следующей ссылке: