Управление GPIO из языка Python


Предыдущая | Следующая

Для работы с GPIO на языке Python требуется специальная библиотека RPi.GPIO. В новом дистрибутиве Raspbian она уже установлена, а если у вас дистрибутив ста­рый, то для установки библиотеки RPi.GPIO выполните команду:

sudo apt-get install python-rpi.gpio

Чтобы использовать эту библиотеку, необходимо в программу на Python добавить строку импорта библиотеки RPi.GPIO:

Import RPi.GPIO as GPIO

При подготовке программы можно выбрать один из двух способов нумерации пор­тов GPIO. Первый — GPIO.BOARD — использует систему нумерации портов на плате Raspberry Pi. Преимущество этой системы нумерации в том, что ваше обору­дование будет работать всегда, независимо от номера ревизии платы, — вам не придется перемонтировать свой разъем или изменять имеющийся код. Вторая сис­тема нумерации — GPIO.BCM (номера BCM). Это более низкий уровень работы — с прямым обращением к номерам каналов на процессоре (SoC) Broadcom. Выбор способа нумерации определяется соответствующими командами:

GPIO.setmode(GPIO.BOARD)

GPIO.setmode(GPIO.BCM)

Следующие команды устанавливают режим работы контакта на вход или выход:

GPIO.setup(channel, GPIO.IN)

GPIO.setup(channel, GPIO.OUT)

Если входной канал ни к чему не подключен, его значение может "плыть". Следующие команды устанавливают начальную "подтяжку" вывода к питанию или к "земле":

GPIO.setup(channel, GPIO.IN, GPIO.PUD_UP)

GPIO.setup(channel, GPIO.IN, GPIO.PUD_DOWN)

Для выходов OUT можно установить начальное значение 0 или 1:

GPIO.setup(channel, GPIO.OUT, GPIO.LOW)

GPIO.setup(channel, GPIO.OUT, GPIO.HIGH)

Для чтения значения контакта GPIO, настроенного как вход IN, служит следующая команда:

GPIO.input(channel)

Значение контакта, настроенного как выход out, устанавливается следующей командой:

GPIO.output(channel, state)

В листинге 6.1 приведен пример использования команд работы с GPIO.

Листинг 6.1. Пример использования команд для работы с GPIO

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM) GPIO.setup(7, GPIO.OUT) GPIO.setup(8, GPIO.IN) GPIO.output(7, True) GPIO.output(7, False) signal = GPIO.input(8) GPIO.cleanup()

#подключаем библиотеку #устанавливаем режим нумерации #конфигурируем GPIO 7 как выход #конфигурируем GPIO 8 как вход #вы1водим на GPIO 7 логическую "1" (3.3 V) #вы1водим на GPIO 7 логический "0" #считываем с GPIO 8 в переменную signal #завершаем работу с GPIO

Библиотека RPi.GPIO позволяет использовать контакты GPIO в качестве выходов ШИМ (сигналов широтно-импульсной модуляции).

Для создания экземпляра ШИМ служит команда:

p = GPIO.PWM(channel, frequency) где frequency — частота, Гц.

Для старта ШИМ на контакте:

p.start(dc)

где dc — рабочий цикл ШИМ (0,0-100,0).

Для изменения частоты сигнала:

p.ChangeFrequency(freq)

где freq — частота сигнала, Гц.

Для изменения рабочего цикла ШИМ:

p.ChangeDutyCycle(dc) # where 0.0 <= dc <= 100.0 Останов выдачи сигнала ШИМ на контакте:

p.stop()

В листинге 6.2 представлен пример плавного включения/выключения светодиода, подключенного к контакту.

Листинг 6.2. Пример плавного включения/выключения светодиода

import time

import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD)

GPIO.setup(12, GPIO.OUT)

p = GPIO.PWM(12, 50) # контакт 12 частота 50 Гц

p.start(0)

try:

while 1:

for dc in range(0, 101, 5): p.ChangeDutyCycle(dc) time.sleep(0.1) for dc in range(100, -1, -5): p.ChangeDutyCycle(dc) time.sleep(0.1) except KeyboardInterrupt: pass p.stop()

GPIO.cleanup()

Функция ожидания события — изменения состояния на входе in — выглядит следующим образом:

GPIO.wait_for_edge(channel, GPIO.RISING)

GPIO.wait_for_edge(channel, GPIO.FALLING)

GPIO.wait_for_edge(channel, GPIO.BOTH)

Эта функция прерывает выполнение программы до изменения состояния на входе GPIO. В отличие от нее функция add_event_detected() выполняется в цикле программы, и для того, чтобы узнать об изменении состояния на контакте GPIO, необ­ходимо в цикле проверять наступление события event_detected() :

GPIO.add_event_detect(channel, GPIO.RISING

if GPIO.event detected(channel): print('Button pressed')

Каждый контакт GPIO может быть настроен на работу в режиме прерывания, в этом случае при наступлении события на контакте управление передается функ­ции обработки прерывания. Функция обработки прерывания работает в отдельном потоке, не прерывая выполнения основной программы:

def my callback(channel):

print('обработка прерывания!')

GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)

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

GPIO.cleanup()

Для сброса одного контакта служит команда:

GPIO.cleanup(channel)