Дистанционное управление микроконтроллером: ИК-пульт, Arduino, ESP8266, 433 мГц

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

Дистанционное управление микроконтроллером

Виды

Существует два основных вида дистанционной связи:

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

Беспроводной . В этом варианте не требуется электрического соединения управляющих и исполнительных цепей. В беспроводной схем есть два устройства: передатчик или пульт дистанционного управления (ПДУ) и приемник, который входит в состав управляемой цепи. Беспроводное управление в свою очередь распространено в двух вариантах:

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

  • По радиосигналу. Здесь уже целый ряд вариантов: Bluetooth, ZigBee, Wi-Fi, приемники-передатчики 433 мГц и другие вариации на эту тему.

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

ИК-пульт

Начнем рассмотрение с самого простого и классического варианта. Управление устройством путем передачи кода из последовательности мерцаний ИК-светодиода в оптоприемник, установленный на устройстве. Стоит отметить, что ИК-спектр не видим для человеческого глаза, но его видит большинство фото-видео камер.

Раз уж большинство камер видит ИК-излучение, так вы можете проверять исправность пультов дистанционного управления . Для этого просто направьте пульт так, чтобы излучатель смотрел в камеру и понажимайте кнопки. Обычно на экране видно белое свечение с фиолетовым отливом.

У такого управления есть очевидный недостаток – вы должны направлять пульт в сторону приемника. А если батарейки в пульте севшие, то приходится еще и целится, так как срабатывания становятся всё реже и реже.

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

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

ИК-датчик

Вот характеристики одного из ИК-датчиков:

  • несущая частота: 38 кГц;

  • напряжение питания: 2,7 — 5,5 В;

  • потребляемый ток: 50 мкА.

И схема его подключения:

Схема подключения ик-датчика

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

  • телевизоров;

  • DVD-плееров;

  • магнитол;

  • от современных осветительных приборов, типа умных люстр и светодиодных лент и прочее.

Пульт управления

Вот пример использования такого датчика с Arduino :

Пример использования ИК-датчика с ардуино

Чтобы микроконтроллер, в нашем случае Ардуина, поняла сигнал с датчика нужно использовать библиотеку IRremote.h. Для примера того, как читать сигнал с датчика приведем код для их распознавания через чтение последовательного порта микроконтроллера из среды Arduino IDE:

#include "IRremote.h" // подключаем библиотеку для работы с ИК сигналом.

IRrecv irrecv(2); // указываем вывод, к которому подключен приемник

decode_results results;

void setup() {

Serial.begin(9600); // выставляем скорость COM порта

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

}

void loop() {

if ( irrecv.decode( &results )) { // если данные пришли

Serial.println( results.value, HEX ); // печатаем данные

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

}

}

В результате, когда вы прошьете ардуинку, и начнете «светить» в приемник пультом, в мониторе последовательного порта мы увидим следующую картинку:

Монитор последовательного порта

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

А с помощью такого кода можно распознавать сигналы и управлять нагрузкой:

#include "IRremote.h"

IRrecv irrecv(2); // указываем вывод, к которому подключен приемник

decode_results results;

void setup() {

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

}

void loop() {

if ( irrecv.decode( &results )) { // если данные пришли

switch ( results.value ) {

case 0xFFA857:

digitalWrite( 13, HIGH );

break;

case 0xFFE01F:

digitalWrite( 13, LOW );

break;

}

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

}

}

Основным в коде является распознавание через функцию Switch, иногда их называют «свитчкейс». Она является аналогом ветвлений if, но имеет более красивую форму для восприятия. Case – это варианты, «если пришёл такой код, то…» В коде управляют 13 пином при определенных сигналах. Напомню, что к 13 пину подключен встроенный светодиод на плате АРДУИНО, т.е. автор кода управлял светодиодом.

Вы можете управлять чем угодно, используя высокий или низкий уровень цифрового пина, через силовой транзистор (которые мы рассмотрели в двух статьях ранее здесь и здесь ) нагрузкой постоянного тока, или через симистор и драйвер для него нагрузкой постоянного тока, можно также применять реле и контакторы, в общем, целое поле для воображения.

Радиосигнал прием и передача

Для использования с микроконтроллерами распространены передатчики с рабочими частотами 433 мГц или 315 мГц, могут быть и другие частоты, зависит от конкретной платы, но эти наиболее распространены. Система состоит из двух узлов – приемника и передатчика, что логично.

Радиосигнал прием и передача

На картинке передатчик изображен справа вверху, а слева снизу – приемник. Их название для поиска: Радиомодуль 433МГц, MX-05V/XD-RF-5V (приемник и передатчик) .

Распиновка, как это часто бывает в модулях, расписана на плате, вот как у передатчика:

Радиопередатчик

На приемнике не так очевидно, ведь Data на печатной плате написано над двумя пинами, по факту один из них не используется.

Приемник радиосигнала

Для примера приведем схему и код для включения светодиода с одной платы ардуино, подключенного к другой аналогичной плате, без проводов. Приемник и передатчик подключены одинаково в к обеим платам:

Приемник и передатчик на платах

Устройство

Модуль

Пины ардуино.

Приемник

VCC

GND

DATA

+5V

GND

2

Передатчик

VCC

GND

DATA

+5V

GND

2

Далее нужно в Arduino IDE подключить библиотеку RCswitch.h

(скачать её можно здесь https://github.com/sui77/rc-switch/archive/v2.52.zip )

Для начала напишем программу передатчика:

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch (); // создаем объект для работы с перед-ком

void setup() {

mySwitch . enableTransmit (2); // говорим программе к какому пину подключен информационный канал

}

void loop() {

mySwitch.send(B0100, 4);

delay(1000);

mySwitch.send(B1000, 4);

delay(1000);

}

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

mySwitch.send(B0100, 4);

и

mySwitch.send(B1000, 4);

это команды передачи, mySwitch – это название передатчика, которое мы указали в начале кода, а send – команда передачи. Аргументами этой функции являются:

имяПередатчика.send(значение, размер пачки импульсов отправляемых в эфир);

B1000 – символ B – значит двоичный, это можно было написать как цифру 8, т.е. в десятеричном представлении. Еще один вариант был записать в виде строки (в кавычках) «1000».

Далее напишем код для приемника (его прошивают в плату, к которой подключен приемник):

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {

pinMode( 3, OUTPUT );

mySwitch.enableReceive(0);

}

void loop() {

if( mySwitch.available() ){

int value = mySwitch.getReceivedValue();

if( value == B1000 )

digitalWrite( 3, HIGH );

else if( value == B0100 )

digitalWrite( 3, LOW );

mySwitch.resetAvailable();

}

}

Здесь мы объявляем, что в переменную Value сохраняется принятое значение в строке mySwitch.getReceivedValue(). А тот факт, что приемник подключен ко 2-му пину описываем здесь mySwiitch.enableReceive(0).

В остальном код элементарен, если принят сигнал 0100, то переводим пин номер 3 в высокое состояние (лог. единица), а если 1000, то в низкое (лог. ноль).

Интересно:

В строке mySwitch.enableTransmit(0) мы говорим программе, что ко 2-му пину подключен приемник и включается режим приема. Самые внимательные заметили, что аргументом этого метода является не номер пина «2», а «0», дело в том, что метод enableTransmit(число) принимает не номер пина, а номер прерывания, а в atmega328, которую ставят на Arduino Uno, nano, promini и ряд других , на втором пине (PortD пин PD2) висит прерывание с номером ноль. Это увидеть вы можете в распиновке Атмеги применимой к плате ардуино, в розовых квадратиках написаны номера пинов.

Распиновка Атмеги

Этот способ передачи и приема весьма прост и дешев, пара приемника и передатчика стоит на момент написания статьи примерно 1.5 доллара.

Wi-Fi, адруино и ESP8266

Начнем с того, что ESP8266 – это микроконтроллер с аппаратной поддержкой Wi-Fi , он продается как в виде отдельной микросхемы, так и распаян на плате, подобно ардуино. У него 32-битное ядро, он программируется через последовательный порт (UART).

На платах обычно расположено 2 и более свободных пина GPIO и всегда есть пины для прошивки, это нужно делать через USB to serial переходник. Управляется командами AT, полный список команд можно найти на официальном сайте ESP8266 и на github.

ESP8266

Есть и более интересный вариант, платы NodeMCU, в них есть возможность прошивки по USB, т.к. USB-UART преобразователь уже есть на плате, обычно выполнен на микросхеме CP2102. Node MCU – это прошивка, что-то вроде операционной системы, проект на основе скриптового языка Lua.

Плата NodeMCU

Прошивка может выполнять скрипты Lua, как принимая их по последовательному порту или воспроизводя алгоритмы, сохраненные во Flash-памяти.

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

Плата работает с интерфейсами:

  • 1-Wire;

  • I2C;

  • SPI;

  • UART.

В ней есть целая масса функций:

  • модуль шифрования;

  • планировщик задач;

  • часы реального времени;

  • протокол синхронизации часов через интернет SNTP;

  • таймеры;

  • АЦП канал (один);

  • проигрывать аудио файлы;

  • формировать на выходах ШИМ-сигнал (до 6);

  • использовать сокеты, есть поддержка FatFS, т.е можно подключать SD-карточки и так далее.

ESP-12E

А вот краткий список, с чем может работать плата:

  • акселерометры ADXL345;

  • магнитометры HMC5883L;

  • гироскопы L3G4200D;

  • датчики температуры и влажности AM2320, DHT11, DHT21, DHT22, DHT33, DHT44;

  • датчики температуры, влажности, атмосферного давления BME280;

  • датчики температуры, атмосферного давления BMP085;

  • множество дисплеев работающих по шинам I2C, SPI. С возможностью работы с разными шрифтами;

  • TFT дисплеи ILI9163, ILI9341, PCF8833, SEPS225, SSD1331, SSD1351, ST7735;

  • умные светодиоды и LED контроллеры – WS2812, tm1829, WS2801, WS2812.

Еще интересно то, что на сайте https://nodemcu-build.com/ можно самому собрать прошивку из нужных модулей, таким образом, вы сэкономите место, исключив из неё ненужные элементы, для своего полезного кода. И вы можете залить эту прошивку на любую плату ESP8266.

Кроме использования языка Lua вы можете программировать плату и из под Arduino IDE.

Плата ESP8266 может использоваться как самостоятельное устройство, так и модуль для беспроводной связи с Arduino.

Модуль для беспроводной связи с Arduino

Рассмотрение всех функций и особенностей этой платы займет целый цикл статей.

Так вот эта плата – это отличный вариант дистанционного управления по Wi-Fi. Сфера применения колоссальная, например использовать смартфон в качестве пульта управления для самодельной радиоуправляемой машинки или квадрокоптера, дистанционное управление освещением , вплоть до обустройства сетей на весь дом и управлять каждой розеткой, светильником и т.д. лишь бы пинов хватило.

Простейший вариант работы с микроконтроллером – это использование одной платы ESP8266. Ниже приведена схема простейшей wi-fi розетки.

Схема простейшей wi-fi розетки

Для сборки этой цепи потребуется модуль реле, или обычное реле подключенное к пину через транзистор. Для начала потребуется программа для смартфона RoboRemoFree, ( https://www.roboremo.com/ ). В ней вы настроите подключение к ESP и сделаете интерфейс для управления розеткой. Чтобы описать, как ей пользоваться нужно написать отдельную статью, поэтому опустим пока этот материал.

В ESP загружаем следующую прошивку, через программу ESPlorer (программа для работы с платой)

--WiFi AP Settup

wifi.setmode(wifi.STATIONAP)

cfg={}

cfg.ssid="ESPTEST"

cfg.pwd="1234567890"

wifi.ap.config(cfg)

--Set Pin mode

my_pin_nummber = 1

--gpio.mode(my_pin_nummber, gpio.OUTPUT)

gpio.mode(my_pin_nummber, gpio.OPENDRAIN)

--Create Server

sv=net.createServer(net.TCP)

function receiver(sck, data)

if string.sub (data, 0, 1) == "1" then

--gpio.write(my_pin_nummber, gpio.HIGH)

gpio.write(my_pin_nummber, gpio.LOW)

else

if string.sub (data, 0, 1) == "0" then

--gpio.write(my_pin_nummber, gpio.LOW)

gpio.write(my_pin_nummber, gpio.HIGH)

end

end

print(data)

end

if sv then

sv:listen(333, function(conn)

conn:on("receive", receiver)

conn:send("Hello!")

end)

end

--Create HTTP Server

http=net.createServer(net.TCP)

function receive_http(sck, data)

print(data)

local request = string.match(data,"([^r,n]*)[r,n]",1)

if request == 'GET /on HTTP/1.1' then

--gpio.write(my_pin_nummber, gpio.HIGH)

gpio.write(my_pin_nummber, gpio.LOW)

end

if request == 'GET /off HTTP/1.1' then

--gpio.write(my_pin_nummber, gpio.LOW)

gpio.write(my_pin_nummber, gpio.HIGH)

end

sck:on("sent", function(sck) sck:close() collectgarbage() end)

local response = "HTTP/1.0 200 OKrnServer: NodeMCU on ESP8266rnContent-Type: text/htmlrnrn"..

"<html><title>NodeMCU on ESP8266</title><body>"..

"<h1>NodeMCU on ESP8266</h1>"..

"<hr>"..

"<a href="on"">On</a> <a href=""off"">Off</a>""..

""</body></html>""

sck:send(response)

end

if http then

http:listen(80function(conn)

conn:on(""receive""

EnglishRussianUkrainian