Дистанционное управление микроконтроллером: ИК-пульт, 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.
Есть и более интересный вариант, платы NodeMCU, в них есть возможность прошивки по USB, т.к. USB-UART преобразователь уже есть на плате, обычно выполнен на микросхеме CP2102. Node MCU – это прошивка, что-то вроде операционной системы, проект на основе скриптового языка Lua.
Прошивка может выполнять скрипты Lua, как принимая их по последовательному порту или воспроизводя алгоритмы, сохраненные во Flash-памяти.
Кстати в ней есть своя файловая система, правда в ней нет каталогов, т.е. только файлы без папок. В памяти могут храниться в не только скрипты, но и различные данные, т.е. плата может хранить записанную, например, с датчиков, информацию.
Плата работает с интерфейсами:
-
1-Wire;
-
I2C;
-
SPI;
-
UART.
В ней есть целая масса функций:
-
модуль шифрования;
-
планировщик задач;
-
часы реального времени;
-
протокол синхронизации часов через интернет SNTP;
-
таймеры;
-
АЦП канал (один);
-
проигрывать аудио файлы;
-
формировать на выходах ШИМ-сигнал (до 6);
-
использовать сокеты, есть поддержка FatFS, т.е можно подключать SD-карточки и так далее.
А вот краткий список, с чем может работать плата:
-
акселерометры 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.
Рассмотрение всех функций и особенностей этой платы займет целый цикл статей.
Так вот эта плата – это отличный вариант дистанционного управления по Wi-Fi. Сфера применения колоссальная, например использовать смартфон в качестве пульта управления для самодельной радиоуправляемой машинки или квадрокоптера, дистанционное управление освещением, вплоть до обустройства сетей на весь дом и управлять каждой розеткой, светильником и т.д. лишь бы пинов хватило.
Простейший вариант работы с микроконтроллером – это использование одной платы ESP8266. Ниже приведена схема простейшей 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(80, function(conn)
conn:on("receive", receive_http)
end)
end
print("Started.")
Теперь вы можете управлять программой либо с программы Roboremo, либо через любой веб-браузер, для этого нужно набрать ip-адрес платы в адресной строке в режиме wi-fi точки он 192.168.4.1.
В коде есть фрагмент:
"<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>"
Это своеобразный ответ, который выдаётся браузеру при обращении к плате. Он содержит HTML-код, т.е. простейшую WEB-страницу, аналогичную той, на которой вы сейчас читаете эту статью.
Вот эта страница, запущенная в браузере смартфона под управлением ОС Android. Описанное выше не является полноценной инструкцией, так как это заняло бы огромный объём, если вам интересна эта информация – пишите комментарии и мы обязательно проведем обзор и напишем статью о работе с ней.
Алексей Бартош
Популярные публикации:
- 10 интересных проектов для Ардуино
- Схемы датчиков движения и принцип их работы, схемы подключения
- Управление двигателями и сервоприводами с помощью Ардуино
Надеюсь, что эта статья была для вас полезной. Смотрите также другие статьи в категории Устройства автоматики, Схемы на микроконтроллерах
Подпишитесь на наш канал в Телеграм «Автоматика и робототехника» (современные технологиии, инновации и будущее автоматизации). Нажмите на ссылку ниже и будьте в центре событий в мире автоматики: Автоматика и робототехника