Espruino:Примеры/Передача и прием ИК-сигнала с помощью Espruino Pico
Передача и прием ИК-сигнала с помощью Espruino Pico[1]
В этом руководстве мы подключим к Espruino Pico инфракрасный приёмник, чтобы получить сигналы от пульта дистанционного управления, записать их, а затем воспроизвести при нажатии на кнопку.
Более подробно о том, как работают сами пульты дистанционного управления, можно почитать в этой статье.
Нам понадобятся
- Плата Espruino Pico
- ИК-приёмник VS1838B
- Светодиод для передачи ИК-сигнала
- Макетная плата
Подсоединение
Тут всё просто. ИК-приёмнику нужно лишь 3.3-вольтовое питание и подтягивающий резистор (и всё это есть в самой Espruino). ИК-светодиод обычно подключается вместе с резистором, чтобы снизить энергопотребление, но мы будет подавать на ИК-светодиод импульсы с частотой 40 КГц, так что ничего страшного не произойдёт.
- Возьмите Espruino Pico и подключите её к макетной плате так, чтобы USB-коннектор смотрел влево.
- Воткните ИК-приёмник VS1838B в макетную плату под Pico так, чтобы нижняя чёрная часть смотрела в вашу сторону, а три его ножки были подключены к 3 самым правым нижним контактам Pico – B6, 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).
Итак, теперь давайте воспроизведём эти сигналы – делается это очень просто. Нам лишь надо «скормить» массив 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.
См.также
Внешние ссылки