02
03

У данной статьи есть видеоверсия:

04
Подписывайтесь на канал , чтобы быть в курсе обновлений!
05 На заметку:
Для удобства взаимодействия с Raspberry Pi 3 через рабочий компьютер рекомендуется ознакомиться со статьей о настройке удаленного рабочего стола.
06

В подготовительных целях

Для удобства работы с выходами GPIO рекомендуется приобрести Т-образный шилд со шлейфом для удобной работы с макетной платой:

07
08

Вместо приобретения Т-образного шилда можно скачать и распечатать GPIO_mapping.pdf (97,0 KB) бумажную накладку на GPIO, чтобы можно было хоть как-то ориентироваться в распиновке разъема.

09
a id=e0c0a75b-7355-4604-8341-c42247a97231 filename=GPIO_mapping.pdf class=file imgid=e0c0a75b-7355-4604-8341-c42247a97231 href=/file/download/e0c0a75b-7355-4604-8341-c42247a97231GPIO_mapping.pdf/a span class=filesize(97,0 KB)/span
GPIO_mapping.pdf (97,0 KB)
10
11 Важно:
Статья не предназначена для начинающих и предполагает наличие начальных знаний и опыта работы с платами Arduino на базе МК Atmega 328.
12

Введение в GPIO

Raspberry Pi 3 имеет на борту 40-пиновую рейку GPIO (General Purpose Input Output — интерфейс ввода/вывода общего назначения). Но говорить о том, что все 40-пинов являются пина GPIO некорректно, так как 12 из них представляют из себя пины питания 3.3 В, 5 В и общие пины GND (земля):

13
14

Также 27 (BCM 0) и 28 (BCM 1) пины используются для конфигурации EEPROM Малинки для работы с HAT-устройствами (Hardware Attached on Top — устройства поверхностного монтажа, по сути — обычные платы расширения) и использование этих пинов крайне не рекомендуется. Тем не менее они являются полноценными GPIO-пинами.

15
16

Фактически получается, что GPIO-пинов не 40, а 28.

17

Нумерация пинов

Существует несколько вариантов нумерации пинов Малинки: Board (физическая нумерация по порядку) и BCM (нумерация из чипа). Также с библиотекой WiringPi используется своя нумерация:

18
19

Для избежания проблем, при написании программ, необходимо явно указывать какой режим нумерации будет использован.

20

Возможности пинов

Каждый из 28 пинов может быть установлен в режим цифрового выхода OUTPUT, и в режим цифрового входа INPUT.

21
22

Максимальный выходной ток каждого пина не должен превышать 16 мА. Суммарный выходной ток всех пинов не должен превышать 50 мА. 5-вольтовые пины могут давать больший ток, который остается после питания Raspberry Pi 3 и других периферийных устройств (клавиатуры, мыши) — до 500 мА.

23
24

По умолчанию все пины (кроме BCM14 и BCM15) находятся в режиме INPUT, причем пины BCM0-BCM8 и BCM15 подтянуты к единице подтягивающими резисторами (pullup). Именно по этой причине мультиметр покажет напряжение на этих пинах. Остальные пины стянуты к нулю.

25

Каждый из 28 пинов снабжен подтягивающим (pullup) и стягивающим (pulldown) резистором, благодаря чему, в режиме INPUT может быть подтянут к логической единице, либо стянут к нулю.

О том для чего нужны стягивающие/подтягивающие резисторы можно почитать в статье.
26

Номиналы сопротивлений не постоянны и равны:

  • для подтягивающего резистора 50 КОм — 65 КОм
  • для стягивающего резистора 50 КОм — 60 КОм

27

Номинал сопротивления подтягивающего/стягивающего резистора для пинов BCM2 и BCM31.8 КОм.

28

Каждый из 28 пинов в режиме INPUT может генерировать прерывания — по спаду, по фронту, по единице, по нулю, по изменению сигнала, а также в асинхронном режиме по фронту и по спаду:

29
30

Также все пины в режиме INPUT имеют входную фильтрацию на триггере Шмитта (преобразовывают аналоговый сигнал в цифровой с резкими переходами между состояниями):

31
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

Далее запустив среду разработки...

41
42
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() в начале, так как с точки зрения программы, состояние ни одного пина не было изменено:

50
51

Также программа выдаст ошибку при попытке настроить пин, состояние которого не было возвращено в исходное при помощи GPIO.cleanup().

52
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

Похожие запросы:

  • Maximum current on each GPIO pin for Raspberry Pi 3 Model B
  • What is the maximum current the GPIO pins can output?
  • GPIO max current
comments powered by HyperComments