Как использовать прерывания с Python на Raspberry Pi и RPi.GPIO

rpi400

Последняя большая новость в мире Кфізиуккн Pi Python GPIO программирования является то, что Бен Кростон выпустил обновление для RPi.GPIO. Почему это важно? Потому что эта версия имеет прерывания. “Что за прерывания?” Скажете Вы. Это способ ждать чего-то, не проверяя постоянно происходит это или нет.

Представьте, что вы ждете доставки – что нибудь такое, что вас действительно очень волнует – как Pi камера.Вы проводите слишком много времени, глядя на улицу в нетерпеливом ожидании прибытия почтальона. Вы не можете полностью сосредоточиться на том, что вы должны делать, потому что вы знаете, что это неизбежно. Каждый раз, когда вы слышите что-то на улице, вы подрываетесь и смотрите в окно.

То, что я только что описал в человеческих терминах это немного похоже на опрос. Опрос постоянно проверяет что-то. Например, если вы хотите проверить, что ваша программа действительно реагирует на нажатие кнопки как можно быстрее, вы можете проверять состояние кнопки около десяти тысяч раз в секунду. Это замечательно, если вам нужно быстро реагировать, но такая проверка использует очень немного вычислительной мощности компьютера. Таким же образом, как вы не можете полностью сосредоточиться, когда вы ожидаете доставку, большая часть вашего процессора используется этим опросом.

Но должен же быть лучший способ, верно?
Да. Так и есть. Это прерывания. Это первая из серии статей, которые призваны показать вам, как использовать эту новую возможность в Python.

Прерывания гораздо более эффективный способ обработки “ждать чего-то и реагировать немедленно, когда это произойдет” ситуации. Они высвободждают ресурсы используемые впустую на опрос, так что вы можете использовать их для чего-то еще. Затем, когда происходит ожидаемое событие, остальная часть вашей программы “прерывется” и выполняются указаные для события действия.



Таким образом, чтобы перенести на человеческий пример …
Прерывание, это как с автоматический детектор почтальона, который скажет вам точно, когда почтальон приходит, так что вы можете отвлечся на что-нибудь другое. Теперь вы точно знаете, что не пропустите важного для вас события.

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

Итак, как их использовать?
Я собираюсь показать простую ситуацию-“ждать нажатия кнопки”. Но прежде, чем вы попробуете это повторить, проверьте версию RPi.GPIO пакета. Возможно эго прдется обновить. Вы можете проверить, какая версия RPi.GPIO у вас в командной строке с …

sudo python
import RPi.GPIO as GPIO
GPIO.VERSION

Это должно показать вам, какая версия RPi.GPIO установлена у вас. Вам нужна 0.5.1 или выше для этого примера.

Установите RPi.GPIO версию 0.5.1 для простых прерываний
Если вам нужно, вы можете установить 0.5.1 или более поздние версии
sudo apt-get update
sudo apt-get dist-upgrade
(Это обновит все ваши Raspbian пакеты и может занять около часа)
или, с командной строке (это обновит только RPi.GPIO) …

wget http://raspberry-gpio-python.googlecode.com/files/python-rpi.gpio_0.5.1a-1_armhf.deb
wget http://raspberry-gpio-python.googlecode.com/files/python3-rpi.gpio_0.5.1a-1_armhf.deb
sudo dpkg -i python-rpi.gpio_0.5.1a-1_armhf.deb
sudo dpkg -i python3-rpi.gpio_0.5.1a-1_armhf.deb

А теперь схема

RasPi.TV-interrupt1_bb-1024x846

Это простой опрос состояния кнопки, соединяющей 23 порт к GND при нажатии.

А теперь на код
Я разместил большую часть объяснения в комментариях кода.

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
# script by Alex Eames http://RasPi.tv/
# http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

# GPIO 23 установить как вход. И подтянуть чтобы отсечь ложныу срабатывания
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

print “Убедитесь, что у вас есть кнопка, подключенная таким образом, что при нажатии”
print “она соеденит GPIO порт 23 (pin 16) с GND (pin 6)\n”
raw_input(“Нажмите Enter когда готовы\n>”)

print “Ожидание падения фронта на порту 23”
# Теперь программа не будет делать ничего, пока сигнал на порту 23
# начнет падать к нулю. Именно поэтому мы использовали подтяжки
# держать сигнал высокого фронта и предотвратить ложное прерывание

print “В течение этого времени ожидания, ваш компьютер не”
print “тратит ресурсы путем опроса нажатия кнопки.\n”
print “Нажмите кнопку, когда вы готовы инициировать прерывание.”
try:
  GPIO.wait_for_edge(23, GPIO.FALLING)
  print “\nПадение фронта обнаружено. Теперь программа может продолжить”
  print “выполнять все что ожидало нажатия кнопки.”
except KeyboardInterrupt:
  GPIO.cleanup() # очистить GPIO при CTRL+C выходе
GPIO.cleanup() # очистить GPIO при нормальном выходе

Расшифровка кода
Строки 4-5 импортировать модуль RPi.GPIO и настроить схему нумерации BCM порта

строка 8 устанавливает GPIO 23 в качестве входа с резистором подтяжки подтянутым вверх.
Это означает, что сигнал будет высоким все время, пока кнопка не будет нажата соединяя порт и GND, что сделает его низким. Это позволяет избежать ложных обнаружения событий.

строки 10-11 выводят некоторые инструкции
Строка 12 ждет пока пользователь нажмет Enter для начала работы. Это дает возможность проверить проводку

строки 14-21 дальнейшие инструкции и документация

Строка 22 try: и строка 26 except KeyboardInterrupt:
Позволяют нам запускать программу и выйти “чисто”, если кто-то нажимает CTRL-C, чтобы остановить программу. Если мы этого не сделали, порты все еще будут установлены, когда мы насильно выйдем из программы.

Строка 23 устанавливает ситуацию “ждать падения сигнала к 0 на порту 23”

Строки 24-25 дальнейшие инструкции на экране

Строка 27 очищает GPIO порты, которые мы использовали во время этой программы при нажатии клавиши CTRL-C
Строка 28 очищает GPIO порты, которые мы использовали во время этой программы, когда программа выходит нормально

Код программы можна взять отсюда:
wget http://raspi.tv/download/interrupt1.py.gz
gunzip interrupt1.py.gz

или отсюда:

http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio

Источник: raspi.tv

2 комментария

Оставить ответ

Обязательные поля помечены*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.