Дистанционное управление на ИК-лучах (Arduino UNO)


Была поставлена задача сделать систему дистанционного управления на ИК-лучах, использующую готовый пульт ДУ, и позволяющую включать и выключать четыре нагрузки независимо друг от друга. При этом было необходимо, чтобы система не конфликтовала с имеющейся дома аппаратурой, то есть, аппаратура не должна реагировать на сигналы пульта этой системы, а система не должна реагировать на сигналы пульта аппаратуры.

Наиболее просто, с любой точки зрения, такую систему дистанционного управления можно сделать на основе микроконтроллерной платы ARDUINO UNO и инфракрасного пульта типа RC-5 (для старого телевизора «Горизонт»), Такой пульт был выбран потому, что протокол RC-5 применялся в телевизорах выпускавшихся лет 15-25 назад, и в современной аппаратуре используется крайне редко.

Это обеспечивает бесконфликтность между данной системой и имеющейся аппаратурой. К тому же, пульты RC-5 и сейчас имеются в продаже, и стоят очень недорого.

Принципиальная схема 

Схема дистанционного управления на ИК-лучах с применением Arduino UNO

Рис. 1. Схема дистанционного управления на ИК-лучах с применением Arduino UNO.

Использование недорогой готовой платы ARDUINO UNO интересно тем, что это готовый модуль, - небольшая печатная плата, на которой расположен микроконтроллер ATMEGA328, а так же вся его «обвязка», необходимая для его работы, включая USB-программатор и стабилизатор напряжения питания.

Принципиальная схема системы дистанционного управления показана на рис.1. Это, как уже сказано, система для управления четырьмя нагрузками, сигналы для управления которыми снимаются с цифровых портов D4, D5, D6, D7, и поступают на транзисторные ключи на VТ1-VТ4, в коллекторных цепях которых включены электромагнитные реле К1-К4, управляющие питанием нагрузок.

Впрочем, число объектов управления можно и увеличить. У платы ARDUINO UNO имеется 14 цифровых портов, от DO до D13, один из них, в данном случае, D2, используется для приема кодов команд от интегрального фотоприемника F1. Таким образом, остается 13 портов, то есть, максимальное число управляемых нагрузок -13.

Для приема сигналов пульта используется фотоприемник F1 типа TSOP4838, но можно применить и любой другой аналогичный.

В общем, по схеме все ясно, - код от фотоприемника поступает на порт D2, работающий на прием. Затем микроконтроллер декодирует код, и управляет нагрузками посредством каскадов на VТ1-VТ4 и реле К1-К4.

Программирование нужно будет производить в два этапа. Дело в том, что сначала нужно определиться с кнопками пульта. Здесь для управления используются кнопки 1-8, для первого варианта, в котором одной кнопкой производится включение соответствующей нагрузки, а другой выключение, или кнопки 1-4 для варианта, в котором каждая нагрузка управляется только одной кнопкой, - один сигнал включение, второй - выключение.

Вы же, можете использовать любые другие кнопки. И даже другой пульт, не обязательно RC-5, хотя здесь все написано относительно именно RC-5. И так, для определения кодов кнопок нужна программа, показанная в таблице 1.

Таблица 1. Программный код - определение кодов команд пульта.

Программный код - определение кодов команд пульта

/*

определение кодов команд пульта */

#include

IRrecv irrecv(2); // фотоприемник на порту D2

decode_results results;

void setup () {

Serial.begin(9600); // задание скорости порта COM

irrecv.enableIRIn(); // запуск приема команды

}

void loop () {

if (irrecv.decode(&results)) {

Serial.println(results.value, HEX); // вывод данных в COM

irrecv.resume(); // прием следующей команды

}

}

Данная программа требует загрузки библиотеки IRremote.h которая нужна для распознавания сигнала пульта ДУ. Эта библиотека есть в стандартном наборе программного обеспечения для ARDUINO, у меня версия Arduino 1.6.11.

После загрузки данной программы в микроконтроллер платы ARDUINO UNO нужно открыть монитор СОМ-порта, для этого в окне программы Arduino 1.6.11 выбираем «Инструменты» и из выпадающего меню «Монитор порта».

После того как откроется окошко Монитора порта, берем пульт ДУ и нажимаем интересные нам кнопки. В окне Монитора порта будет отображаться код, соответствующий каждой кнопке.

Кстати, «играясь» с кнопками пульта, я заметил, что в RC-5 каждой кнопке соответствует по два кода. Один при первом нажатии кнопки, и второй при втором И так, если одну кнопку все время нажимать, то код будет то один то другой.

Например, первое нажатие кнопки «1» дает код 56EF334B, а при втором нажатии этой же кнопки код уже C2D091BF.

Это обстоятельство мною потом было использовано во втором варианте системы ДУ, в котором каждая нагрузка управляется только одной кнопкой. И так, с кнопками определились.

Для первого варианта (управление каждой нагрузкой двумя кнопками - «вкл.» и «выкл ») я использовал кнопки от 1 до 8. Кнопки 1 и 2 служат для управления нагрузкой 1, кнопки 3 и 4 для нагрузки 2, кнопки 5 и 6 для нагрузки 3, и кнопки 7 и 8 для управления нагрузкой 4 Но, как уже сказано, можно использовать любые другие кнопки пульта, внеся соответствующие коды команд в программу.

Программа

Программа для управления каждой из четырех нагрузок двумя кнопками из числа 1-8 приведена в таблице 2.

Таблица 2. Программный код - управление двумя кнопками.

Программный код - управление двумя кнопками

/*

управление двумя кнопками */

#include

IRrecv irrecv(2); // фотоприемник на порту D2

decode_results results;

void setup () {

pinMode(4, OUTPUT); // задание порта D4 как выходного

pinMode(5, OUTPUT); // задание порта D5 как выходного

pinMode(6, OUTPUT); // задание порта D6 как выходного

pinMode(7, OUTPUT); // задание порта D7 как выходного

irrecv.enablelRIn(); // запуск приема команд

}

void loop() {

if (irrecv.decode(&results)) {

switch( results.value ) {

case 0x56EF334B:

digitalWrite( 4, HIGH); // кнопка 1 - единица на порту D4

break;

case 0x17313DCE:

digitalWrite( 4, LOW); // кнопка 2 - ноль на порту D4

break;

case 0xE4400B14:

digitalWrite( 5, HIGH); // кнопка 3 - единица на порту D5

break;

case 0x321579D4:

digitalWrite( 5, LOW); // кнопка 4 - ноль на порту D5

break;

case 0x33157B67:

digitalWrite( 6, HIGH); // кнопка 5 - единица на порту D6

break;

case 0XA41CE90D:

digitalWrite( 6, LOW); // кнопка б - ноль на порту D6

break;

case 0xFE084450:

digitalWrite( 7, HIGH); // кнопка 7 - единица на порту D7

break;

case 0x1DDBEF8C:

digitalWrite( 7, LOW); // кнопка 8 - ноль на порту D7

break;

}

irrecv.resume () ;

}

}

В программе после «case 0х» записаны коды команд, которые формируется при нажатии соответствующей кнопки. Коды, как уже сказано выше, определены при помощи «Монитора порта».

Если используются другие кнопки, или другой пульт, который дает другие коды команд, то должны быть записаны соответствующие коды, определенные экспериментальным путем при помощи «Монитора порта».

После загрузки программы из таблицы 2 в микроконтроллер платы ARDUINO UNO, мы получаем блок дистанционного управления четырьмя нагрузками, которые можно включать и выключать независимо друг от друга. Каждой нагрузкой управляют две кнопки:

  • кнопка 1 - включение нагрузки 1;
  • кнопка 2 - выключение нагрузки 1;
  • кнопка 3 - включение нагрузки 2;
  • кнопка 4 - выключение нагрузки 2;
  • кнопка 5 - включение нагрузки 3;
  • кнопка 6 - выключение нагрузки 3;
  • кнопка 7 - включение нагрузки 4;
  • кнопка 8 - выключение нагрузки 4.

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

Причем, одни команды срабатывают с первого нажатия, другие со второго. Причина этого в том, что пульт RC-5 генерирует по две команды для каждой кнопки, как уже было сказано выше.

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

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

case 0x56EF334B:

digitalWrite( 4, HIGH);

break;

case 0xC2D091BF:

digitalWrite( 4, HIGH);

break;

case 0x17313DCE:

digitalWrite( 4, LOW);

break;

case 0x528A5222:

digitalWrite( 4, LOW);

break;

To есть, для каждой кнопки пишем по два командных шага, один с одним кодом, другой с другим. В данном случае, согласно показаниям «Монитора порта», кнопке 1 соответствует два кода - 56EF334B и C2D091BF, а кнопке 2 - коды 17313DCE и 528А5222. Эти пары кодов записаны в программе как две отдельные команды, дающие один и тот же результат.

Если так записать всю программу, то управление нагрузками будет осуществляться однократным нажатием каждой кнопки, а не двухкратным. Хочу заметить, что это касается именно пульта RC-5, потому что пульт какого-то другого протокола может давать по одной команде на кнопку. Но это всегда можно проверить экспериментально при помощи «Монитора порта».

Второй вариант использует ту же самую схему (рис.1), но немного другую программу, которая позволяет каждой нагрузкой управлять при помощи одной кнопки, а не двух, как в первом варианте. Здесь используется то, что пульт RC-5 генерирует по два кода для каждой кнопки, чередуя их при каждом нажатии.

Эта программа приведена в таблице 3. После загрузки программы из таблицы 3 в микроконтроллер платы ARDUINO UNO, мы получаем блок дистанционного управления четырьмя нагрузками, которые

Таблица 3. Программный код - управление одной кнопкой.

Программный код - управление одной кнопкой

/*

управление одной кнопкой */

#include

IRrecv irrecv(2); // фотоприемник на порту D2 decode_results results;

void setup() {

pinMode(4, OUTPUT); // задание порта D4 как выходного

pinMode(5, OUTPUT); // задание порта D5 как выходного

pinMode(6, OUTPUT); // задание порта D6 как выходного

pinMode(7, OUTPUT); // задание порта D7 как выходного irrecv.enablelRIn(); // запуск приема команд

}

void loop () {

if (irrecv.decode(&results)) {

switch( results.value )(

case 0x56EF334B:

digitalWrite( 4, HIGH); // кнопка 1 - единица на порту D4

break;

case 0xC2D091BF:

digitalWrite( 4, LOW); // кнопка 1 - ноль на порту D4

break;

case 0x17313DCE:

digitalWrite( 5, HIGH); // кнопка 2 - единица на порту D5

break;

case 0x528A5222:

digitalWrite( 5, LOW); // кнопка 2 - ноль на порту D5

break;

case 0xE4400B14:

digitalWrite( 6, HIGH); // кнопка 3 - единица на порту D6

break;

case 0x50216988:

digitalWrite( 6, LOW); // кнопка 3 - ноль на порту D6

break;

case 0x321579D4:

digitalWrite( 7, HIGH); // кнопка 4 - единица на порту D7

break;

case 0x6D6E8E28:

digitalWrite( 7, LOW); // кнопка 4 - ноль на порту D7

break;

}

irrecv.resume();

}

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

  • кнопка 1 - включ. / выключ. нагрузки 1;
  • кнопка 2 - включ. / выключ. нагрузки 2;
  • кнопка 3 - включ. / выключ. нагрузки 3;
  • кнопка 4 - включ. / выключ. нагрузки 4.

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

«Ради спортивного интереса» мною были проверены с помощью «Монитора порта» все имеющиеся в доме пульты дистанционного управления. Так вот, каждой кнопке по два кода генерировал только пульт RC-5.

Все остальные, более современные пульты, а именно, пульт от спутникового ресивера, от музыкального центра, от плазменного телевизора, от DVD-плеера, генерировали только по одному коду на кнопку (либо код кнопки при её нажатии, и код FFFFFFFF при отпускании любой кнопки).

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

Но с программой из таблицы 3 (управление нагрузкой одной кнопкой) эти пульты работать не будут, для неё годится только пульт RC-5.

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

Если Вы еще не знакомы с ARDUINO UNO, почитайте статью Л.1, там написано все подробно на примере переключателя для ёлочной гирлянды. Описывается установка программы Arduino 1.6.11, и дана пошаговая инструкция как работать с ней.

Каравкин В. РК-10-2019.

Литература: 1. Каравкин В. Ёлочная гирлянда на ARDUINO как средство от боязни микроконтроллеров. РК-11-2016.


0 535 На микроконтроллерах
микроконтроллер arduino дистанционное управление ИК-лучи
Оставить комментарий:

cashback