Работа с ИК-датчиками на Raspberry Pi 3
Данная статья не актуальна для последних версий образа clover и работает только на версиях clover_v0.16-clover_v0.17.
Инфракрасные датчики – удобный инструмент для передачи каких-либо команд на коптер. Они гибки в настройке и взаимодействие с ними возможно из языка Python.
Подключение ИК-приемника
Большинство ИК-приемников работают и подключаются одинаково. У таких приемников есть 3 пина для подключения: G/GND – земля, V/VCC – питание 5В, S/OUT – сигнал.
Сигнальный порт не обязательно должен подключаться к порту GPIO 17, данный пин можно изменить во время настройки портов in/out.
Настройка ИК-приемника и работа с модулем LIRC
LIRC (Linux Infrared Remote Control) – стабильная и проверенная библиотека с открытым кодом, которая позволяет отправлять и получать команды по инфракрасному порту. LIRC поддерживается Raspbian.
Для установки LIRC и сопутствующих модулей нужно подключить вашу Raspberry Pi к интернету и выполнить консольные команды:
sudo apt-get update
sudo apt-get install lirc
sudo apt-get install python-lirc
pip install py-irsend
Для корректного редактирования системных файлов требуется иметь права доступа администратора, используйте
sudo
при вызове редактора текста.
После установки модуля нужно отредактировать файл /etc/modules
и добавить в него строки:
lirc_dev
lirc_rpi gpio_in_pin=18 gpio_out_pin=17
Где:
gpio_in_pin
– пин входа от приемникаgpio_out_pin
– пин выхода для передатчика
Обновите следующую строку в файле /boot/config.txt
:
dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17
Добавьте следующие строки в файл /etc/lirc/hardware.conf
. При отсутствии данного файла создайте его вручную.
LIRCD_ARGS="--uinput --listen"
LOAD_MODULES=true
DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"
Обновите следующие строки в файле /etc/lirc/lirc_options.conf
driver = default
device = /dev/lirc0
Все требуемые настройки сделаны, теперь нужно перезагрузить ваше устройство Raspberry Pi для завершения установки. Для этого выполните:
sudo reboot
После перезагрузки проверьте его статус, вызвав команду:
sudo /etc/init.d/lircd status
Если вы все сделали правильно, то статус работы должен быть active
.
Чтобы проверить, что установленный модуль LIRC работает, выключите демон lircd
и вызовите соответствующую команду:
sudo /etc/init.d/lircd stop
mode2 -d /dev/lirc0
Теперь, направив ИК-передатчик на ваше устройство и нажав несколько кнопок, вы должны увидеть что-то похожее на это:
space 402351
pulse 135
space 7085
pulse 85
space 2903
pulse 560
space 1706
pulse 535
В ситуации, если вы используете ИК-передатчик (TV-пульт, пульт от кондиционеров, и т. д.) и во время проверки вы не получаете сигнал, возможно ваш пульт использует другую частоту передачи сигнала. При использовании приемников типа TSOP 22XX рабочая частота приема сигнала будет в диапазоне от 30 до 50 кГц.
Запись своей конфигурации ИК-пульта
В случае, если вы хотите использовать свой ИК-передатчик, вам нужно записать его характерные настройки с помощью прилагающегося модуля irrecord
. Для этого вам нужно выключить демон lircd
и вызвать соответствующую команду. Во время калибровки пульта точно выполняйте все написанные инструкции.
Обратите внимание, что на последнем шаге калибровки вам нужно будет задать наименования кнопок, которые вы захотите расшифровать программно. Для того чтобы посмотреть список доступных имен, вызовите команду
irrecord --list-namespace
.
irrecord -d /dev/lirc0 ~/lircd.conf
Если у вас успешно получилось записать конфигурацию вашего пульта, в папке /home/pi/
должен был появиться файл ваше-имя.lircd.conf
. Теперь вам нужно перенести записанный конфигурационный файл в рабочую папку lirc
и перезагрузить демон:
sudo cp ~/ваше-имя.lircd.conf /etc/lirc/lircd.conf
sudo /etc/init.d/lircd restart
Для того чтобы проверить, распознается ли записанная вами конфигурация, вызовите соответствующий модуль. Теперь при нажатии на кнопки, которые вы записали в ранее созданной конфигурации, в терминал будет выводиться отладочная информация о том, какая кнопка была нажата.
irw
В случае работы с некоторыми пультами бывают ситуации, когда битовые описания кнопок являются излишними и в таком случае у вас может не работать команда
irw
. Что бы исправить эту ошибку откройте файлetc/lirc/lircd.conf
и проверьте как выглядит описание ваших клавиш, если оно похоже наKEY_1 0x00FF6897 0x7EE0CF2C
и во всех строках у вас второе число совпадает, то вам нужно его удалить, что бы строки с назначением кнопок выглядели таким образомKEY_1 0x00FF6897
и все числа в них были уникальны. После выполнения этих действий закройте файл и перезагрузите демон.
Если вы все сделали правильно, то при нажатии кнопки вы увидите выход похожий на:
0000000000ff6897 00 KEY_1 pult
0000000000ff6897 01 KEY_1 pult
0000000000ff9867 00 KEY_2 pult
0000000000ff9867 01 KEY_2 pult
Это значит, что ваша конфигурация корректно распознается программой и теперь вы можете запрограммировать нужные вам действия в случае нажатия определенной клавиши.
Работа с ИК-датчиками в Python
Чтобы иметь возможность использовать сигналы с ИК-приемника в Python программах, вам потребуется пакет python-lirc
. Установите его при необходимости.
Для корректного получения информации в собственном скрипте нужно создать файл lircrc
, в котором будут храниться настройки ваших кнопок и программный ответ в случае их вызова.
Данный файл создается в той же папке, из которой будет вызван ваш скрипт, по умолчанию это /home/pi/
.
Для того чтобы создать требуемый файл используйте любой текстовый редактор:
sudo nano .lircrc
Формат данного файла должен быть примерно таким:
begin
prog = myprogram
button = KEY_1
config = one
end
begin
prog = myprogram
button = KEY_2
config = two
end
Где:
prog
– имя программы, которое вы будете вызывать в своем скриптеbutton
– наименование клавиши, которое вы вводили во время настройки пультаconfig
– информация, которая будет передана вашей программе в случае нажатия указанной клавиши
Все настройки выполнены и теперь можно переходить непосредственно к программированию ИК-сигналов.
Для этого нужно создать Python скрипт, который будет принимать значения нажатых клавиш и выполнять в соответствии с ними требуемые действия. Пример такого скрипта:
import lirc
import fly_module
# ...
sockid = lirc.init('myprogram')
inf = lirc.nextcode()
if inf[0] == 1:
print('You pressed key 1')
elif inf[0] == 2:
print('You pressed key 2')
lirc.deinit()
Работа с ИК-передатчиком
Для того, что бы работать с ИК-передатчиком, подключите его к тем портам, которые указывали при настройке.
В случае, если вы используете готовую плату ИК-передатчика, подключите ее к нужным пинам Raspberry в соответствии с маркировкой пинов, точно так же как и с приемником.
Если все правильно подключено, то можно отправлять сигналы заданные на моменте настройки пульта, используя команду:
irsend SEND_ONCE deviceName keyName
Где:
- SEND_ONCE - параметр отвечающий за то, посылаете вы один сигнал или он передается как от зажатой кнопки
- deviceName - имя пульта, которое вы давали во время его настройки
- keyName - имя одной из кнопок, которые были вами заданы во время настройки пульта
Для того чтобы работать с irsend
внутри вашего скрипта, вам потребуется модуль python-irsend
, при необходимости установите его.
Чтобы использовать irsend
импортируйте библиотеку и вызовите соответствующую команду:
from py_irsend import irsend
irsend.send_once('YourRemote', ['YourKey'])
Где:
- YourRemote - название вашего пульта указанное при настройке
- YourKey - имя одной из заданных при настройке кнопок