A következő Arduino projektedhez szeretnéd hozzáadni a vezeték nélküli képességeket, kevesebbért, mint egy csésze kávé ára? Nos, akkor a 433MHz-es RF adó és vevő modulok csak az Ön számára készültek! Gyakran kevesebb mint két dollárért szerezhetők be az interneten egy párért, így az egyik legolcsóbb adatkommunikációs lehetőség, amit kaphat. És ami a legjobb, hogy ezek a modulok szuper aprók, így szinte bármilyen projektbe beépíthet egy vezeték nélküli interfészt.
Hardverek áttekintése
Nézzük meg közelebbről a 433MHz-es RF adó- és vevőmodulokat.
Ez a kis modul egy adó kettő között. Tényleg olyan egyszerű, mint amilyennek látszik. A modul szíve a SAW rezonátor, amely 433,xx MHz-es működésre van hangolva. Van egy kapcsoló tranzisztor és néhány passzív alkatrész, ennyi.
Amikor a DATA bemenetre logikai HIGH kerül, az oszcillátor működik, amely egy állandó RF kimeneti vivőhullámot állít elő 433,xx MHz-en, és amikor a DATA bemenet logikai LOW-ra kerül, az oszcillátor leáll. Ezt a technikát Amplitude Shift Keying néven ismerjük, amelyet rövidesen részletesen tárgyalunk.
Ez egy vevőmodul. Bár összetettnek tűnik, ugyanolyan egyszerű, mint az adómodul. Egy RF-hangoló áramkörből és néhány OP-erősítőből áll, amelyek az adóból érkező vivőhullámot erősítik. Az erősített jelet tovább táplálják egy PLL-be (Phase Lock Loop), amely lehetővé teszi a dekóder számára, hogy “rögzítse” a digitális bitfolyamot, ami jobb dekódolt kimenetet és zajmentességet biztosít.
ASK – Amplitude Shift Keying
Amint azt fentebb említettük, a digitális adatok rádión keresztüli küldéséhez ezek a modulok az Amplitude Shift Keying vagy ASK nevű technikát használják. Az Amplitude Shift Keying során a vivőhullám (esetünkben ez egy 433 MHz-es jel) amplitúdója (azaz szintje) a bejövő adatjelre reagálva változik.
Ez nagyon hasonlít az amplitúdómoduláció analóg technikájához, amelyet ismerhet, ha ismeri az AM rádiót. Néha bináris amplitúdóeltolásnak is nevezik, mivel csak két szintről van szó. Úgy gondolhatsz rá, mint egy ON/OFF kapcsolóra.
- Digitális 1 esetén – Ez a vivőt teljes erővel hajtja.
- Digitális 0 esetén – Ez a vivőt teljesen kikapcsolja.
Így néz ki az amplitúdó moduláció:
Az amplitúdóeltolás előnye, hogy nagyon egyszerűen megvalósítható. A dekódoló áramkör megtervezése meglehetősen egyszerű. Az ASK-nak is kisebb sávszélességre van szüksége, mint más modulációs technikáknak, például az FSK-nak (Frequency Shift Keying). Ez az egyik oka annak, hogy olcsó.
A hátránya azonban az, hogy az ASK érzékeny más rádióeszközök és a háttérzaj interferenciájára. De mindaddig, amíg az adatátvitelt viszonylag lassú sebességen tartja, a legtöbb környezetben megbízhatóan működhet.
433MHz RF adó & vevő Pinout
Nézzük meg a 433MHz RF adó és vevő modulok pinoutját.
DATA pin fogadja a továbbítandó digitális adatokat.
VCC biztosítja az adó tápellátását. Ez lehet bármilyen pozitív egyenfeszültség 3,5V és 12V között. Vegye figyelembe, hogy az RF kimenet arányos a tápfeszültséggel, azaz minél magasabb a feszültség, annál nagyobb lesz a tartomány.
GND egy földelő pin.
Antenna egy pin a külső antenna számára. Amint azt korábban tárgyaltuk, a nagyobb hatótávolság érdekében egy 17,3 cm-es tömör drótot kell forrasztani erre a csapra.
VCC biztosítja a vevő tápellátását. Az adóval ellentétben a vevőkészülék tápfeszültségének 5 V-nak kell lennie.
DATA csapok adják ki a fogadott digitális adatokat. A két középső csap belsőleg össze van kötve, így bármelyiket használhatja az adatok kimenetére.
GND egy földelőcsap.
Antenna egy külső antenna számára szolgáló csap, amely gyakran jelöletlen. Ez a pad a modul bal alsó részén, közvetlenül a kis tekercs mellett. Ismét egy 17,3 cm-es darab tömör drótot kell forrasztani ehhez a csaphoz a jobb hatótávolság érdekében.
Huzalozás – 433MHz-es RF adó és vevő csatlakoztatása az Arduino UNO-hoz
Most, hogy mindent tudunk a modulokról, itt az ideje, hogy használatba vegyük őket!
Mivel két Arduino lap között fogunk adatokat küldeni, természetesen szükségünk lesz két Arduino lapra, két breadboardra és néhány jumper vezetékre.
Az adó kábelezése meglehetősen egyszerű. Mindössze három csatlakozója van. Csatlakoztassa a VCC csapot az 5V csaphoz és a GND-t az Arduino földhöz. A Data-In csapot az Arduino 12-es digitális csapjához kell csatlakoztatni. Meg kell próbálnia használni a 12-es tűt, mivel alapértelmezés szerint a könyvtár, amelyet a vázlatunkban használni fogunk, ezt a tűt használja adatbevitelre.
A következő ábra mutatja a vezetékezést.
Amikor az adót bekötötte, továbbléphet a vevőre. A vevő kábelezése ugyanolyan egyszerű, mint az adóé volt.
Még egyszer csak három csatlakozást kell elvégezni. Csatlakoztassa a VCC csapot az 5V csaphoz és a GND-t az Arduino földjéhez. A középső két Data-Out csap bármelyikét az Arduino 11. digitális csapjához kell csatlakoztatni.
Így kell kinéznie a vevő kábelezésének.
Most, hogy mind az adó, mind a vevő be van kábelezve, meg kell írnunk néhány kódot, és el kell küldenünk a megfelelő Arduino lapokra. Mivel valószínűleg csak egy számítógéped van, ezért az adóval kezdjük. Miután a kódot betöltöttük oda, áttérünk a vevőre. Azt az Arduinót, amelyikhez az adó csatlakozik, ezután egy tápegység vagy akkumulátor segítségével táplálhatjuk.
RadioHead könyvtár – egy svájci bicska a vezeték nélküli modulokhoz
Mielőtt elkezdenénk kódolni, van egy RadioHead nevű könyvtár, amelyet telepítenünk kell az Arduino IDE-nkbe, és amely sokkal egyszerűbbé teszi a kód írását.
A RadioHead egy olyan könyvtár, amely lehetővé teszi az egyszerű adatátvitelt az Arduino lapok között. Annyira sokoldalú, hogy mindenféle rádiós kommunikációs eszköz meghajtására használható, beleértve a 433MHz-es moduljainkat is.
A RadioHead könyvtár feladata, hogy fogadja az adatainkat, bekapszulázza egy adatcsomagba, amely tartalmaz egy CRC-t (Cyclic Redundancy Check), majd a szükséges preambulummal és fejléccel együtt elküldi egy másik Arduinónak. Ha az adat helyesen érkezik, a fogadó Arduino értesül arról, hogy adat áll rendelkezésre, és folytatja annak dekódolását és műveletét.
A RadioHead csomag a következőképpen épül fel: Minden adás elején egy “1” és “0” bitpárokból álló 36 bites folyamot, az úgynevezett “Training Preamble”-t küldünk. Ezek a bitek szükségesek ahhoz, hogy a vevő beállítsa az erősítést, mielőtt megkapja a tényleges adatokat. Ezt követi egy 12 bites “Start Symbol”, majd a tényleges adat (payload).
A csomag végére egy Frame Check Sequence vagy CRC kerül, amelyet a RadioHead a vevő végén újraszámol, és ha a CRC-ellenőrzés helyes, a fogadó eszköz figyelmeztetést kap. Ha a CRC-ellenőrzés sikertelen, a csomag elvetésre kerül.
A teljes csomag valahogy így néz ki:
A könyvtárat letöltheti, ha ellátogat az airspayce.com vagy, csak kattints erre a gombra a zip letöltéséhez:
A telepítéshez nyisd meg az Arduino IDE-t, menj a Sketch > Include Library > Add .ZIP Library, majd válaszd ki a RadioHead fájlt, amit most letöltöttél. Ha további részletekre van szüksége egy könyvtár telepítésével kapcsolatban, látogasson el erre az Arduino könyvtár telepítése bemutatóra.
Arduino kód – 433MHz-es RF adóhoz
Kísérletünkben csak egy egyszerű szöveges üzenetet fogunk küldeni az adóról a vevőre. Hasznos lesz a modulok használatának megértéséhez, és alapul szolgálhat további gyakorlatias kísérletekhez és projektekhez.
Itt van a vázlat, amit az adónkhoz fogunk használni:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init();} void loop(){ const char *msg = "Hello World"; rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000);}
Ez egy elég rövid vázlat, de minden szükséges ahhoz, hogy egy jelet továbbítsunk.
A vázlat a RadioHead ASK könyvtár bevonásával kezdődik. Az Arduino SPI könyvtárat is be kell vonnunk, mivel a RadioHead könyvtár függ tőle.
#include <RH_ASK.h>#include <SPI.h>
A következőkben egy ASK objektumot kell létrehoznunk, hogy hozzáférhessünk a RadioHead ASK könyvtárhoz kapcsolódó speciális funkciókhoz.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
A setup függvényben inicializálnunk kell az ASK objektumot.
// Initialize ASK Objectrf_driver.init();
A loop függvényben egy üzenet előkészítésével kezdünk. Ez egy egyszerű szöveges karakterlánc, és egy msg nevű karaktermutatóban tároljuk. Ne feledjük, hogy, az üzenet lehet bármi, de nem haladhatja meg a 27 karaktert a jobb teljesítmény érdekében. És mindenképpen számolja meg a benne lévő karakterek számát, mivel erre a számra szüksége lesz a vevő kódjában. Esetünkben 11 karakter van.
// Preparing a messageconst char *msg = "Hello World";
Az üzenet továbbítása ezután egy send()
függvénnyel történik. Két paramétere van: az első az adatok tömbje, a második pedig az elküldendő bájtok száma (az adatok hossza). A send()
függvényt általában a waitPacketSent()
függvény követi, amely megvárja, amíg bármelyik előző átviteli csomag továbbítása befejeződik. Ezután a vázlat vár egy másodpercet, hogy a vevőnknek legyen ideje mindent befogadni.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Arduino kód – 433MHz-es RF vevőhöz
Kapcsolja a vevő Arduino-t a számítógéphez, és töltse be a következő kódot:
// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init(); // Setup Serial Monitor Serial.begin(9600);} void loop(){ // Set buffer to size of expected message uint8_t buf; uint8_t buflen = sizeof(buf); // Check if received packet is correct size if (rf_driver.recv(buf, &buflen)) { // Message received with valid checksum Serial.print("Message Received: "); Serial.println((char*)buf); }}
Az adó cade-hoz hasonlóan a vevő kódja a RadioHead és az SPI könyvtárak betöltésével és egy ASK objektum létrehozásával kezdődik.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
A setup függvényben: inicializáljuk az ASK objektumot, és beállítjuk a soros monitort is, mivel így fogjuk látni a fogadott üzenetet.
rf_driver.init();Serial.begin(9600);
A loop függvényben: létrehozunk egy puffert, amelynek mérete megegyezik az átvitt üzenet méretével. A mi esetünkben ez 11, emlékszel? Ezt az üzenet hosszának megfelelően kell beállítanod. Ügyeljen arra, hogy minden szóköz és írásjel szerepeljen benne, mivel ezek mind karaktereknek számítanak.
uint8_t buf;uint8_t buflen = sizeof(buf);
A következőkben meghívunk egy recv()
függvényt. Ez bekapcsolja a vevőt, ha az még nincs bekapcsolva. Ha van érvényes üzenet, akkor az üzenetet átmásolja az első paraméteres pufferébe, és true-t ad vissza, máskülönben false-t. Ha a függvény true-t ad vissza, a vázlat belép az if utasításba, és kiírja a kapott üzenetet a soros monitorra.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Ezután visszamegyünk a ciklus elejére, és újra kezdjük az egészet.
A vázlat betöltése után nyissuk meg a soros monitort. Ha minden rendben van, akkor látnia kell az üzenetet.
A 433MHz-es RF modulok hatótávolságának növelése
Az antenna, amelyet mind az adóhoz, mind a vevőhöz használ, valóban befolyásolhatja a hatótávolságot, amelyet ezekkel az RF modulokkal elérhet. Valójában antenna nélkül szerencsés lenne, ha egy méternél nagyobb távolságon keresztül kommunikálhatna.
A megfelelő antennatervezéssel 50 méteres távolságon keresztül kommunikálhat. Persze ez szabadtéren, nyílt térben. Beltérben a hatótávolsága, különösen a falakon keresztül, kissé gyengülni fog.
Az antennának nem kell bonyolultnak lennie. Egy egyszerű darab egymagvas drótból kiváló antenna lehet mind az adó, mind a vevő számára. Az antenna átmérőjének alig van jelentősége, amíg az antenna hossza megmarad.
A leghatékonyabb antenna hossza megegyezik a használt hullám hosszával. Gyakorlati célokra ennek a hossznak a fele vagy negyede elegendő.
A frekvencia hullámhosszát a következőképpen számítjuk ki:
A frekvencia hullámhossza = | Az átviteli sebesség (v) | |
Az átviteli frekvencia (f) |
A levegőben az átviteli sebesség egyenlő a fénysebességgel, ami pontosan 299,792,458 m/s. Tehát a 433 MHz-es sáv esetében a hullámhossz:
A frekvencia hullámhossza = | 299,792,458 m/s |
433,000,000 Hz | |
= | 0.6924 méter |
= | 69,24 cm |
Mivel a teljes hullámú 69,24 cm-es antenna elég hosszú, nem túl praktikus a használata. Ezért egy negyedhullámú antennát választunk, ami körülbelül 17,3 cm vagy 6,8 hüvelyk.
A biztonság kedvéért, ha más, más frekvenciát használó rádióadókkal kísérletezünk, ugyanezt a képletet használhatjuk a szükséges antennahossz kiszámításához. Elég egyszerű, igaz?
Még egy 17,3 cm-es antenna is kényelmetlen lehet az apró Arduino projektedben. De NE essünk kísértésbe, hogy feltekerjük az antennát, hogy kompaktabbá tegyük, mivel ez komolyan befolyásolja a hatótávolságot. Az egyenes antenna mindig a legjobb!