Arduino 433 MHz vysílač + přijímač je dvojice bezdrátových modulů, které umožňují komunikaci na vzdálenost až 200 metrů na volném prostranství. Jak vyplývá z jejich názvu, komunikace probíhá v povoleném pásmu 433 MHz a teoreticky lze dosáhnout rychlosti až 10 Kbps, tedy 10000 bitů za sekundu. Co se týká napájecího napětí, pro přijímač je doporučená hodnota 5 V a pro vysílač je možné použít napětí až 12 V. Pro testování na krátké vzdálenosti (například po bytě) lze však celkem bez problémů použít taktéž 5 V pro vysílač, tedy napájení z Arduino desky. Pokud ale chceme komunikovat na delší vzdálenosti či se nacházíme v zarušeném prostředí, je nutné zvýšit napájecí napětí vysílače. Já jsem pro testování využil baterii pro RC modely s napájecím napětím 7,4 V, kdy baterie napájela jak vysílač, tak celé Arduino přes pin VIN.
Pro úspěšné propojení s Arduinem je nutné použít dvě Arduino desky. První desku propojíme s vysílačem pomocí tří pinů, kdy zapojíme DATA na pin D8, VCC na 5 V a GND na zem Arduino. Druhou desku propojíme s přijímačem také pomocí tří pinů. Krajní pin VCC připojíme na 5 V, druhý a třetí pin spojíme s D7 a GND spojíme se zemí Arduina. Datové piny na obou deskách lze nahradit jiným volným pinem, avšak je nutné tuto volbu vždy provést i v programu.
Pro správnou funkci uvedených ukázkových kódů je nutné stáhnout a naimportovat knihovnu VirtualWire, návod jak na to je uveden zde. Ukázkový kód pro vysílač obsahuje na svém začátku připojení knihovny VirtualWire a dále v podprogramu setup nastavení typu bezdrátové komunikace, její rychlosti a datového pinu s připojeným vysílačem. V nekonečné smyčce loop je na začátku vytvořena proměnná zprava pro uložení textu, který bude odesílán a dále je uvedena ukázka načtení čísla s počtem sekund od připojení napájení Arduino desky a jeho převedením na text. Při odeslání je nejprve pro ukázku rozsvícena LED dioda na pinu 13, odeslána zpráva s textem v proměnné zprava, zhasnuta LED dioda a poté následuje pauza 100 milisekund. Po této pauze je stejným způsobem odeslán obsah proměnné casZnaky, která obsahuje čas od připojení napájení. Na konci programu se pak už nachází pouze pauza 900 milisekund pro celkovou periodu posílání dat přibližně 1 sekunda.
// 433 MHz vysílač // připojení knihovny #include <VirtualWire.h> void setup() { // nastavení typu bezdrátové komunikace vw_set_ptt_inverted(true); // nastavení čísla datového pinu pro vysílač vw_set_tx_pin(8); // nastavení rychlosti přenosu v bitech za sekundu vw_setup(1000); } void loop() { // vytvoření proměnných pro různé // druhy zpráv // proměnná zprava pro poslání textu const char *zprava = "Cas od zapnuti: "; // proměnná s načtením počtu sekund od // připojení napájení long cas = millis()/1000; // pracovní proměnná pro konverzi // čísla na text char znaky [128]; // příkazy pro konverzi čísla na text, // čas převedený na text je uložen do // proměnné casZnaky snprintf(znaky, sizeof(znaky), "%ld", cas); char *casZnaky = znaky; // rozsvícení LED diody při odesílání (nepovinné) digitalWrite(13, true); // odeslání textu v proměnné zprava vw_send((uint8_t *)zprava, strlen(zprava)); // vyčkání na odeslání celé zprávy vw_wait_tx(); // zhasnutí LED diody při odeslání (nepovinné) digitalWrite(13, false); // pauza mezi posláním zpráv delay(100); // obdobný kus kódu, který opět rozsvítí LED // diodu, zašle obsah proměnné casZnaky // a po odeslání LED diodu zhasne digitalWrite(13, true); vw_send((uint8_t *)casZnaky, strlen(casZnaky)); vw_wait_tx(); digitalWrite(13, false); delay(900); }
Ukázkový kód pro přijímač obsahuje opět na začátku připojení knihovny VirtualWire a poté v podprogramu setup nejprve nastavení komunikace po sériové lince kvůli čtení přijatých dat. Následuje stejné nastavení typu bezdrátové komunikace, její rychlosti a pinu pro připojení přijímače. A jako poslední v tomto podprogramu je nastartována komunikace. V nekonečné smyčce loop je na začátku vždy vytvořena proměnná pro uložení zprávy a její délky. Pomocí funkce if se zeptáme, jestli není přijata nová zpráva a v případě, že ano, tak opět rozsvítíme pro demonstraci LED diodu na pinu 13 a poté pomocí for cyklu vytiskneme znak po znaku celou zprávu po sériové lince. Po vypsání zprávy už jen pomocí funkce Serial.println odřádkujeme zprávu a zhasneme LED diodu pro ukončení indikace přijaté zprávy.
// 433 MHz Přijímač // připojení knihovny #include <VirtualWire.h> void setup() { // inicializace komunikace po sériové lince Serial.begin(9600); // nastavení typu bezdrátové komunikace vw_set_ptt_inverted(true); // nastavení rychlosti přenosu v bitech za sekundu vw_setup(1000); // nastavení čísla datového pinu pro přijímač vw_set_rx_pin(7); // nastartování komunikace po nastaveném pinu vw_rx_start(); } void loop() { // vytvoření proměnných pro uložení // přijaté zprávy a její délky, // délka je maximálně 78 znaků uint8_t zprava[VW_MAX_MESSAGE_LEN]; uint8_t delkaZpravy = VW_MAX_MESSAGE_LEN; // v případě přijetí zprávy se vykoná tato if funkce if (vw_get_message(zprava, &delkaZpravy)) { // rozsvícení LED diody při příjmu (nepovinné) digitalWrite(13, true); // vytištění celé zprávy po znacích // pomocí for cyklu for (int i = 0; i < delkaZpravy; i++) { Serial.print((char)zprava[i]); } // ukončení vypsaného řádku pomocí println Serial.println(""); // zhasnutí LED diody při příjmu (nepovinné) digitalWrite(13, false); } }
Po nahrání programů do obou Arduino desek s připojeným vysílačem a přijímačem na kmitočtu 433 MHz dostaneme u desky s přijímačem například tento výpis:
Cas od zapnuti: 1 Cas od zapnuti: 2 Cas od zapnuti: 3 Cas od zapnuti: 4 Cas od zapnuti: 5
Arduino bezdrátové moduly vysílač a přijímač (typ přijímače XY-MK-5V, typ vysílače XY-FST) na frekvenci 433 MHz tvoří jednoduše použitelný set, který má několik výhod. Mezi tyto výhody patří například příznivá cena, jednoduchost zapojení či zajímavý maximální dosah. Je nutné ale také pamatovat na nevýhody, jako třeba snadné odposlouchání či zarušení vysílání. Pokud nám tyto skutečnosti ale příliš nevadí, hodí se tyto moduly jako bezdrátové spojení například pro domácí měřící stanice či ovladače. A pro zlepšení dosahu těchto modulů doporučuji zakoupit rovnou i specializované antény, protože obyčejný drát jsem musel použít příliš dlouhý a ani neměl tak dobrou účinnost. Zmíněné antény lze zakoupit na odkazu níže v seznamu komponent.
Seznam použitých komponent:
http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
http://dratek.cz/arduino/1003-arduino-433mhz-vysilac-prijimac-1427821401.html
http://dratek.cz/arduino-site-wifi-bt-rj45/1112-433mhz-spiralovita-antena.html