Як використовувати переривання з Python на Raspberry Pi і RPi.GPIO

rpi400

Остання велика новина у світі Raspberry 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

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

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

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