Вопрос удаленного или дистанционного управления электрооборудованием всегда был и будет актуальным, не зависимо от того имеется ли средства автоматизации в системе или нет. Для организации дистанционного управления совершенно неважно нужен ли микроконтроллер , все зависит от необходимых функций, возлагаемых на управляемое устройство. Из этой статьи вы узнаете общие сведения о способах дистанционного управления микроконтроллером.
Виды
Существует два основных вида дистанционной связи:
Проводной . Когда управление исполнительными механизмами, находящимися в одном помещении (или не помещении) ведется с диспетчерского пульта или с кнопочного поста расположенного в другом месте. В таком случае обеспечивается электрическое проводное соединение управляющих цепей и исполнительных устройств (реле, контакторов, которые включают механизмы, типа двигателей или системы, например, освещение).
Беспроводной . В этом варианте не требуется электрического соединения управляющих и исполнительных цепей. В беспроводной схем есть два устройства: передатчик или пульт дистанционного управления (ПДУ) и приемник, который входит в состав управляемой цепи. Беспроводное управление в свою очередь распространено в двух вариантах:
По оптическому сигналу. Такие системы есть в каждом доме, так вы управляете работой телевизора, кондиционера и другой бытовой техники.
По радиосигналу. Здесь уже целый ряд вариантов: 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(80function(conn)
conn:on(""receive""