Haluatko lisätä langattomia ominaisuuksia seuraavaan Arduino-projektiisi alle kahvikupin hinnalla? No, sitten 433MHz RF-lähetin- ja vastaanotinmoduulit ovat juuri sinua varten! Niitä voi usein saada verkossa alle kahdella dollarilla parista, mikä tekee niistä yhden edullisimmista tiedonsiirtovaihtoehdoista, joita voit saada. Ja mikä parasta, nämä moduulit ovat superpieniä, joten voit sisällyttää langattoman liitännän lähes mihin tahansa projektiin.
Hardware Overview
Katsotaanpa tarkemmin 433 MHz:n RF-lähetin- ja -vastaanotinmoduuleja.
Tämä pikkuinen moduuli on lähetin kahden kesken. Se on todella yksinkertainen kuin miltä se näyttää. Moduulin sydän on SAW-resonaattori, joka on viritetty 433,xx MHz:n toimintaan. Siinä on kytkentätransistori ja muutama passiivinen komponentti, siinä kaikki.
Kun DATA-tuloon kytketään looginen HIGH, oskillaattori toimii tuottaen jatkuvan RF-ulostulon kantoaallon 433,xx MHz:n taajuudella, ja kun DATA-tulo viedään logiikkaan LOW, oskillaattori pysähtyy. Tämä tekniikka tunnetaan nimellä Amplitude Shift Keying, jota käsittelemme yksityiskohtaisesti pian.
Tämä on vastaanottomoduuli. Vaikka se näyttää monimutkaiselta, se on yhtä yksinkertainen kuin lähetinmoduuli. Se koostuu RF-virityspiiristä ja parista OP-vahvistimesta, jotka vahvistavat lähettimestä vastaanotettua kantoaaltoa. Vahvistettu signaali syötetään edelleen PLL:ään (Phase Lock Loop), jonka avulla dekooderi voi ”lukittua” digitaaliseen bittivirtaan, mikä antaa paremman dekoodatun ulostulon ja häiriönsietokyvyn.
ASK – Amplitude Shift Keying
Kuten edellä on todettu, digitaalisen datan lähettämiseen radioteitse näissä moduuleissa käytetään tekniikkaa nimeltä amplitudinsiirtoäänen siirtoäänen siirtoäänen siirtoäänen siirtoääni eli ASK. Amplitude Shift Keying -tekniikassa kantoaallon (meidän tapauksessamme 433 MHz:n signaalin) amplitudia (eli tasoa) muutetaan vastauksena saapuvaan datasignaaliin.
Tämä on hyvin samankaltainen kuin analoginen amplitudimodulaatiotekniikka, joka saattaa olla sinulle tuttu, jos tunnet AM-radiota. Sitä kutsutaan joskus binääriseksi amplitudinsiirtomodulaatioksi (binary amplitude shift keying), koska kyse on vain kahdesta tasosta. Voit ajatella sitä ON/OFF-kytkimenä.
- Digitaalinen 1 – Tämä ajaa kantoaaltoa täydellä voimakkuudella.
- Digitaalinen 0 – Tämä katkaisee kantoaallon kokonaan.
Tältä amplitudimodulaatio näyttää:
Amplitudinsiirtoäänen näppäilyn etuna on se, että se on hyvin yksinkertainen toteuttaa. Dekooderipiirin suunnittelu on varsin yksinkertaista. ASK tarvitsee myös vähemmän kaistanleveyttä kuin muut modulaatiotekniikat, kuten FSK (Frequency Shift Keying). Tämä on yksi syy siihen, että se on edullinen.
Haittapuolena on kuitenkin se, että ASK on altis muiden radiolaitteiden ja taustakohinan aiheuttamille häiriöille. Mutta niin kauan kuin pidät tiedonsiirron suhteellisen hitaalla nopeudella, se voi toimia luotettavasti useimmissa ympäristöissä.
433MHz RF-lähetin & Vastaanottimen pinout
Katsotaanpa 433MHz RF-lähetin- ja vastaanotinmoduulien pinoutia.
DATA-pinni ottaa vastaan lähetettävää digitaalista dataa.
VCC syöttää virtaa lähettimelle. Tämä voi olla mikä tahansa positiivinen tasajännite välillä 3,5 V – 12 V. Huomaa, että RF-lähtö on verrannollinen syöttöjännitteeseen eli mitä korkeampi jännite, sitä suurempi kantama on.
GND on maadoitusnasta.
Antenna on nasta ulkoista antennia varten. Kuten aiemmin käsiteltiin, tähän tappiin kannattaa juottaa 17,3 cm:n pätkä kiinteää lankaa, jotta kantama paranee.
VCC syöttää virtaa vastaanottimelle. Toisin kuin lähettimessä, vastaanottimen syöttöjännitteen on oltava 5 V.
DATA-nastat antavat vastaanotetun digitaalisen datan. Kaksi keskimmäistä nastaa on sisäisesti sidottu yhteen, joten voit käyttää kumpaakin datan ulostuloon.
GND on maadoitusnasta.
Antenna on ulkoisen antennin nasta, joka on usein merkitsemätön. Se on pad moduulin vasemmassa alakulmassa, aivan pienen kelan vieressä. Jälleen kerran haluat juottaa 17,3 cm:n pätkän kiinteää lankaa tähän tappiin parempaa kantamaa varten.
Kytkentä – 433MHz RF-lähettimen ja -vastaanottimen kytkeminen Arduino UNO:hon
Nyt kun tiedämme kaiken moduuleista, on aika ottaa ne käyttöön!
Koska lähetämme dataa kahden Arduino-levyn välillä, tarvitsemme tietysti kaksi Arduino-levyä, kaksi leipälautaa ja pari hyppyjohtoa.
Lähettimen johdotus on melko yksinkertainen. Siinä on vain kolme liitäntää. Kytke VCC-nasta 5V-nastaan ja GND Arduinon maahan. Data-In-nasta tulee kytkeä Arduinon digitaaliseen nastaan #12. Kannattaa pyrkiä käyttämään nastaa 12, sillä oletusarvoisesti kirjasto, jota käytämme luonnoksessamme, käyttää tätä nastaa datan syöttöön.
Seuraavassa kuvassa näkyy johdotus.
Kun lähetin on johdotettu, voit siirtyä vastaanottimeen. Vastaanottimen kytkentä on yhtä helppoa kuin lähettimen kytkentä oli.
Jälleen kerran on tehtävä vain kolme liitäntää. Kytke VCC-nasta 5V-nastaan ja GND Arduinon maahan. Mikä tahansa kahdesta keskimmäisestä Data-Out-nastasta on kytkettävä Arduinon digitaaliseen nastaan #11.
Vastaanottimen johdotuksen tulisi näyttää tältä.
Nyt kun sekä lähetin että vastaanotin on kytketty, meidän on kirjoitettava koodia ja lähetettävä se vastaaville Arduino-levyille. Koska sinulla on todennäköisesti vain yksi tietokone, aloitamme lähettimestä. Kun koodi on ladattu sinne, siirrymme vastaanottimeen. Arduino, johon lähetin on kytketty, voidaan sitten syöttää virtaa virtalähteen tai pariston avulla.
RadioHead-kirjasto – langattomien moduulien sveitsiläinen armeijan veitsi
Ennen kuin aloitamme koodaamisen, meidän on asennettava Arduino IDE -ohjelmistoon RadioHead-niminen kirjasto, joka tekee koodin kirjoittamisesta paljon yksinkertaisempaa.
RadioHead on kirjasto, joka mahdollistaa yksinkertaisen tiedonsiirron Arduino-levyjen välillä. Se on niin monipuolinen, että sitä voidaan käyttää kaikenlaisten radioviestintälaitteiden ohjaamiseen, mukaan lukien 433 MHz:n moduulimme.
Mitä RadioHead-kirjasto tekee, on ottaa datamme, kapseloida se datapaketiksi, joka sisältää CRC:n (Cyclic Redundancy Check), ja lähettää sen sitten tarvittavine johdantokappaleineen ja otsakkeineen toiseen Arduinoon. Jos data vastaanotetaan oikein, vastaanottavalle Arduinolle ilmoitetaan, että dataa on saatavilla, ja se jatkaa sen purkamista ja toimintaa.
RadioHead-paketti muodostuu seuraavasti: Jokaisen lähetyksen alussa lähetetään 36-bittinen ”1”- ja ”0”-bittipareista koostuva virta, jota kutsutaan nimellä ”Training Preamble”. Nämä bitit ovat välttämättömiä, jotta vastaanotin voi säätää vahvistustaan ennen varsinaisen datan vastaanottamista. Tämän jälkeen lisätään 12-bittinen ”aloitussymboli” ja sen jälkeen varsinainen data (hyötykuorma).
Paketin loppuun lisätään kehyksen tarkistussekvenssi eli CRC, jonka RadioHead laskee uudelleen vastaanottimen päässä, ja jos CRC-tarkistus on oikein, vastaanottava laite saa siitä ilmoituksen. Jos CRC-tarkistus epäonnistuu, paketti hylätään.
Koko paketti näyttää jotakuinkin tältä:
Voit ladata kirjaston, käymällä osoitteessa airspayce.com tai, klikkaa tätä painiketta ladataksesi zip:
Asennustaaksesi sen, avaa Arduino IDE, mene kohtaan Sketch > Include Library > Add .ZIP Library ja valitse sitten RadioHead-tiedosto, jonka juuri latasit. Jos tarvitset lisätietoja kirjaston asentamisesta, käy tässä Arduino-kirjaston asentaminen -oppaassa.
Arduino-koodi – 433 MHz:n RF-lähettimelle
Kokeessamme lähetämme vain yksinkertaisen tekstiviestin lähettimestä vastaanottimeen. Se auttaa ymmärtämään, miten moduuleja käytetään, ja se voi toimia pohjana käytännönläheisemmille kokeille ja projekteille.
Tässä on sketsi, jota käytämme lähettimessämme:
// 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);}
Se on melko lyhyt sketsi, mutta siinä on kaikki, mitä tarvitset signaalin lähettämiseen.
Sketsi aloitetaan sisällyttämällä siihen RadioHead ASK-kirjasto. Meidän on myös sisällytettävä Arduino SPI-kirjasto, koska RadioHead-kirjasto on riippuvainen siitä.
#include <RH_ASK.h>#include <SPI.h>
Seuraavaksi meidän on luotava ASK-objekti, jotta pääsemme käsiksi RadioHead ASK-kirjastoon liittyviin erikoistoimintoihin.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
Setup-funktiossa meidän on alustettava ASK-objekti.
// Initialize ASK Objectrf_driver.init();
Silmukan funktiossa aloitamme valmistelemalla viestin. Se on yksinkertainen tekstijono ja tallennetaan merkkiosoittimeen nimeltä msg. Pidä mielessä, että, viesti voi olla mitä tahansa, mutta ei saisi ylittää 27 merkkiä paremman suorituskyvyn vuoksi. Muista myös laskea sen sisältämien merkkien määrä, sillä tarvitset tätä lukumäärää vastaanottajakoodissa. Meidän tapauksessamme merkkejä on 11.
// Preparing a messageconst char *msg = "Hello World";
Viesti lähetetään sitten send()
-funktiolla. Sillä on kaksi parametria: ensimmäinen on datan array ja toinen on lähetettävien tavujen määrä (datan pituus). send()
-funktiota seuraa yleensä waitPacketSent()
-funktio, joka odottaa, kunnes jokin edellinen lähetyspaketti on lähetetty loppuun. Tämän jälkeen luonnos odottaa sekunnin ajan, jotta vastaanottimemme ehtii ottaa kaiken vastaan.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Arduino-koodi – 433 MHz:n RF-vastaanottimelle
Kytke vastaanottimen Arduino tietokoneeseen ja lataa seuraava koodi:
// 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); }}
Vastaanottimen koodi alkaa lähettimen koodin tavoin lataamalla sekä RadioHead- että SPI-kirjastot ja luomalla ASK-objekti.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
Setup-funktiossa: alustamme ASK-objektin ja asetamme myös sarjamonitorin, koska näin katsomme vastaanotettua viestiä.
rf_driver.init();Serial.begin(9600);
Silmukka-funktiossa: luomme puskurin, jonka koko on sama kuin lähetetyn viestin koko. Meidän tapauksessamme se on 11, muistatko? Sinun on säädettävä tämä vastaamaan viestisi pituutta. Muista sisällyttää kaikki välilyönnit ja välimerkit, sillä ne kaikki lasketaan merkeiksi.
uint8_t buf;uint8_t buflen = sizeof(buf);
Seuraavaksi kutsumme recv()
-funktiota. Tämä kytkee vastaanottimen päälle, jos se ei ole vielä päällä. Jos käytettävissä on kelvollinen viesti, se kopioi viestin ensimmäisen parametrin puskuriinsa ja palauttaa true, muuten palauttaa false. Jos funktio palauttaa true, luonnos siirtyy if-lausekkeeseen ja tulostaa vastaanotetun viestin sarjamonitoriin.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Sitten palataan silmukan alkuun ja tehdään kaikki alusta.
Kun luonnos on ladattu, avaa sarjamonitori. Jos kaikki on kunnossa, sinun pitäisi nähdä viestisi.
433MHz:n RF-moduulien kantaman parantaminen
Antenni, jota käytät sekä lähettimessäsi että vastaanottimessasi, voi todella vaikuttaa kantamaan, jonka pystyt saamaan näillä RF-moduuleilla. Itse asiassa ilman antennia olet onnekas kommunikoidessasi yli metrin etäisyydellä.
Kunnollisella antennisuunnittelulla voit kommunikoida 50 metrin etäisyydellä. Tietenkin tuo on ulkona avoimessa tilassa. Kantama sisätiloissa, erityisesti seinien läpi, heikkenee hieman.
Antennin ei tarvitse olla monimutkainen. Yksinkertainen pala yksiytimistä lankaa voi olla erinomainen antenni sekä lähettimelle että vastaanottimelle. Antennin halkaisijalla tuskin on merkitystä, kunhan antennin pituus säilyy.
Tehokkaimman antennin pituus on sama kuin sen aallon pituus, johon sitä käytetään. Käytännön tarkoituksiin riittää puolet tai neljännes tästä pituudesta.
Taajuuden aallonpituus lasketaan seuraavasti:
Taajuuden aallonpituus = | Lähetysnopeus (v) | |
Lähetystaajuus (f) |
Ailmassa lähetysnopeus on yhtä suuri kuin valon nopeus, joka on tarkalleen ottaen 299 792 458 m/s. Eli 433 MHz:n taajuusalueella aallonpituus on:
Taajuuden aallonpituus = | 299,792,458 m/s |
433,000,000 Hz | |
= | 0.6924 metriä |
= | 69.24 cm |
Koska täysaalto 69.24 cm:n antenni on aika pitkä antenni, sitä ei ole kovin käytännöllinen käyttää. Siksi valitsemme neljännesaaltoantennin, joka on noin 17,3 cm eli 6,8 tuumaa.
Varmuuden vuoksi, jos kokeilet muita radiolähettimiä, jotka käyttävät eri taajuuksia, voit käyttää samaa kaavaa tarvittavan antennin pituuden laskemiseen. Aika helppoa, eikö?
Jopa 17,3 cm:n antenni voi tuntua hankalalta pienessä Arduino-projektissasi. Mutta ÄLÄ houkuta kelaamaan antennia, jotta siitä tulisi kompaktimpi, sillä se vaikuttaa vakavasti kantamaan. Suora antenni on aina paras!