Espruino:Примеры/Дистанционное ИК-управление

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Дистанционное ИК-управление[1]

Разве не было бы здорово, если бы вы могли управлять Espruino дистанционно при помощи ИК-сигналов? Не проблема!

Или же вы, наоборот, хотите управлять ИК-устройствами при помощи Espruino? Тогда вам помогут вот эти статьи:

Примечание

Вы также можете воспользоваться вот этим модулем для приёма ИК-сигналов – он упрощает реагирование на ИК-сигналы.

Нам понадобятся

Где взять ИК-приёмник

У вас есть три варианта:

Я решил воспользоваться третьим вариантом (так интереснее).

Добываем ИК-приёмник

Найдите старую дистанционно управляемую ТВ-приставку, которую планировали выбросить, и вскройте её. Вам нужно примерно следующее:

У этого устройства три провода, оно расположено в передней части корпуса и оснащено чёрной пластиковой линзой, через которую и осуществляется излучение ИК-сигнала.

По всей видимости, эти ИК-приёмники бывают разных типов. Чтобы понять, какие контакты ИК-приёмника за что отвечают, возьмите мультиметр, включите в нём режим, при котором при нахождении короткого замыкания будет издаваться писк, и затем найдите на плате ТВ-приставки нечто, напоминающее заземление – это может быть большая металлическая контактная площадка, большой металлический куб или контакт конденсатора (это большой цилиндрический элемент), помеченный прерывистой серебристой полосой (- - - -). Подключите один щуп мультиметра к этому заземлению, а другим поочередно трогайте все три контакта ИК-приёмника. Когда прозвучит писк, это будет значить, что именно этот контакт отвечает за GND.

Теперь нужно найти контакт питания, что несколько сложнее. Вам нужно будет прошерстить все конденсаторы (это, напоминаю, большие цилиндрические элементы) на предмет того, какой из оставшихся двух контактов ИК-приёмника подключен к одному из этих конденсаторов. Трогать нужно положительные контакты конденсаторов – те, что не помечены прерывистой серебристой полосой (- - - -). Если у вас не получилось найти контакт питания, то лучше найти другую ТВ-приставку и продолжить поиск на ней, или просто купить ИК-приёмник.

Оставшийся последний третий контакт – это контакт для передачи сигнала!

Теперь просто отпаяйте ИК-приёмник – сейчас мы припаяем его к Espruino.

Подсоединение

Подключите ИК-приёмник к Espruino следующим образом:

ИК-приёмник Espruino
GND GND
Питание 3.3v
Сигнал Любой контакт для передачи сигнала (я воспользовался A0)

Код

Во-первых, нам надо определить периодичность импульсов ИК-излучения. Код ниже для этого и предназначен – он печатает эту информацию в консоли. Скопируйте его в левую часть Web IDE.

function onPulseOn(e) {
  print(e.time - lastTime);
  lastTime = e.time;
}
function onPulseOff(e) {
  lastTime = e.time;
}
setWatch(onPulseOff, A0, { repeat:true, edge:"rising" });
setWatch(onPulseOn, A0, { repeat:true, edge:"falling" });

Если значения в консоли печатаются, хотя вы ещё даже не нажимали кнопки на пульте управления, то у вашего ИК-приёмника, вероятно, нет встроенного резистора. Чтобы активировать встроенный резистор Espruino, запустите команду ниже:

pinMode(A0,"input_pullup");

Теперь возьмите пульт управления и нажмите какую-нибудь кнопку на нём. Консоли начнёт печатать различные числа – примерно вот так:

...
0.001324999999951614881
0.000425000000177533365
0.000450000000228101271
0.000450000000228101271
0.00045
0.0013
0.00045
0.0013
...

Эти числа можно поделить на две группы – те, что меньше «0.001», и те, что больше «0.001». Если у вас не такой пульт управления, как у меня, то у вас эти числа могут быть другими. Они – часть кода, который ваш пульт использовал для управления ТВ-приставкой. Давайте отредактируем функцию onPulseOn(), чтобы использовать это:

function onPulseOn(e) {
  print((e.time - lastTime)>0.001);
  lastTime = e.time;
}

Теперь после нажатия на кнопки пульта в консоли будет появляться true или false. Но и это ещё не всё. Теперь нам надо объединить эти значения в одно большое число, а затем, когда в передаче данных обнаружится пауза, мы напечатаем в консоли это большое число, скопившее в себе все значения, полученные до паузы:

// Получаемый нами код:
var code = 0;
// Функция, в которой мы печатаем полученный код
// и обнуляем переменную, содержавшую код
function handleCode() {
  timeout = undefined;
  print(code);
  code = 0;
}
/* Снова редактируем функцию onPulseOn(),
   чтобы она сохраняла данные в переменную «code».
   При обнаружении паузы в 20 мс печатаем получившийся код */
function onPulseOn(e) {
  code = (code*2) | ((e.time - lastTime) > 0.0008);
  if (timeout!==undefined) clearTimeout(timeout);
  timeout = setTimeout(handleCode, 20);
  lastTime = e.time;
}

Теперь при нажатии на какую-нибудь кнопку на пульте в консоли будет появляться число. Например, на пульте Panasonic (которым пользуюсь я) при нажатии на кнопку увеличения громкости будет печататься число «914810870957061», а при нажатии на кнопку уменьшения громкости – «914810870989957». Давайте напишем код, использующий эти значения:

function handleCode() {
  timeout = undefined;
  if (code==914810870957061) digitalPulse(LED1,1,20);
  if (code==914810870989957) digitalPulse(LED2,1,20);
  code = 0;
}

В результате на Espruino будет загораться красный или зелёный светодиод в зависимости от того, какая кнопка (увеличения или уменьшения громкости) была нажата на пульте. Но это касается лишь пульта Panasonic, которым пользуюсь я. У вас эти числа, возможно, будут другими.

Как применить это на практике

Теперь мы можем воспользоваться этим кодом на практике. К примеру, у меня есть старый усилитель, подключенный к ТВ-динамикам. У него нет пульта управления, так что дистанционно регулировать его громкость невозможно. Но что если применить к нему то, что мы сделали выше?

Возьмите серводвигатель и подключите его к контакту B13 на Espruino (о том, как сделать это, читайте тут), а затем воспользуйтесь вот этим кодом:

// Переменная для изменения позиции серводвигателя:
volume = 0;

// Меняем громкость:
function changeVolume(dir) {
  volume += dir * 0.02;
  if (volume<0) volume = 0;
  if (volume>1) volume = 1;
  // Даём серводвигателю импульс,
  // чтобы он передвинулся на новую позицию:
  digitalPulse(B13, 1, 1+volume);
}

// Двигаем серводвигатель в зависимости от команды,
// полученной от пульта ИК-управления:
function handleCode() {
  timeout = undefined;
  if (code==914810870957061) changeVolume(+1);
  if (code==914810870989957) changeVolume(-1);
  code = 0;
}

Осталось просто подсоединить серводвигатель к регулятору громкости усилителя и вуаля – теперь вы можете управлять им с помощью пульта дистанционного ИК-управления!

См.также

Внешние ссылки