Espruino:Примеры/Передача и прием ИК-сигнала с помощью Espruino Pico

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

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


Передача и прием ИК-сигнала с помощью Espruino Pico[1]

В этом руководстве мы подключим к Espruino Pico инфракрасный приёмник, чтобы получить сигналы от пульта дистанционного управления, записать их, а затем воспроизвести при нажатии на кнопку.

Примечание

Если у вас нет ИК-приёмника, то не страшно – код Pronto Hex для вашего устройства можно найти в сети, а затем расшифровать его с помощью вот этой библиотеки.

Более подробно о том, как работают сами пульты дистанционного управления, можно почитать в этой статье.

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

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

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

  • Возьмите Espruino Pico и подключите её к макетной плате так, чтобы USB-коннектор смотрел влево.
  • Воткните ИК-приёмник VS1838B в макетную плату под Pico так, чтобы нижняя чёрная часть смотрела в вашу сторону, а три его ножки были подключены к 3 самым правым нижним контактам PicoB6, B7 и B8.
  • Подключите ИК-светодиод к 2 самым правым верхним контактам Pico (A6 и A5). Короткая ножка, находящаяся с плоской стороны – это катод, её нужно подключить к самому правому контакту.

Код для приёма сигнала

Сначала давайте возьмём ИК-приёмник и с его помощью попробуем принять команды от пульта дистанционного ИК-управления.

Вставьте код ниже в правую часть Web IDE и кликните на кнопку загрузки кода. Код нужно вставить именно в правую часть, потому что в нём используется модуль, который нужно автоматически подгрузить из сети.

digitalWrite(B7, 0); // на контакте B7 задаем 0 вольт (GND)
digitalWrite(A8, 1); // на контакте A8 задаём 3.3 вольта
// Инициализируем ИК-приёмник:
require("IRReceiver").connect(B6, function(code) {
  // Код прочтён!
  console.log(code);
});

Теперь, если у вас есть пульт управления, наведите его на приёмник и понажимайте кнопки на нём. В результате в левой части Web IDE начнут появляться команды пульта. У каждой кнопки должен быть свой собственный код. Например, в моём случае получилось следующее:

0100000000000010000011100011000111
1
100000000000010001011100001000111
1
100000000000010000101100010100111
1
1
100000000000010000011100011000111
1
100000000000010000011100011000111
1
100000000000010001011100001000111
1
Примечание

Некоторые пульты управления имеют другой сигнальный паттерн и работать не будут. Если ваш пульт управления не работает, попробуйте какой-нибудь другой.

Нажмите на кнопку на пульте и скопируйте куда-нибудь код, который появился в консоли после её нажатия. Потом сделайте то же самое с другой кнопкой. Затем вставьте оба этих кода в код ниже, заменив те, что там уже есть:

digitalWrite(B7, 0); // на контакте B7 задаём 0 вольт (GND)
digitalWrite(A8, 1); // на контакте A8 задаём 3.3 вольта
// Инициализируем ИК-приёмник:
require("IRReceiver").connect(B6, function(code) {
  // Код прочтён!
  if (code == "100000000000010000011100011000111") digitalWrite(LED1,1);
  if (code == "100000000000010001011100001000111") digitalWrite(LED1,0);
  console.log(code);
});

Отправьте этот код на Espruino. В результате вы сможете включать и выключать светодиод LED1 на плате, используя две кнопки на пульте управления, коды которых вставлены в программный код. Кроме того, мы можем добавить еще больше операторов if, чтобы с помощью пульта управлять и какими-то другими вещами, а не только светодиодом. Вы можете поменять LED1 на A8 и подключить к контакту A8 реле-модуль – это позволит включать и выключать при помощи пульта управления практически что угодно.

Код для передачи сигнала

А что насчёт передачи сигнала? Для этого нам надо будет просто генерировать маленькие импульсы квадратного волнообразного сигнала частотой в 38 КГц продолжительностью около 1 мс (продолжительность определяет, что отправляется – 0 или 1). Поскольку передатчик – это диод, мы можем генерировать квадратную 38 КГц волну на одном контакте при помощи analogWrite(A6,0.9,{freq:38000}), а импульсы – на другом при помощи

digitalPulse(A5,...).

Но то, что именно нужно передавать, зависит от модели пульта управления, а также от того, какие команды этот пульт передаёт.

Но гораздо проще воспользоваться нашим ИК-приёмником, чтобы получить сигнал от пульта управления, а затем воспроизвести его. Для этого нам понадобится вот такой код:

digitalWrite(B7, 0); // на контакте B7 задаём 0 вольт (GND)
digitalWrite(A8, 1); // на контакте A8 задаём 3.3 вольта
// Мы не используем модуль, так что нам надо вручную 
// подтянуть к значению «1» контакт для передачи данных:
pinMode(B6,"input_pullup");
// Массив, в котором будут храниться продолжительности импульсов:
var times = [];
// Теперь следим за входящими данными:
setWatch(function(e) {
  // Рассчитываем, насколько долгим был импульс (в миллисекундах):
  var pulseLen = 1000 * (e.time - e.lastTime);
  // Если импульс был меньше 1 секунды, сохраняем его: 
  if (pulseLen < 1000)
    times.push(pulseLen);
  else
    times = [];
}, B6, {repeat:true});

Этот код сохраняет в массив times продолжительности всех импульсов, чтобы мы потом могли их посмотреть и использовать.

Теперь наведите пульт управления на ИК-приёмник и нажмите на кнопку, а затем напишите times в левой части Web IDE.

В итоге на дисплее должно отобразиться примерно следующее:

=[ 8.10241699218, 4.11701202392, 0.45776367187, 0.55694580078, 0.45776367187,  ... 0.45776367187, 44.54231262207, 8.10337066650, 2.07042694091, 0.46062469482 ]

Это продолжительности импульсов (не все, а лишь их часть – Web IDE показывает не всё, чтобы не засорять экран), которые были сохранены в массив times. Если вы хотите показать вообще всё, вы всегда можете напечатать console.log(times).

Примечание

Это хороший пример того, насколько просто израсходовать всю память микроконтроллера. Напечатайте process.memory().free – это покажет, сколько свободных блоков памяти осталось у Espruino. Теперь несколько секунд понажимайте на пульте управления случайные кнопки и снова напечатайте process.memory().free – свободных блоков памяти станет гораздо меньше. Это происходит, потому что Espruino сохраняет данные в виде 64-битных значений с плавающей точкой, а также каждый раз индекс массива, когда на самом деле достаточно сохранить просто 8 бит. Эта проблема легко решается (см. эту статью), но сейчас давайте просто сосредоточимся на выполнении нашей задачи, не ударяясь в оптимизацию.

Итак, теперь давайте воспроизведём эти сигналы – делается это очень просто. Нам лишь надо «скормить» массив times функции digitalPulse(). Напишите в левой части Web IDE следующее:

digitalPulse(LED1,1,times);

Возможно, вы даже заметите мигание светодиода на пульте управления, потому что у некоторых пультов активность светодиода напрямую привязана к активности ИК-передатчика.

Теперь давайте запишем и воспроизведём последовательность нажатий на кнопку. Вставьте код ниже в правую часть Web IDE:

digitalWrite(B7, 0); // на контакте B7 задаём 0 вольт (GND)
digitalWrite(A8, 1); // на контакте A8 задаём 3.3 вольта
// Мы не используем модуль, так что нам надо вручную
// подтянуть к значению «1» контакт для передачи данных:
pinMode(B6,"input_pullup");
// Массив, в котором будут храниться продолжительности импульсов:
var times = [];
/* Это идентификатор прерывания, используемого для записи ИК-сигнала.   
   Если мы будем передавать сигнал, прерывание надо будет отключить,
   иначе мы запишем свой собственный сигнал. */
var currentWatch;

function startWatching() {
  currentWatch = setWatch(function(e) {
    // Рассчитываем, насколько долгим был импульс (в миллисекундах): 
    var pulseLen = 1000 * (e.time - e.lastTime);
    // Если импульс был меньше 1 секунды, сохраняем его:
    if (pulseLen < 1000)
      times.push(pulseLen);
    else
      times = [];
  }, B6, {repeat:true});
}
startWatching();

function stopWatching() {
  clearWatch(currentWatch);
}

setWatch(function(e) {
  // Останавливаем запись:
  stopWatching();
  // Включаем светодиод LED1:
  digitalWrite(LED1,1);
  // Запускаем генерацию квадратной 38 КГц волны:
  analogWrite(A5,0.9,{freq:38000});
  // Отправляем импульсы:
  digitalPulse(A6, 1, times);
  // Ждём завершения импульсов:
  digitalPulse(A6, 1, 0);
  // Выключаем светодиод LED1:
  digitalWrite(LED1,0);
  // Снова начинаем запись:
  startWatching();
}, BTN, {repeat:true, edge:"rising", debounce:50});

Отправьте этот код на Espruino, а затем понажимайте на кнопки на пульте управления. Затем вы можете нажать на кнопку на самой Espruino, и те же самые команды будут воспроизведены ИК-передатчиком, подключенным к Espruino.

См.также

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