Давайте посмотрим, как использовать датчик прерывистого луча в скрипте Python на Raspberry Pi! Некоторое время у меня было несколько таких, и на днях я наконец-то распаковал одну.

Датчики с прерывистым лучом обнаруживают объекты, пересекающие линию их «видимости», с помощью инфракрасного излучения. Они состоят из двух частей:

  • Излучатель: излучает луч инфракрасного света. У него два провода - один для питания, другой для заземления.
  • Приемник: когда направлен на излучатель, принимает инфракрасный луч. Он имеет три провода - один для питания, один для заземления и третий для данных.

И излучатель, и приемник должны быть подключены к источнику питания 5 В (Adafruit говорит, что 3,3 В также будут работать, но ожидаем более короткого диапазона), и вы можете использовать один и тот же источник для обоих, если хотите. Оба также нуждаются в заземлении, но они не обязаны его использовать совместно.

Излучатель и приемник работают вместе, поэтому, когда что-то проходит между ними, прерывая инфракрасный луч, происходит событие, которое ваш код может уловить и использовать. Эти события обнаруживаются с помощью третьего провода на приемнике для подключения к выводу GPIO на Pi, который установлен как вход. С точки зрения настройки и кодирования датчики размыкания луча очень похожи на кнопки или датчики магнитных дверей, о которых я писал раньше.

Эти датчики довольно дешевы, я получил свой от Adafruit (страница продукта здесь) за пару долларов каждый. Они продают их разных размеров - в основном, чем больше размер, тем дальше друг от друга вы можете разместить их и при этом ожидать, что они будут работать. Я мог бы предположить, что более крупные также действительно нуждаются в питании 5 В, а не 3,3 В, но я их не пробовал.

В будущем я собираюсь использовать несколько из этих датчиков в более крупном проекте. В этом посте я просто расскажу, как подключить его к Pi и как написать базовый скрипт Python, который запускает события при изменении состояния датчика.

Проводка

Я использовал макетную плату, чтобы подключить датчик к Pi следующим образом:

  • Красные провода на эмиттере и приемнике подключены к выводам питания 5 В на Pi.
  • Черные провода на эмиттере и приемнике подключены к контактам заземления на Pi.
  • Белый провод на приемнике подключен к GPIO 17 на Pi.

Программное обеспечение

Я написал простой скрипт Python, чтобы регистрировать каждый раз, когда изменяется состояние датчика…

Код разбивается на две части: настройка и обработка событий… сначала настройка:

  • В строке 3 я устанавливаю номер контакта GPIO, к которому подключен провод данных приемника. Я использовал 17, любой доступный порт GPIO подойдет.
  • В строке 11 GPIO установлен в режим нумерации Broadcom.
  • Строка 12 настраивает GPIO 17 как вход с включенным подтягивающим резистором. Если вы хотите узнать больше о настройке контактов GPIO с помощью Python, SparkFun имеет хорошее руководство.
  • Строка 13 сообщает модулю GPIO, что мы хотим запускать функцию break_beam_callback при изменении состояния GPIO 17.
  • Строка 15 останавливает выход из программы до тех пор, пока мы не закончим с ней, ожидая, пока пользователь нажмет Enter.
  • Если пользователь нажимает ввод, мы очищаем ресурсы GPIO в строке 16 перед выходом.

Функция, обрабатывающая события от датчика, называется break_beam_callback и определяется в строке 5. Вот как это работает:

  • Функция принимает параметр channel, который в данном случае не используется, но требуется, чтобы он работал как обратный вызов для функции add_event_detect модуля GPIO. Он содержит номер контакта GPIO, с которого произошло событие.
  • Строка 6 проверяет, высокий или низкий уровень на выводе 17.
  • Если это так, выполняется строка 7 и сообщает, что луч был восстановлен (что-то, что ранее блокировало обзор излучателя приемником, теперь исчезло).
  • Если на выводе 17 низкий уровень, выполняется строка 9 и сообщает, что луч был прерван (что-то только что заблокировало вид приемника на излучатель).

Вот и все!

Демо-время!

Вот короткое демонстрационное видео, показывающее, как эта установка используется, чтобы сообщить, когда автомобиль проезжает через датчик ... это то, над чем я хочу больше работать в более крупном проекте, над которым я работаю, но об этом позже!

Вы делаете что-нибудь интересное с Pi и датчиками? Если так, я бы хотел услышать об этом. Оставьте мне сообщение в комментариях ниже или найдите меня в Twitter.