mirror of
https://github.com/CopterExpress/clover.git
synced 2026-05-28 14:09:33 +00:00
235 lines
13 KiB
Markdown
235 lines
13 KiB
Markdown
# Работа с ИК-датчиками на Raspberry Pi 3
|
||
|
||
> **Caution** Данная статья не актуальна для последних версий образа *clover* и работает только на версиях *clover_v0.16-clover_v0.17*.
|
||
|
||
Инфракрасные датчики – удобный инструмент для передачи каких-либо команд на коптер. Они гибки в настройке и взаимодействие с ними возможно из языка Python.
|
||
|
||
## Подключение ИК-приемника
|
||
|
||
Большинство ИК-приемников работают и подключаются одинаково. У таких приемников есть 3 пина для подключения: G/GND – земля, V/VCC – питание 5В, S/OUT – сигнал.
|
||
|
||
<img src="../assets/IR_reciver_connection.png" height="500px" alt="ir reciver connection to raspberry">
|
||
|
||
> **Hint** Сигнальный порт не обязательно должен подключаться к порту GPIO 17, данный пин можно изменить во время [настройки портов in/out](#in/out).
|
||
|
||
## Настройка ИК-приемника и работа с модулем LIRC
|
||
|
||
LIRC (Linux Infrared Remote Control) – стабильная и проверенная библиотека с открытым кодом, которая позволяет отправлять и получать команды по инфракрасному порту. LIRC поддерживается Raspbian.
|
||
|
||
Для установки LIRC и сопутствующих модулей нужно подключить вашу Raspberry Pi к интернету и выполнить консольные команды:
|
||
|
||
```bash
|
||
sudo apt-get update
|
||
sudo apt-get install lirc
|
||
sudo apt-get install python-lirc
|
||
pip install py-irsend
|
||
|
||
```
|
||
|
||
> **Hint** Для корректного редактирования системных файлов требуется иметь права доступа администратора, используйте `sudo` при вызове редактора текста.
|
||
|
||
<a name="in/out"></a>
|
||
После установки модуля нужно отредактировать файл `/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 для завершения установки. Для этого выполните:
|
||
|
||
```bash
|
||
sudo reboot
|
||
```
|
||
|
||
После перезагрузки проверьте его статус, вызвав команду:
|
||
|
||
```bash
|
||
sudo /etc/init.d/lircd status
|
||
```
|
||
|
||
Если вы все сделали правильно, то статус работы должен быть `active`.
|
||
Чтобы проверить, что установленный модуль LIRC работает, выключите демон `lircd` и вызовите соответствующую команду:
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
> **Hint** В ситуации, если вы используете ИК-передатчик (TV-пульт, пульт от кондиционеров, и т. д.) и во время проверки вы не получаете сигнал, возможно ваш пульт использует другую частоту передачи сигнала. При использовании приемников типа TSOP 22XX рабочая частота приема сигнала будет в диапазоне от 30 до 50 кГц.
|
||
|
||
## Запись своей конфигурации ИК-пульта
|
||
|
||
<a name="remote_control"></a>
|
||
|
||
В случае, если вы хотите использовать свой ИК-передатчик, вам нужно записать его характерные настройки с помощью прилагающегося модуля `irrecord`. Для этого вам нужно выключить демон `lircd` и вызвать соответствующую команду. Во время калибровки пульта точно выполняйте все написанные инструкции.
|
||
|
||
> **Hint** Обратите внимание, что на последнем шаге калибровки вам нужно будет задать наименования кнопок, которые вы захотите расшифровать программно. Для того чтобы посмотреть список доступных имен, вызовите команду `irrecord --list-namespace`.
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
> **Caution** В случае работы с некоторыми пультами бывают ситуации, когда битовые описания кнопок являются излишними и в таком случае у вас может не работать команда `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`. [Установите его](#install) при необходимости.
|
||
|
||
Для корректного получения информации в собственном скрипте нужно создать файл `lircrc`, в котором будут храниться настройки ваших кнопок и программный ответ в случае их вызова.
|
||
|
||
Данный файл создается в той же папке, из которой будет вызван ваш скрипт, по умолчанию это `/home/pi/`.
|
||
|
||
Для того чтобы создать требуемый файл используйте любой текстовый редактор:
|
||
|
||
```bash
|
||
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 скрипт, который будет принимать значения нажатых клавиш и выполнять в соответствии с ними требуемые действия.
|
||
Пример такого скрипта:
|
||
|
||
```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()
|
||
```
|
||
|
||
## Работа с ИК-передатчиком
|
||
|
||
Для того, что бы работать с ИК-передатчиком, подключите его к тем портам, которые указывали [при настройке](#in/out).
|
||
|
||
<img src="../assets/IR_transmitter_connection.png" height="500px" alt="IR transmitter connection to raspberry">
|
||
|
||
<img src="../assets/IR_transmitter.png" height="200px" alt="IR transmitter scheme">
|
||
|
||
> **Hint** В случае, если вы используете готовую плату ИК-передатчика, подключите ее к нужным пинам Raspberry в соответствии с маркировкой пинов, точно так же как и с приемником.
|
||
|
||
Если все правильно подключено, то можно отправлять сигналы заданные на моменте [настройки пульта](#remote_control), используя команду:
|
||
|
||
```bash
|
||
irsend SEND_ONCE deviceName keyName
|
||
```
|
||
|
||
Где:
|
||
|
||
+ SEND_ONCE - параметр отвечающий за то, посылаете вы один сигнал или он передается как от зажатой кнопки
|
||
+ deviceName - имя пульта, которое вы давали во время его [настройки](#remote_control)
|
||
+ keyName - имя одной из кнопок, которые были вами заданы во время настройки пульта
|
||
|
||
Для того чтобы работать с `irsend` внутри вашего скрипта, вам потребуется модуль `python-irsend`, при необходимости [установите его](#install).
|
||
|
||
Чтобы использовать `irsend` импортируйте библиотеку и вызовите соответствующую команду:
|
||
|
||
```python
|
||
from py_irsend import irsend
|
||
|
||
|
||
irsend.send_once('YourRemote', ['YourKey'])
|
||
```
|
||
|
||
Где:
|
||
|
||
+ YourRemote - название вашего пульта указанное при настройке
|
||
+ YourKey - имя одной из заданных при настройке кнопок
|