categorieën: Domotica, Microcontroller-circuits
Aantal keer bekeken: 17351
Reacties op het artikel: 0

Microcontroller-afstandsbediening: IR-afstandsbediening, Arduino, ESP8266, 433 MHz

 

Het probleem van het op afstand of op afstand bedienen van elektrische apparatuur is altijd relevant geweest, ongeacht of er automatiseringshulpmiddelen in het systeem aanwezig zijn of niet. Voor de organisatie van afstandsbediening maakt het helemaal niet uit of microcontroller, het hangt allemaal af van de benodigde functies die aan het beheerde apparaat zijn toegewezen. In dit artikel leert u algemene informatie over afstandsbedieningsmethoden voor een microcontroller.

Microcontroller afstandsbediening

types

Er zijn twee hoofdtypen communicatie op afstand:


bedraad. Wanneer de bediening van actuatoren in een kamer (of niet de kamer) wordt uitgevoerd vanaf het bedieningspaneel of vanaf een knop op een andere plaats. In dit geval wordt voorzien in een elektrische draadverbinding van de besturingsschakelingen en actuatoren (relais, contactors, die mechanismen omvatten, zoals motoren of systemen, bijvoorbeeld verlichting).


draadloze. In deze uitvoeringsvorm is geen elektrische verbinding van de besturings- en uitvoeringsschakelingen vereist. In draadloze circuits zijn er twee apparaten: een zender of een afstandsbediening (RC) en een ontvanger, die deel uitmaakt van het gecontroleerde circuit. Draadloze bediening is op zijn beurt gebruikelijk in twee versies:

  • Door optisch signaal. Dergelijke systemen bevinden zich in elk huis, zodat u de bediening van de tv, airconditioning en andere huishoudelijke apparaten kunt bedienen.

  • Via radiosignaal. Er zijn al een aantal opties: Bluetooth, ZigBee, Wi-Fi, 433 MHz zender-ontvangers en andere variaties op dit onderwerp.

Het is vermeldenswaard dat u met moderne technische middelen de microcontroller kunt bedienen, zowel vanaf de afstandsbediening als via internet op een lokaal netwerk of met toegang vanaf elke plek ter wereld.



IR afstandsbediening

We beginnen onze overweging met de eenvoudigste en meest klassieke versie. Apparaatbesturing door een code te verzenden van de flikkervolgorde van de IR-LED naar de optische ontvanger die op het apparaat is geïnstalleerd. Het is vermeldenswaard dat het infraroodspectrum niet zichtbaar is voor het menselijk oog, maar de meeste foto- en videocamera's zien het.

Omdat de meeste camera's infrarood zien, kunt u dit controleren onderhoud van afstandsbedieningen. Richt hiervoor gewoon de afstandsbediening zodat de zender in de camera kijkt en druk op de knoppen. Gewoonlijk is een witte gloed met een paarse tint zichtbaar op het scherm.

Deze bediening heeft een duidelijk nadeel - u moet de afstandsbediening op de ontvanger richten. En als de batterijen in de afstandsbediening leeg zijn, moet u ook richten, omdat de bediening steeds minder wordt.

Voordelen zijn eenvoud, hoge onderhoudbaarheid, zowel de zender als de ontvanger. U kunt de details vinden door de kapotte afstandsbedieningen en televisies te demonteren om dit in uw eigen projecten toe te passen.

Een typische sensor is als volgt. Omdat het optische signaal wordt ontvangen, is het noodzakelijk om triggering van externe lichtbronnen zoals de zon, verlichtingslampen en andere uit te sluiten. Het is ook vermeldenswaard dat het infraroodsignaal hoofdzakelijk wordt ontvangen met een frequentie van 38 kHz.

IR sensor

Hier zijn de specificaties van een van de IR-sensoren:

  • draaggolffrequentie: 38 kHz;

  • voedingsspanning: 2,7 - 5,5 V;

  • stroomverbruik: 50 μA.

En het verbindingsdiagram:

Aansluitschema IR-sensor

De afstandsbediening kan worden gebruikt door iedereen met een vergelijkbaar werkingsprincipe, afstandsbedieningen van:

  • televisies;

  • Dvd-spelers

  • radio bandrecorders;

  • van moderne verlichtingsapparaten, zoals slimme kroonluchters en LED-strips en meer.

Configuratiescherm

Hier is een voorbeeld van het gebruik van een dergelijke sensor met Arduino

Arduino IR Sensor Voorbeeld

Om de microcontroller, in ons geval Arduin, het signaal van de sensor te laten begrijpen, moet u de IRremote.h-bibliotheek gebruiken. Voor een voorbeeld van het lezen van een signaal van een sensor, volgt hier een code om ze te herkennen door de seriële poort van de microcontroller van de Arduino IDE te lezen:

# include "IRremote.h" // verbind de bibliotheek om met het IR-signaal te werken.

IRrecv irrecv (2); // geeft de uitgang aan waarop de ontvanger is aangesloten

decode_resultaten resultaten;

void setup () {

Serieel begin (9600); // stel de snelheid van de COM-poort in

irrecv.enableIRIn (); // start de receptie

}

void loop () {

if (irrecv.decode (& results)) {// if the data kwam

Serial.println (results.value, HEX); // print gegevens

irrecv.resume (); // accepteer de volgende opdracht

  }

}

Als u de Arduino flitst en met de afstandsbediening in de ontvanger begint te 'schijnen', zien we de volgende afbeelding in de seriële poortmonitor:

Seriële poortmonitor

Dit zijn codes die knoppen in hexadecimale vorm verzenden. U kunt dus achterhalen welke knop op de afstandsbediening welke code verzendt, dus er zijn geen specifieke vereisten voor de gebruikte afstandsbediening, omdat u deze kunt herkennen en koppelen. Overigens is dit een idee voor een project van een getrainde universele afstandsbediening, die eerder werden verkocht. Maar nu in het tijdperk van internet, neemt de hoeveelheid technologie die op deze manier wordt bestuurd elk jaar af.

En met deze code kunt u signalen herkennen en de belasting beheren:

#include "IRremote.h"

IRrecv irrecv (2); // geeft de uitgang aan waarop de ontvanger is aangesloten

decode_resultaten resultaten;

void setup () {

irrecv.enableIRIn (); // start de receptie

}

void loop () {

if (irrecv.decode (& results)) {// if the data kwam

schakelaar (results.value) {

case 0xFFA857:

digitalWrite (13, HOOG);

break;

case 0xFFE01F:

digitalWrite (13, LAAG);

break;

    }   

irrecv.resume (); // accepteer de volgende opdracht

  }

}

Het belangrijkste in de code is herkenning door de Switch-functie, soms worden ze een "schakelkast" genoemd. Het is een analoog van de if-takken, maar heeft een mooiere vorm voor waarneming. Geval - dit zijn de opties, "als een dergelijke code aankomt, dan ..." De code bestuurt 13 pins voor bepaalde signalen. Laat me je eraan herinneren dat de ingebouwde LED op de ARDUINO-kaart is aangesloten op pin 13, d.w.z. de auteur van de code controleerde de LED.

Je kunt alles bedienen met een hoge of lage digitale pin via een vermogenstransistor (waarover we eerder in twee artikelen hebben gesproken) hier en hier) met een gelijkstroombelasting, of via een triac en een driver ervoor met een gelijkstroombelasting, kunt u ook relais en magneetschakelaars gebruiken, in het algemeen een heel veld voor verbeelding.


Ontvangst en verzending van radiosignalen

Voor gebruik met microcontrollers zijn zenders met werkfrequenties van 433 MHz of 315 MHz gebruikelijk, er kunnen andere frequenties zijn, afhankelijk van de specifieke kaart, maar deze zijn de meest voorkomende. Het systeem bestaat uit twee knooppunten - een ontvanger en een zender, wat logisch is.

Ontvangst en verzending van radiosignalen

In de afbeelding wordt de zender rechtsboven weergegeven en de ontvanger linksonder. Hun naam voor de zoekopdracht: 433 MHz radiomodule, MX-05V / XD-RF-5V (ontvanger en zender).

De pinout is, zoals vaak het geval is in modules, op het bord geschilderd, net als de zender:

Radiozender

De ontvanger is niet zo voor de hand liggend, omdat gegevens op de printplaat over twee pinnen worden geschreven, in feite wordt één ervan niet gebruikt.

Radio-ontvanger

We geven bijvoorbeeld een diagram en een code voor het inschakelen van de LED van het ene Arduino-bord aangesloten op een ander vergelijkbaar bord, zonder kabels. De ontvanger en zender zijn op dezelfde manier verbonden met beide kaarten:

De ontvanger en zender op de borden

inrichting

module

Arduino pinnen

ontvanger

VCC

GND

DATA

+ 5V

GND

2

zender

VCC

GND

DATA

+ 5V

GND

2 

Vervolgens moet u de RCswitch.h-bibliotheek verbinden met de Arduino IDE

Om te beginnen schrijven we het zenderprogramma:

# include

RCSwitch mySwitch = RCSwitch(); // maak een object om met de front-end te werken

void setup () {

    mySwitch.enableTransmit(2); // vertel het programma met welke pin het informatiekanaal is verbonden

}

void loop () {

mySwitch.send (B0100,4);

vertraging (1000);

mySwitch.send (B1000, 4);

    vertraging (1000);

} 

De zender kan binaire code verzenden, maar de waarden kunnen in decimale vorm worden geschreven.

mySwitch.send (B0100,4);

en

mySwitch.send (B1000, 4);

dit zijn de overdrachtopdrachten, mySwitch is de naam van de zender die we aan het begin van de code hebben aangegeven en verzenden is de overdrachtopdracht. De argumenten voor deze functie zijn:

Transmitter name.send (waarde, pakketgrootte van pulsen die naar de lucht worden verzonden);

B1000 - het symbool B - betekent binair, het kan worden geschreven als het getal 8, d.w.z. in decimale notatie. Een andere optie was om “1000” te schrijven als een string (tussen aanhalingstekens).

Vervolgens schrijven we de code voor de ontvanger (deze wordt geflitst in het bord waarop de ontvanger is aangesloten):

# include

RCSwitch mySwitch = RCSwitch ();

void setup () {

pinMode (3, UITGANG);

mySwitch.enableReceive (0);

}

void loop () {

if (mySwitch.available ()) {

int value = mySwitch.getReceivedValue ();

if (waarde == B1000)

digitalWrite (3, HOOG);

anders if (waarde == B0100)

digitalWrite (3, LOW);

mySwitch.resetAvailable ();

    }

}

Hier verklaren we dat de geaccepteerde waarde is opgeslagen in de variabele Value in de tekenreeks mySwitch.getReceivedValue (). En het feit dat de ontvanger is verbonden met de 2e pin wordt hier beschreven door mySwiitch.enableReceive (0).

De rest van de code is elementair, als signaal 0100 wordt ontvangen, wordt pin nummer 3 ingesteld op hoog (log. Eenheid), en indien 1000, vervolgens op laag (log. Nul).

I wonder:

In de regel mySwitch.enableTransmit (0) vertellen we het programma dat de ontvanger is aangesloten op de 2e pin en dat de ontvangstmodus is ingeschakeld. De meest oplettende merkte op dat het argument van deze methode niet pincode “2” is, maar “0”, het feit is dat de methode enableTransmit (nummer) niet het pincode accepteert, maar het interruptnummer, maar in atmega328, die Arduino Uno, nano, promini en verschillende anderen, op de tweede pin (PortD pin PD2) hangt een interrupt met het cijfer nul. Je kunt dit zien in de Atmega-pinout die van toepassing is op het Arduino-bord, de pinnummers zijn geschreven in roze vakken.

Atmega pinout

Deze methode van verzenden en ontvangen is heel eenvoudig en goedkoop; een paar ontvanger en zender kost ongeveer $ 1,5 op het moment van schrijven.


Wi-Fi, Adruino en ESP8266

Om te beginnen ESP8266 is een microcontroller met hardware-ondersteuning voor Wi-Fi, Het wordt als een afzonderlijke chip verkocht en aan het bord gesoldeerd, als een Arduino. Het heeft een 32-bit kernel, het is geprogrammeerd via een seriële poort (UART).

De kaarten hebben meestal 2 of meer gratis GPIO-pinnen en er zijn altijd pinnen voor firmware, dit moet worden gedaan via een USB-naar-seriële adapter. Beheerd door AT-teams is een volledige lijst met opdrachten te vinden op de officiële ESP8266-website en op github.

ESP8266

Er is een interessantere optie, NodeMCU-kaarten, ze kunnen flashen via USB, omdat Er is al een USB-UART-converter op het bord, meestal gemaakt op een CP2102-chip. Node MCU is een firmware, zoiets als een besturingssysteem, een project op basis van de Lua-scripttaal.

NodeMCU-kaart

De firmware kan Lua-scripts uitvoeren, hetzij door ze te accepteren op een seriële poort, hetzij door algoritmen te reproduceren die zijn opgeslagen in het Flash-geheugen.

Trouwens, het heeft zijn eigen bestandssysteem, hoewel er geen mappen in zitten, d.w.z. alleen bestanden zonder mappen. In het geheugen kunnen niet alleen scripts worden opgeslagen, maar ook verschillende gegevens, d.w.z. het bord kan opgeslagen informatie opslaan, bijvoorbeeld van sensoren.

Het bord werkt met interfaces:

  • 1-Wire;

  • I2C;

  • SPI;

  • UART.

Het heeft een hele reeks functies:

  • coderingsmodule;

  • taakplanner;

  • real time klok;

  • kloksynchronisatieprotocol via internet SNTP;

  • timers;

  • ADC-kanaal (één);

  • audiobestanden afspelen;

  • aan de uitgangen een PWM-signaal genereren (maximaal 6);

  • gebruik sockets, er is ondersteuning voor FatFS, d.w.z. u kunt SD-kaarten aansluiten, enzovoort.

ESP-12E

En hier is een korte lijst van waarmee het bord kan werken:

  • versnellingsmeters ADXL345;

  • HMC5883L magnetometers

  • gyroscopen L3G4200D;

  • temperatuur- en vochtigheidssensoren AM2320, DHT11, DHT21, DHT22, DHT33, DHT44;

  • sensoren van temperatuur, vochtigheid, luchtdruk BME280;

  • temperatuur- en atmosferische druksensoren BMP085;

  • veel displays die werken op I2C, SPI-bussen. Met de mogelijkheid om met verschillende lettertypen te werken;

  • TFT toont ILI9163, ILI9341, PCF8833, SEPS225, SSD1331, SSD1351, ST7735;

  • slimme LED's en LED-controllers - WS2812, TM1829, WS2801, WS2812.

Naast het gebruik van de Lua-taal, kunt u het bord van onder de Arduino IDE programmeren.

ESP8266 kan worden gebruikt als een zelfstandig apparaat of als een module voor draadloze communicatie met Arduino.

Module voor draadloze communicatie met Arduino

Overweging van alle functies en kenmerken van dit bord zal een hele reeks artikelen bevatten.

Dus dit bord is een geweldige optie voor afstandsbediening via Wi-Fi. De reikwijdte is bijvoorbeeld enorm om een ​​smartphone te gebruiken als een bedieningspaneel voor een geïmproviseerde radiogestuurde machine of quadrocopter, afstandsbediening verlichting, tot het regelen van netwerken voor het hele huis en het beheer van elke outlet, lamp, etc. als er maar genoeg pinnen waren.

De eenvoudigste manier om met de microcontroller te werken, is door een enkele ESP8266-kaart te gebruiken. Hieronder ziet u een diagram van een eenvoudig wifi-stopcontact.

Schema van de eenvoudigste wifi-outlet

Om dit circuit te assembleren, hebt u een relaismodule nodig, of een conventioneel relais dat via een transistor op een pin is aangesloten. Eerst heb je een programma nodig voor een RoboRemoFree smartphone. Hierin configureert u de verbinding met de ESP en maakt u een interface voor het regelen van het stopcontact. Om te beschrijven hoe het te gebruiken, moet u een afzonderlijk artikel schrijven, dus laten we dit materiaal voorlopig weglaten.

In ESP laden we de volgende firmware, via het ESPlorer-programma (programma voor het werken met het bord)

--Wifi AP instellen

wifi.setmode (wifi.STATIONAP)

cfg = {}

cfg.ssid = "ESPTEST"

cfg.pwd = "1234567890"

wifi.ap.config (cfg)

- Stel de Pin-modus in

my_pin_nummber = 1

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

gpio.mode (my_pin_nummber, gpio.OPENDRAIN)

- Server maken

sv = net.createServer (net.TCP)

functie ontvanger (sck, data)

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

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

gpio.write (my_pin_nummber, gpio.LOW)

anders

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

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

gpio.write (my_pin_nummber, gpio.HIGH)

einde

einde

print (data)

einde

als sv dan

sv: luister (333, functie (conn)

conn: on ("ontvangen", ontvanger)

conn: send ("Hallo!")

end)

einde

- Maak een HTTP-server

http = net.createServer (net.TCP)

functie ontvang_http (sck, data)

print (data)

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

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

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

gpio.write (my_pin_nummber, gpio.LOW)

einde

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

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

gpio.write (my_pin_nummber, gpio.HIGH)

einde

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

local response = "HTTP / 1.0 200 OK \ r \ nServer: NodeMCU op ESP8266 \ r \ nInhoudstype: tekst / html \ r \ n \ r \ n" ..

" NodeMCU op ESP8266 " ..

"

NodeMCU op ESP8266

" ..

"


" ..

" Aan Uit " ...

" "

sck: send (antwoord)

einde

als http dan

http: luister (80, functie (conn)

conn: on ("ontvangen", ontvangen_http)

end)

einde

print ("Gestart.")

Nu kunt u het programma besturen vanuit het Roboremo-programma of via een webbrowser, hiervoor moet u het IP-adres van het bord in de adresbalk in de wifi-modus typen, het 192.168.4.1.

Er is een fragment in de code:

" NodeMCU op ESP8266 " ..

"

NodeMCU op ESP8266

" ..

"


" ..

" Aan Uit " ...

" "

Dit is een soort antwoord dat aan de browser wordt gegeven bij toegang tot het bord. Het bevat HTML-code, d.w.z. De eenvoudigste webpagina, vergelijkbaar met die waarop u dit artikel leest.

De pagina in de browser van de smartphone met Android OS

Hier is deze pagina, gelanceerd in de browser van een smartphone met Android OS. Het bovenstaande is geen volledige instructie, omdat het enorm veel zou kosten als je geïnteresseerd bent in deze informatie - schrijf commentaar en we zullen zeker een review uitvoeren en een artikel schrijven over het werken ermee.

Zie ook op bgv.electricianexp.com:

  • Arduino verbinden en programmeren voor beginners
  • Methoden voor het lezen en beheren van Arduino I / O-poorten
  • Wat zijn Nextion-displays en hoe ermee te werken?
  • Programmeerbare microcontrollers in JavaScript: welke te kiezen, kenmerken ...
  • Typen en opstelling van AVR-microcontrollers

  •