Espruino:Примеры/Передача и прием ИК-сигнала с помощью Espruino Pico: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Передача и прием ИК-сигнала с помощью Espruino Pico<ref>[https://www.espruino.com/Pico+Infrared www.espruino.com - Pico Infrared Transmit and Receive]</ref>= | ||
В этом руководстве мы подключим к [[Espruino Pico]] инфракрасный приёмник, чтобы получить сигналы от пульта дистанционного управления, записать их, а затем воспроизвести при нажатии на кнопку. | |||
'''Примечание:''' Если у вас нет ИК-приёмника, то не страшно – код [[Pronto Hex]] для вашего устройства можно найти в сети, а затем расшифровать его с помощью [https://www.espruino.com/pronto вот этой библиотеки]. | |||
Более подробно о том, как работают сами пульты дистанционного управления, можно почитать в [http://electronics.howstuffworks.com/remote-control.htm этой статье]. | |||
== Нам понадобятся == | |||
* Плата [https://www.espruino.com/Pico Espruino Pico] | |||
* [https://www.espruino.com/IRReceiver ИК-приёмник VS1838B] | |||
* Светодиод для передачи ИК-сигнала | |||
* [https://www.espruino.com/Breadboard Макетная плата] | |||
== Подсоединение == | |||
[Картинка] | |||
Тут всё просто. ИК-приёмнику нужно лишь 3.3-вольтовое питание и подтягивающий резистор (и всё это есть в самой [[Espruino]]). [[ИК-светодиод]] обычно подключается вместе с резистором, чтобы снизить энергопотребление, но мы будет подавать на [[ИК-светодиод]] импульсы с частотой [[40 КГц]], так что ничего страшного не произойдёт. | |||
* Возьмите [[Espruino Pico]] и подключите её к макетной плате так, чтобы [[USB-коннектор]] смотрел влево. | |||
* Воткните [[ИК-приёмник]] [[VS1838B]] в макетную плату под [[Pico]] так, чтобы нижняя чёрная часть смотрела в вашу сторону, а три его ножки были подключены к 3 самым правым нижним контактам [[Pico]] – '''B6''', '''B7''' и '''B8'''. | |||
* Подключите [[ИК-светодиод]] к 2 самым правым верхним контактам [[Pico]] ('''A6''' и '''A5'''). Короткая ножка, находящаяся с плоской стороны – это катод, её нужно подключить к самому правому контакту. | |||
== Код для приёма сигнала == | |||
Сначала давайте возьмём [https://www.espruino.com/IRReceiver ИК-приёмник] и с его помощью попробуем принять команды от пульта дистанционного ИК-управления. | |||
Вставьте код ниже в правую часть [[Web IDE]] и кликните на кнопку загрузки кода. Код нужно вставить именно в правую часть, потому что в нём используется [https://www.espruino.com/Modules модуль], который нужно автоматически подгрузить из сети. | |||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
digitalWrite(B7, 0); // на контакте B7 задаем 0 вольт (GND) | |||
digitalWrite(A8, 1); // на контакте A8 задаём 3.3 вольта | |||
// Инициализируем ИК-приёмник: | |||
require("IRReceiver").connect(B6, function(code) { | |||
// Код прочтён! | |||
console.log(code); | |||
}); | |||
</syntaxhighlight> | |||
Теперь, если у вас есть пульт управления, наведите его на приёмник и понажимайте кнопки на нём. В результате в левой части [[Web IDE]] начнут появляться команды пульта. У каждой кнопки должен быть свой собственный код. Например, в моём случае получилось следующее: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
0100000000000010000011100011000111 | |||
1 | |||
100000000000010001011100001000111 | |||
1 | |||
100000000000010000101100010100111 | |||
1 | |||
1 | |||
100000000000010000011100011000111 | |||
1 | |||
100000000000010000011100011000111 | |||
1 | |||
100000000000010001011100001000111 | |||
1 | |||
</syntaxhighlight> | </syntaxhighlight> | ||
'''Примечание:''' Некоторые пульты управления имеют другой сигнальный паттерн и работать не будут. Если ваш пульт управления не работает, попробуйте какой-нибудь другой. | |||
Нажмите на кнопку на пульте и скопируйте куда-нибудь код, который появился в консоли после её нажатия. Потом сделайте то же самое с другой кнопкой. Затем вставьте оба этих кода в код ниже, заменив те, что там уже есть: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
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); | |||
}); | |||
</syntaxhighlight> | |||
Отправьте этот код на [[Espruino]]. В результате вы сможете включать и выключать [[светодиод]] '''LED1''' на плате, используя две кнопки на пульте управления, коды которых вставлены в программный код. | |||
Кроме того, мы можем добавить еще больше операторов [[if]], чтобы с помощью пульта управлять и какими-то другими вещами, а не только [[светодиод]]ом. Вы можете поменять '''LED1''' на '''A8''' и подключить к контакту '''A8''' [https://www.espruino.com/Relays реле-модуль] – это позволит включать и выключать при помощи пульта управления практически что угодно. | |||
== Код для передачи сигнала == | |||
А что насчёт передачи сигнала? Для этого нам надо будет просто генерировать маленькие импульсы квадратного волнообразного сигнала частотой в [[38 КГц]] продолжительностью около 1 мс (продолжительность определяет, что отправляется – 0 или 1). Поскольку передатчик – это диод, мы можем генерировать квадратную [[38 КГц]] волну на одном контакте при помощи [[analogWrite()|analogWrite(A6,0.9,{freq:38000})]], а импульсы – на другом при помощи | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
digitalPulse(A5,...). | |||
</syntaxhighlight> | |||
Но то, что именно нужно передавать, зависит от модели пульта управления, а также от того, какие команды этот пульт передаёт. | |||
Но гораздо проще воспользоваться нашим [[ИК-приёмник]]ом, чтобы получить сигнал от пульта управления, а затем воспроизвести его. Для этого нам понадобится вот такой код: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
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}); | |||
</syntaxhighlight> | |||
Этот код сохраняет в массив '''times''' продолжительности всех импульсов, чтобы мы потом могли их посмотреть и использовать. | |||
Теперь наведите пульт управления на ИК-приёмник и нажмите на кнопку, а затем напишите '''times''' в левой части [[Web IDE]]. | |||
В итоге на дисплее должно отобразиться примерно следующее: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
=[ 8.10241699218, 4.11701202392, 0.45776367187, 0.55694580078, 0.45776367187, ... 0.45776367187, 44.54231262207, 8.10337066650, 2.07042694091, 0.46062469482 ] | |||
</syntaxhighlight> | |||
Это продолжительности импульсов (не все, а лишь их часть – [[Web IDE]] показывает не всё, чтобы не засорять экран), которые были сохранены в массив '''times'''. Если вы хотите показать вообще всё, вы всегда можете напечатать '''console.log(times)'''. | |||
'''Примечание:''' Это хороший пример того, насколько просто израсходовать всю память микроконтроллера. Напечатайте process.memory().free – это покажет, сколько свободных блоков памяти осталось у Espruino. Теперь несколько секунд понажимайте на пульте управления случайные кнопки и снова напечатайте process.memory().free – свободных блоков памяти станет гораздо меньше. Это происходит, потому что Espruino сохраняет данные в виде 64-битных значений с плавающей точкой, а также каждый раз индекс массива, когда на самом деле достаточно сохранить просто 8 бит. Эта проблема легко решается (см. [https://www.espruino.com/Performance эту статью]), но сейчас давайте просто сосредоточимся на выполнении нашей задачи, не ударяясь в оптимизацию. | |||
Итак, теперь давайте воспроизведём эти сигналы – делается это очень просто. Нам лишь надо ''«скормить»'' массив '''times''' функции [[digitalPulse()]]. Напишите в левой части [[Web IDE]] следующее: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
digitalPulse(LED1,1,times); | |||
</syntaxhighlight> | |||
Возможно, вы даже заметите мигание светодиода на пульте управления, потому что у некоторых пультов активность светодиода напрямую привязана к активности ИК-передатчика. | |||
Теперь давайте запишем и воспроизведём последовательность нажатий на кнопку. Вставьте код ниже в правую часть [[Web IDE]]: | |||
<syntaxhighlight lang="javascript" enclose="div"> | |||
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}); | |||
</syntaxhighlight> | |||
Отправьте этот код на [[Espruino]], а затем понажимайте на кнопки на пульте управления. Затем вы можете нажать на кнопку на самой [[Espruino]], и те же самые команды будут воспроизведены [[ИК-передатчик]]ом, подключенным к [[Espruino]]. | |||
=См.также= | =См.также= |
Версия от 17:48, 17 июля 2021
Передача и прием ИК-сигнала с помощью Espruino Pico[1]
В этом руководстве мы подключим к Espruino Pico инфракрасный приёмник, чтобы получить сигналы от пульта дистанционного управления, записать их, а затем воспроизвести при нажатии на кнопку.
Примечание: Если у вас нет ИК-приёмника, то не страшно – код Pronto Hex для вашего устройства можно найти в сети, а затем расшифровать его с помощью вот этой библиотеки.
Более подробно о том, как работают сами пульты дистанционного управления, можно почитать в этой статье.
Нам понадобятся
- Плата 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).
Примечание: Это хороший пример того, насколько просто израсходовать всю память микроконтроллера. Напечатайте 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.
См.также
Внешние ссылки