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

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

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


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

Виды

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

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

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

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

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

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

ИК-пульт

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

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

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

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

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


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

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

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

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

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

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


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

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

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

  • DVD-плееров;

  • магнитол;

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


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

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


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

Чтобы микроконтроллер, в нашем случае Ардуина, поняла сигнал с датчика нужно использовать библиотеку 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(); // принимаем следующую команду

  }

}

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


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

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

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

#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 мГц, могут быть и другие частоты, зависит от конкретной платы, но эти наиболее распространены. Система состоит из двух узлов – приемника и передатчика, что логично.


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

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

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


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

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


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

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


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

Устройство

Модуль

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

Приемник

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) висит прерывание с номером ноль. Это увидеть вы можете в распиновке Атмеги применимой к плате ардуино, в розовых квадратиках написаны номера пинов.


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

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

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

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

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


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

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


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

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

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

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

  • 1-Wire;

  • I2C;

  • SPI;

  • UART.

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

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

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

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

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

  • таймеры; 

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

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

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

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


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

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

  • акселерометры 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, ESP8266, 433 мГц

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

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

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


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

Для сборки этой цепи потребуется модуль реле, или обычное реле подключенное к пину через транзистор. Для начала потребуется программа для смартфона 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-страницу, аналогичную той, на которой вы сейчас читаете эту статью.


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

Вот эта страница, запущенная в браузере смартфона под управлением ОС Android. Описанное выше не является полноценной инструкцией, так как это заняло бы огромный объём, если вам интересна эта информация – пишите комментарии и мы обязательно проведем обзор и напишем статью о работе с ней.

Алексей Бартош

Источник

Смотрите также

Как определить неисправность тиристоров

Потеря работоспособности тиристоров может наступить вследствии: а) обрыва цепи внутри прибора (сгорание); б) утраты управляемости …