Проекты Raspberry Pi на Python с GPIO

В этой статье мы поговорим о том, как подключать к Raspberry Pi датчики и другие внешние устройства через GPIO порты платы. Для работы будем использовать Python и библиотеки. Если вы новичок в работе с распбери, рекомендуем прочитать статью об установке Python и библиотек для Raspberry Pi.

Подключение внешних устройств к Raspberry Pi

Отличие Raspberry Pi от Arduino

Среди любителей радиотехники и электроники каждый слышал о существовании таких устройств как Arduino и Raspberry Pi. Обе платы используются для решения схожих  задач, оба прекрасно подходят для начинающих. Но по сравнению с Ардуино Raspberry – это многофункциональный компьютер, на котором может запускаться операционная система.

Из основных отличий можно выделить тактовую частоту – Raspberry работает в 40 раз быстрее Ардуино, и объем оперативной памяти – у Raspberry памяти больше примерно в 128000 раз. За счет простоты управления и использования разрабатывать аппаратные проекты на Ардуино  предпочтительнее. Ардуино может работать с любыми датчиками или чипами, а Raspberry Pi не такая гибкая, для работы с датчиками требуются дополнительные аппаратные устройства. Raspberry Pi очень требовательна к питанию, напряжение должно быть строго 5 В на входе, в то время как для ардуино рекомендуемое питание 7-12 В, которое стабилизируется до 5 В.

Важное отличие заключается в среде, в которой пишется программа. С Arduino IDE работать намного проще, чем с Linux. Установка библиотек для написания программы требуется для обеих систем, но код на Ардуино будет написан проще и короче.

Raspberry Pi возможно использовать в режиме многозадачности, как обычный компьютер. Одновременно может работать несколько программ в фоновом режиме.

Для расширения возможностей можно совместно использовать обе платы. Для управления датчиками и сенсорами использовать Ардуино, а сложные вычислительные задачи оставить для Raspberry Pi.

Описание GPIO

Количество портов в более старых и новых моделях Raspberry Pi отличается –model A и model B оснащены 26 выводами общего назначения GPIO, в следующих версиях количество выводов увеличено до 40.

Существует несколько видов обозначений выводов:

  • BCM – нумеруются выходы микропроцессора Broadcom. Используются при работе со специальными пакетами Rpi.GPIO. В большом количестве проектов используется именно эта нумерация.
  • WiringPi – нумеруются контакты для пакета Wiring Pi. Это библиотека, похожая на библиотеки для Ардуино, для работы с GPIO контактами.
  • Обычная цифровая нумерация выходов на самой плате.

Расположение контактов изображено на рисунке. На картинке для удобства последние 14 контактов отделены – это и есть новые выходы, которые были добавлены в новых версиях платы.

Проекты Raspberry Pi

Описание контактов GPIO

Номер выводаBCMWiringPiОписание контакта
13v3Питающий контакт на 3,3В
25vПитающий контакт на 5 В
3BCM28SDA
45vПитающий контакт на 5 В
5BCM39SCL
6GNDЗемля
7BCM47GPCLK0
8BCM1415TXD – отвечает за передачу данных
9GNDЗемля
10BCM1516RXD – отвечает за прием данных
11BCM170Вывод общего назначения
12BCM181PCM_C – используется в сочетании с ШИМ-методом.
13BCM272Контакт общего назначения
14GNDЗемля
15BCM223Контакт общего назначения
16BCM234Контакт общего назначения
173V3Питающее напряжение 3,3В
18BCM245Контакт общего назначения
19BCM1012MOSI
20GNDЗемля
21BCM913MISO
22BCM256Контакт общего назначения
23BCM1114SCLK
24BCM810CS0
25GNDЗемля
26BCM711CS1
27BCM030ID_SD
28BCM131ID_SD
29BCM521Контакт общего назначения
30GNDЗемля
31BCM622Контакт общего назначения
32BCM1226Контакт общего назначения
33BCM1323Контакт общего назначения
34GNDЗемля
35BCM1924MISO
36BCM1627Контакт общего назначения
37BCM2625Контакт общего назначения
38BCM2028MOSI
39GNDЗемля
40BCM2129SCLK

 

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

Среди выводов общего назначения имеются UART-контакты (на восьмом и десятом контактах). Они позволяют обеспечить взаимодействие Ардуино и Raspberry Pi. Также 4 вывода поддерживают I2C, главной задачей которых является коммуникация с периферией. Для верификации в коде нужно добавить строки

sudo apt-get install i2c-tools

sudo i2cdetect -y 1

Для осуществления доступа к I2C нужно подключить библиотеку smbus.

SPIподдерживают 11 выводов общего назначения. С помощью этого интерфейса можно настроить подключение нескольких устройств с помощью одной группы контактов.

Пример проекта: мигание светодиодов

Для работы понадобятся плата Raspberry Pi, светодиод, резистор на 200 Ом и соединительные провода. Анод светодиода (длинная ножка) нужно подключить через резистор к одному из цифровых выводов, например GPIO24, катод (короткая ножка) – к земле. Макет подключения представлен на рисунке. Резистор в данной схеме нужен для того, чтобы уберечь светодиод от перегорания. Выбрать правильный номинал можно пользуясь законом Ома R=U/I. Плата работает от напряжения 3,3В. Номинал, который будет получен по формуле – минимальный, можно выбирать сопротивление больше, но в этом случае яркость светодиода будет несколько ниже.

Проекты Raspberry Pi

Теперь нужно написать программу. Код будет написан в установленной версии Python 2. Для этого нужно открыть среду Python 2 (IDLE) и нажать «новый файл».

Проекты Raspberry Pi

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

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

[py]

from RPi import GPIO

from time import sleep //первые 2 строки включают библиотеки для совместной работы с GPIO и sleep

GPIO.setmode(GPIO.BCM)  //этой строкой выбирается нумерация контактов

GPIO.setup(24, GPIO.OUT) //чтобы управлять светодиодом или другим устройством, нужно задать OUT. Для того чтобы считывать сигнал сенсора, нужно ввести IN.

GPIO.output(24, True) //подача истины на контакты

sleep(10) //светодиод загорается на 10 секунд, ожидание

GPIO.output(24, False)

GPIO.cleanup() //сброс всех настроек портов, чтобы они не мешали следующей программе.

[/py]

Нужно нажать запуск программы с помощью F5 или меню Run/Run Module.

Код можно немного изменить, чтобы светодиод включался и выключался с определенной частотой. Для этого нужно добавить оператор while вместо строк GPIO.output и Sleep.В цикле нужно задать частоту, с которой будет мигать светодиод. В данном случае он будет мигать раз в 1 секунду.

[py]

while True:

GPIO.output(24, True)

sleep(1)

GPIO.output(24, False)

sleep(1)

[/py]

Большим недостатком такой программы будет то, что она будет повторяться бесконечно и остановить штатным методом ее будет невозможно. Для этого нужно ввести дополнительно конструкцию, прерывающую работу при наборе на клавиатуре комбинации Ctrl+C.

[py]

try:

while True:

GPIO.output(24, True)

sleep(0.5)

GPIO.output(24, False)

sleep(0.5)

except KeyboardInterrupt:

print ‘program stop’

[/py]

Программу нужно сохранить, нажав ctrl+S. Затем нужно нажать F5, светодиод начнет мигать с периодичностью раз в секунду. Чтобы остановить выполнение программы, нужно нажать ctrl+C.

Выводы

В этой статье мы приступили к новой большой теме и сделали первые шаги в программировании на Python под Raspberry с использование GPIO. Возможности микроконтроллера существенно превышают привычный Arduino, поэтому для создания по-настоящему умных устройств придется осваиваться с новыми инструментами для работы с периферией. В дальнейших статьях мы продолжим наши эксперименты.

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here