01 |
Содержание:
|
|
03 |
У данной статьи есть видеоверсия: |
|
04 |
Подписывайтесь на канал
, чтобы быть в курсе обновлений! |
|
05 | На заметку: |
Для удобства взаимодействия с Raspberry Pi 3 через рабочий компьютер рекомендуется ознакомиться со статьей о настройке удаленного рабочего стола.
|
|
06 |
В подготовительных целях Для удобства работы с выходами GPIO рекомендуется приобрести Т-образный шилд со шлейфом для удобной работы с макетной платой: |
|
08 |
Вместо приобретения Т-образного шилда можно скачать и распечатать GPIO_mapping.pdf (97,0 KB) бумажную накладку на GPIO, чтобы можно было хоть как-то ориентироваться в распиновке разъема. |
|
09 |
GPIO_mapping.pdf (97,0 KB)
|
|
11 | Важно: |
Статья не предназначена для начинающих и предполагает наличие начальных знаний и опыта работы с платами Arduino на базе МК Atmega 328.
|
|
12 |
Введение в GPIO Raspberry Pi 3 имеет на борту 40-пиновую рейку GPIO (General Purpose Input Output — интерфейс ввода/вывода общего назначения). Но говорить о том, что все 40-пинов являются пина GPIO некорректно, так как 12 из них представляют из себя пины питания 3.3 В, 5 В и общие пины GND (земля): |
|
14 |
Также 27 (BCM 0) и 28 (BCM 1) пины используются для конфигурации EEPROM Малинки для работы с HAT-устройствами (Hardware Attached on Top — устройства поверхностного монтажа, по сути — обычные платы расширения) и использование этих пинов крайне не рекомендуется. Тем не менее они являются полноценными GPIO-пинами. |
|
16 |
Фактически получается, что GPIO-пинов не 40, а 28. |
|
17 |
Нумерация пинов Существует несколько вариантов нумерации пинов Малинки: Board (физическая нумерация по порядку) и BCM (нумерация из чипа). Также с библиотекой WiringPi используется своя нумерация: |
|
19 |
Для избежания проблем, при написании программ, необходимо явно указывать какой режим нумерации будет использован. |
|
20 |
Возможности пинов Каждый из 28 пинов может быть установлен в режим цифрового выхода OUTPUT, и в режим цифрового входа INPUT. |
|
22 |
Максимальный выходной ток каждого пина не должен превышать 16 мА. Суммарный выходной ток всех пинов не должен превышать 50 мА. 5-вольтовые пины могут давать больший ток, который остается после питания Raspberry Pi 3 и других периферийных устройств (клавиатуры, мыши) — до 500 мА. |
|
24 |
По умолчанию все пины (кроме BCM14 и BCM15) находятся в режиме INPUT, причем пины BCM0-BCM8 и BCM15 подтянуты к единице подтягивающими резисторами (pullup). Именно по этой причине мультиметр покажет напряжение на этих пинах. Остальные пины стянуты к нулю. |
|
25 |
Каждый из 28 пинов снабжен подтягивающим (pullup) и стягивающим (pulldown) резистором, благодаря чему, в режиме INPUT может быть подтянут к логической единице, либо стянут к нулю. |
О том для чего нужны стягивающие/подтягивающие резисторы можно почитать в статье.
|
26 |
Номиналы сопротивлений не постоянны и равны:
|
|
27 |
Номинал сопротивления подтягивающего/стягивающего резистора для пинов BCM2 и BCM3 — 1.8 КОм. |
|
28 |
Каждый из 28 пинов в режиме INPUT может генерировать прерывания — по спаду, по фронту, по единице, по нулю, по изменению сигнала, а также в асинхронном режиме по фронту и по спаду: |
|
30 |
Также все пины в режиме INPUT имеют входную фильтрацию на триггере Шмитта (преобразовывают аналоговый сигнал в цифровой с резкими переходами между состояниями): |
|
32 |
Raspberry Pi 3 не имеет аналоговых входов/выходов. Для реализации подобного функционала нужно использовать внешние АЦП/ЦАП, например, АЦП ADS1115 (I2C) или АЦП MCP3008. |
|
33 |
Языки программирования Программировать поведение GPIO можно на большом количестве различных языков — Pascal, Ruby, Perl, Java (Pi4J), C, C++, C#, WiringPi, Basic и т.д. Примеры большинства из них можно изучить на странице RPi GPIO Code Samples. |
|
34 |
Здесь и далее будет использоваться предустановленный в Raspbian Jessie With Pixel язык программирования Python (Питон) версии 3 вместе со средой разработки. Скрипты на Python можно также писать в текстовом редакторе командной строки nano: |
|
35 |
1 sudo nano script.py |
|
36 |
И после сохранения выполнять отсюда же: |
|
37 |
1 sudo python script.py |
|
38 |
Для начала экспериментов необходимо собрать схему: |
|
39 |
|
Библиотека Raspberry Pi 3 для CadSoft Eagle — e14_Rpi3_RevA.lbr.zip (445 Bytes)
|
40 |
Далее запустив среду разработки... |
|
43 |
...и выполнив первый код: |
|
44 | Python |
1 2 3 4 5 6 7 import RPi.GPIO as GPIO # Импортируем библиотеку по работе с GPIO
pin=5 # Переменная с номером пина
GPIO.setmode(GPIO.BCM) # Устанавливаем режим нумерации пинов
GPIO.setup(pin, GPIO.OUT) # Устанавливаем режим пина в OUTPUT
GPIO.output(pin, GPIO.HIGH) # Подаем на выход пина логическую единицу
print("End of program") # Информируем о завершении работы программы |
|
45 |
Можно убедиться в том, что в Python нет аналога бесконечной процедуры loop() как у Arduino — поэтому программа завершается после выполнения. Также видно, что светодиод продолжает гореть, а это говорит о том, что пин сохраняет заданные настройки после выполнения программы. Это чревато в будущем тем, что при сборке новой схемы можно неумышленно сделать короткое замыкание. |
|
46 |
Чтобы этого не происходило в библиотеке GPIO есть функция cleanup() — она возвращает все пины в исходное состояние. |
|
47 | Python |
1 2 3 4 5 6 7 8 9 10 11 import RPi.GPIO as GPIO # Импортируем библиотеку по работе с GPIO
import time # Импортируем класс для работы со временем
pin=5 # Переменная с номером пина
GPIO.setmode(GPIO.BCM) # Устанавливаем режим нумерации пинов
GPIO.setup(pin, GPIO.OUT, initial=1) # Не может принимать True/False, только 1/0
time.sleep(2) # Пауза 2 секунды
GPIO.cleanup() # Возвращаем пины в исходное состояние
print("End of program") # Информируем о завершении работы программы |
|
48 |
После того как пройдет 2 секунды, светодиод потухнет — пин вернется в исходной состояние. |
|
49 |
Нет смысла вызывать GPIO.cleanup() в начале, так как с точки зрения программы, состояние ни одного пина не было изменено: |
|
51 |
Также программа выдаст ошибку при попытке настроить пин, состояние которого не было возвращено в исходное при помощи GPIO.cleanup(). |
|
53 |
Но если сымитировать процедуру loop() при помощи бесконечного цикла while(), из программы придется выходить принудительно (сочетание клавиш Ctrl+C): |
|
54 | Python |
1 2 3 4 5 6 7 8 9 10 11 12 13 import RPi.GPIO as GPIO # Импортируем библиотеку по работе с GPIO
import time # Импортируем класс для работы со временем
pin=5 # Переменная с номером пина
GPIO.setmode(GPIO.BCM) # Устанавливаем режим нумерации пинов
GPIO.setup(pin, GPIO.OUT, initial=1) # Задаем значение по умолчанию - 1 (HIGH). Не может принимать True/False, только 1/0
while True: # Аналог процедуры Loop() из Arduino
print(1) # Принудительный выход из программы Ctrl+C
GPIO.cleanup() # Возвращаем пины в исходное состояние
print("End of program") # Информируем о завершении работы программы |
|
55 |
После выхода, светодиод также будет гореть, так как функция GPIO.cleanup() не была вызвана. Для того, чтобы устранить эту проблему, всегда нужно пользоваться конструкцией try-except-finally: |
|
56 | Python |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import RPi.GPIO as GPIO # Импортируем библиотеку по работе с GPIO
import time # Импортируем класс для работы со временем
pin=5 # Переменная с номером пина
GPIO.setmode(GPIO.BCM) # Устанавливаем режим нумерации пинов
GPIO.setup(pin, GPIO.OUT, initial=1) # Не может принимать True/False, только 1/0
try:
while True: # Аналог процедуры Loop() из Arduino
print(1) # Принудительный выход из программы Ctrl+C
except KeyboardInterrupt:
print("Exit pressed Ctrl+C") # Выход из программы по нажатию Ctrl+C
except:
print("Other Exception") # Прочие исключения
finally:
GPIO.cleanup() # Возвращаем пины в исходное состояние
print("End of program") # Информируем о завершении работы программы |
|
57 |
Теперь, даже при аварийном завершении, программа выполнит функцию GPIO.cleanup(), вернув все используемые пины в исходное состояние. Также, можно отслеживать различные исключения, которые привели к завершению программы. С полным списком исключений можно ознакомиться в документации к Python. |
|
58 |
Вот шаблон, который нужно сохранить, и при написании любой программы нужно начинать с него: |
|
59 | Python |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import RPi.GPIO as GPIO # Импортируем библиотеку по работе с GPIO
import time # Импортируем класс для работы со временем
try:
# === Инициализация пинов ===
#pin=5
#GPIO.setmode(GPIO.BCM)
#GPIO.setup(pin, GPIO.OUT, initial=1)
# Здесь размещаем основной рабочий код
# ...
except KeyboardInterrupt:
# ...
print("Exit pressed Ctrl+C") # Выход из программы по нажатию Ctrl+C
except:
# ...
print("Other Exception") # Прочие исключения
finally:
GPIO.cleanup() # Возвращаем пины в исходное состояние
print("End of program") # Информируем о завершении работы программы |
|
61 |
Похожие запросы:
|
|