RSS
Как дистанционно управлять микроконтроллером с помощью ИК-пульт, 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 на печатной плате написано над двумя пинами, по факту один из них не используется.

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

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

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

#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. В ней вы настроите подключение к 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 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n"..

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

Ранее ЭлектроВести писали, что в США инженеры создали миниатюрного летающего робота, который получает энергию для полета из солнечной панели, освещаемой лазерным лучом. Благодаря этому он может летать без собственного источника энергии.

По материалам: electrik.info.