Управление телевизором или любым устройством с инфракрасным интерфейсом с помощью Raspberry Pi

Добавлено 27 октября 2015 в 12:35

Подключение чего угодно с ПДУ к интернету вещей

внешний вид

Хотя интернет вещей – это относительно новое явление, но управление устройствами удаленно старо, как мир; устройства, управляемые с помощью инфракрасного ПДУ, существуют давно. Но большая часть потенциала устройств, находящихся у вас дома, не используется. Остальные детали, кроме Raspberry, для данного проекта вы можете купить в местном магазине электроники. И так, чтобы разблокировать этот потенциал вам понадобится:

Железо

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

схема
Схема приемника/передатчика на Raspberry Pi
макет
Пример макета

ИК передатчик

Инфракрасный передатчик состоит из ИК светодиода, резисторов 37 Ом и 10 кОм и PNP-транзистора.

Так как порты GPIO Raspberry Pi поддерживают максимальный ток 50 мА, а нашему светодиоду требуется 100 мА, мы будем запитывать ИК светодиод с помощью PNP-транзистора и источника питания 5 В.

Подключите ИК светодиод в цепь между выводом 5V Raspberry Pi через токоограничивающий резистор 37 Ом и коллектором вашего PNP транзистора. Резистор гарантирует, что ток через светодиод никогда не превысит 100 мА. Эмиттер соедините напрямую с корпусом.

База транзистора используется для его отпирания и запирания. Подключите её к выводу GPIO 22 через резистор 10 кОм.

ИК приемник

Инфракрасный приемник необязателен и требуется только, если вы не можете найти свой пульт дистанционного управления в базе данных ПДУ LIRC. Приемник подключается к корпусу и выводу 3V3 Raspberry Pi выводами GND и Vcc соответственно. Вывод Data приемника должен быть подключен к выводу GPIO 23 Raspberry Pi.

Так как порты GPIO могут различаться между моделями Raspberry Pi, проверьте справочник портов GPIO, чтобы точно определить какой порт подключен к какому выводу.

Установка необходимого программного обеспечения на Raspberry Pi

LIRC

LIRC означает Linux Infrared Remote Control (инфракрасный ПДУ для Linux), что говорит само за себя. Почти без дополнительных усилий этот пакет позволяет записывать и воспроизводить команды любого инфракрасного пульта дистанционного управления.

Если вы еще не установили LIRC, запустите следующие команды на своем Raspberry Pi:

sudo apt-get update && sudo apt-get install lirc

Далее мы должны изменить конфигурацию lirc для вашего Raspberry Pi. Измените /etc/lirc/hardware.conf в соответствии с кодом, приведенном ниже, используя nano /etc/lirc/hardware.conf или какой-либо другой текстовый редактор.

########################################################
# /etc/lirc/hardware.conf
#
# Аргументы, используемые при запуске lircd.
LIRCD_ARGS="--uinput"

# Не запускать lircmd, даже если конфигурационный файл кажется корректным.
# START_LIRCMD=false

# Не запускать irexec, даже если кажется, что конфигурационный файл существует.
# START_IREXEC=false

# Попытаться загрузить подходящие модули ядра.
LOAD_MODULES=true

# Запустить "lircd --driver=help" для списка поддерживаемых драйверов
DRIVER="default"
# обычно /dev/lirc0 является правильной настройкой для систем, использующих udev.
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

# Конфигурационные файлы по умолчанию для вашего железа, на всякий случай.
LIRCD_CONF=""
LIRCMD_CONF=""
########################################################

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

sudo echo "
lirc_dev
lirc_rpi gpio_in_pin=23 gpio_out_pin=22" >> /etc/modules
sudo /etc/init.d/lirc stop
sudo /etc/init.d/lirc start

Запись команд вашего ПДУ

Как упоминалось ранее, если ваш ПДУ уже есть в базе данных ПДУ LIRC, вы можете пропустить этот раздел.

Вы можете записать команды ПДУ, используя команду irrecord. Чтобы запустить irrecord, сначала вы должны остановить LIRC следующей командой:

sudo /etc/init.d/lirc stop

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

irrecord --list-namespace

Далее используйте irrecord в команде, показанной ниже. /dev/lirc0 указывает, где находится lirc устройство в вашей файловой системе, а ~/lircd.conf указывает, что конфигурацию необходимо сохранить в ваш домашний каталог.

irrecord -d /dev/lirc0 ~/lircd.conf

Когда вы закончите, отредактируйте конфигурационный файл nano ~/lircd.conf и измените строку name на имя вашего устройства.

И наконец, переместите новую конфигурацию в LIRC и запустите его снова!

sudo cp ~/lircd.conf /etc/lirc/lircd.conf
sudo /etc/init.d/lirc start

NodeJS и веб-приложение

NodeJS – это платформа, которая позволяет освободить javascript от браузера. Мы будем использовать NodeJS, чтобы запустить наш веб-сервер.

Установите NodeJS с помощью следующих команд:

wget http://node-arm.herokuapp.com/node_latest_armhf.deb 
sudo dpkg -i node_latest_armhf.deb
git clone https://github.com/vartan/pi-remote.git # Запрос обновленной копии скрипта
cd pi-remote                                      # Изменение каталога   
npm install                                       # Установка зависимостей

Вся суть веб-приложения находится в конце этого раздела. По большей части, оно состоит из статических файлов, расположенных в каталоге html/. Однако есть и специальный функционал:

  • при выполнении оно запрашивает у LIRC список устройств, а затем для каждого устройства кнопки;
  • когда пользователь посылает запрос (GET) http://webappurl/send/deviceName/buttonName, приложение пошлет соответствующий код кнопки, запуская irsend SEND_ONCE deviceName keyName.

Вот код приложения. Пожалуйста, не копируйте и не вставляйте этот скрипт, а клонируйте его из git, чтобы получить и остальные файлы.

/**
 * app.js
 * 
 * IR Remote Web Service
 * 
 * @author Michael Vartan
 * @version 1.0.0 
 */

var express = require('express');
var app = express();

var sys = require('sys')
var exec = require('child_process').exec;

/**
 * Словарь устройств и их кнопок
 * @type {Object}
 */
var devices = {};
/**
 * Формирует функцию для получения кнопок устройства от команды irsend
 * @param  {String} deviceName имя устройства
 * @return {Function}          вызов функции обратного вызова
 */ 
var getCommandsForDevice = function(deviceName) {
  /**
   * Получает кнопку устройства от команды irsend
   * @param  {String} error  Ошибка из запущенной команды
   * @param  {String} stdout std out
   * @param  {String} stderr std err
   * @return {None}        
   */
  return function(error, stdout, stderr) {
    var lines = stderr.split("\n");
    for(var lineIndex in lines) {
      var line = lines[lineIndex];
      var parts = line.split(" ");
      if(parts.length>2) {
        var keyName = parts[2];
        devices[deviceName].push(keyName);
        console.log(deviceName + " found key: "+keyName);
      }
    }
  }
};
/**
 * Получает устройство от команды irsend
 * @param  {String} error  Error from running command
 * @param  {String} stdout std out
 * @param  {String} stderr std err
 * @return {None}        
 */
var getDevice = function (error, stdout, stderr) {
  if(error) {
    console.log("irsend not available.");
    return;
  }
  var lines = stderr.split("\n");
  for(var lineIndex in lines) {
    var line = lines[lineIndex];
    var parts = line.split(" ");
    if(parts.length>1) {
      var deviceName = parts[1];
      console.log("device found: "+deviceName.trim());
      devices[deviceName] = [];
      exec("irsend list \""+deviceName+"\" \"\"", getCommandsForDevice(deviceName));

    }
  }          
};
// Получает информацию о всех устройствах
exec("irsend list \"\" \"\"", getDevice);

// Определяет статические HTML файлы
app.use(express.static(__dirname + '/html'));



// Определяет GET запрос для /send/deviceName/buttonName
app.get('/send/:device/:key', function(req, res) {

  var deviceName = req.param("device");
  var key = req.param("key").toUpperCase();

  // Убедиться, что пользователь запросил правильное устройство 
  if(!devices.hasOwnProperty(deviceName)) {
    res.send("invalid device");
    return;
  }

  // Убедиться, что пользователь запросил правильную кнопку/ключ
  var device = devices[deviceName];
  var deviceKeyFound = false;
  for(var i = 0; i < device.length; i++) {
    if(device[i] == key) {
      deviceKeyFound = true; 
      break;
    }
  }
  if(!deviceKeyFound) {
    res.send("invalid key number: "+key);
    return;
  }

  // послать команду в irsend
  var command = "irsend SEND_ONCE "+deviceName+" "+key;
  exec(command, function(error, stdout, stderr){
    if(error)
      res.send("Error sending command");
    else   
      res.send("Successfully sent command");
  });


}); // конец определения GET запроса для /send/deviceName/buttonName

// Listen on port 80
app.listen('80');

Запуск приложения

Приложение может быть запущено следующей командой: sudo node app.js. В идеале данное приложение запускается при каждой загрузке Raspberry Pi. Это может быть достигнуто с помощью редактирования /etc/rc.local с командой sudo nano /etc/rc.local и добавлением следующего перед exit 0:

sudo node /path/to/remote-pi/app.js

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


Сообщить об ошибке