Vil du tilføje trådløse funktioner til dit næste Arduino-projekt for mindre end prisen på en kop kaffe? Jamen, så er 433MHz RF-sender- og modtagermoduler lige noget for dig! De kan ofte fås online for mindre end to dollars for et par, hvilket gør dem til en af de billigste datakommunikationsmuligheder, som du kan få. Og det bedste af det hele er, at disse moduler er superbitte, så du kan inkorporere en trådløs grænseflade i næsten ethvert projekt.
Hardwareoversigt
Lad os se nærmere på 433MHz RF Transmitter and Receiver Modules.
Dette lille modul er en sender blandt to. Det er virkelig simpelt, som det ser ud. Hjertet i modulet er SAW-resonatoren, som er afstemt til 433,xx MHz-drift. Der er en skiftetransistor og et par passive komponenter, det er det hele.
Når der sættes logisk HIGH på DATA-indgangen, kører oscillatoren og producerer en konstant RF-udgangsbølge på 433,xx MHz, og når DATA-indgangen sættes til logisk LOW, stopper oscillatoren. Denne teknik er kendt som Amplitude Shift Keying, som vi vil diskutere i detaljer om lidt.
Dette her er et modtagermodul. Selv om det ser komplekst ud, er det lige så enkelt som sendermodulet. Det består af et RF-tunet kredsløb og et par OP Amps til at forstærke den modtagne bærebølge fra senderen. Det forstærkede signal føres videre til en PLL (Phase Lock Loop), som gør det muligt for dekoderen at “låse” sig fast på en strøm af digitale bits, hvilket giver bedre afkodet output og støjimmunitet.
ASK – Amplitude Shift Keying
Som nævnt ovenfor bruger disse moduler en teknik kaldet Amplitude Shift Keying eller ASK til at sende de digitale data over radioen. Ved Amplitude Shift Keying ændres amplituden (dvs. niveauet) af bærebølgen (i vores tilfælde er det et 433 MHz-signal) som reaktion på det indkommende datasignal.
Dette svarer meget til den analoge teknik med amplitudemodulation, som du måske kender, hvis du er bekendt med AM-radio. Det kaldes undertiden binær amplitude shift keying, fordi der kun er to niveauer, som vi beskæftiger os med. Du kan tænke på det som en tænd/sluk-knap.
- For Digital 1 – Dette driver bæreren med fuld styrke.
- For Digital 0 – Dette afskærer bæreren helt.
Sådan ser amplitudemodulationen ud:
Amplitude Shift Keying har den fordel, at det er meget enkelt at implementere. Det er ganske enkelt at designe dekoderkredsløbet. ASK kræver også mindre båndbredde end andre modulationsteknikker som FSK (Frequency Shift Keying). Dette er en af grundene til, at den er billig.
Ulempen er imidlertid, at ASK er modtagelig over for interferens fra andre radioapparater og baggrundsstøj. Men så længe du holder din datatransmission til en relativt langsom hastighed, kan det fungere pålideligt i de fleste miljøer.
433MHz RF Transmitter & Receiver Pinout
Lad os se på pinout af 433MHz RF Transmitter og Receiver Modules.
DATA-pinden accepterer digitale data, der skal transmitteres.
VCC leverer strøm til senderen. Dette kan være en hvilken som helst positiv jævnspænding mellem 3,5 V og 12 V. Bemærk, at RF-udgangen er proportional med forsyningsspændingen, dvs. jo højere spænding, jo større vil rækkevidden være.
GND er en jordstift.
Antenne er en stift til ekstern antenne. Som tidligere omtalt skal du lodde et 17,3 cm langt stykke solid ledning til denne pin for at opnå den forbedrede rækkevidde.
VCC leverer strøm til modtageren. I modsætning til senderen skal forsyningsspændingen til modtageren være 5V.
DATA-stifter udsender de digitale data, der er modtaget. De to midterste pinde er internt bundet sammen, så du kan bruge en af dem til dataudgang.
GND er en jordstift.
Antenne er en stift til ekstern antenne, som ofte er umarkeret. Det er puden nederst til venstre på modulet, lige ved siden af den lille spole. Igen skal du lodde et 17,3 cm langt stykke solid ledning til denne pin for at opnå en forbedret rækkevidde.
Kobling – Tilslutning af 433MHz RF-sender og -modtager til Arduino UNO
Nu hvor vi ved alt om modulerne, er det tid til at tage dem i brug!
Da vi skal sende data mellem to Arduino-kort, skal vi naturligvis bruge to Arduino-kort, to breadboards og et par jumperkabler.
Koblingen til senderen er ret enkel. Den har kun tre tilslutninger. Forbind VCC-stiften til 5V-stiften og GND til jord på Arduino’en. Data-In-pinden skal forbindes med Arduinos digitale pin #12. Du bør forsøge at bruge pin 12, da det bibliotek, som vi skal bruge i vores skitse, som standard bruger denne pin til dataindgang.
Den følgende illustration viser ledningsføringen.
Når du har fået kablet senderen, kan du gå videre til modtageren. Ledningsføringen til modtageren er lige så nem, som den var for senderen.
Etter engang er der kun tre forbindelser, der skal foretages. Forbind VCC-stiften til 5V-stiften og GND til jord på Arduino’en. En af de to midterste Data-Out pins skal forbindes til digital pin #11 på Arduinoen.
Sådan skal ledningerne til modtageren se ud.
Nu hvor både sender og modtager er kablet op, skal vi skrive noget kode og sende den til de respektive Arduino boards. Da du sandsynligvis kun har én pc, vil vi starte med senderen. Når koden er blevet indlæst der, vil vi gå videre til modtageren. Den Arduino, som senderen er tilsluttet, kan derefter forsynes med strøm ved hjælp af en strømforsyning eller et batteri.
RadioHead-bibliotek – en schweizerkniv til trådløse moduler
Hvor vi begynder at kode, er der et bibliotek kaldet RadioHead, som vi skal installere i vores Arduino IDE, og som vil gøre det meget nemmere at skrive koden.
RadioHead er et bibliotek, der muliggør simpel dataoverførsel mellem Arduino-boards. Det er så alsidigt, at det kan bruges til at drive alle slags radiokommunikationsenheder, herunder vores 433 MHz-moduler.
Det, RadioHead-biblioteket gør, er at tage vores data, indkapsle dem i en datapakke, der indeholder en CRC (Cyclic Redundancy Check), og derefter sende den med den nødvendige preamble og header til en anden Arduino. Hvis dataene modtages korrekt, får den modtagende Arduino besked om, at der er data til rådighed, og fortsætter med at afkode og behandle dem.
RadioHead-pakken er sammensat som følger: En 36 bitstrøm af “1”- og “0”-bitpar, kaldet en “Training Preamble”, sendes i starten af hver transmission. Disse bits er nødvendige for, at modtageren kan justere sin forstærkning, før den modtager de faktiske data. Herefter følger et 12 bit “Start Symbol”, hvorefter de faktiske data (payload) tilføjes.
En Frame Check Sequence eller CRC tilføjes i slutningen af pakken, som genberegnes af RadioHead i modtagerens ende, og hvis CRC-kontrollen er korrekt, advares modtagerenheden. Hvis CRC-kontrollen mislykkes, kasseres pakken.
Hele pakken ser nogenlunde sådan ud:
Du kan downloade biblioteket, ved at besøge airspayce.com eller, bare klik på denne knap for at downloade zip-filen:
For at installere den skal du åbne Arduino IDE, gå til Sketch > Include Library > Add .ZIP Library, og vælg derefter RadioHead-filen, som du lige har downloadet. Hvis du har brug for flere oplysninger om installation af et bibliotek, kan du besøge denne vejledning Installation af et Arduino-bibliotek.
Arduino-kode – til 433MHz RF-sender
I vores eksperiment vil vi blot sende en simpel tekstbesked fra senderen til modtageren. Det vil være nyttigt for at forstå, hvordan modulerne skal bruges, og det kan tjene som grundlag for mere praktiske eksperimenter og projekter.
Her er den skitse, vi vil bruge til vores sender:
// 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);}
Det er en ret kort skitse, men det er alt, hvad du behøver for at få et signal sendt.
Skitsen starter med at inkludere RadioHead ASK-biblioteket. Vi skal også inkludere Arduino SPI-biblioteket, da RadioHead-biblioteket er afhængigt af det.
#include <RH_ASK.h>#include <SPI.h>
Næst skal vi oprette et ASK-objekt for at få adgang til særlige funktioner relateret til RadioHead ASK-biblioteket.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
I setup-funktionen skal vi initialisere ASK-objektet.
// Initialize ASK Objectrf_driver.init();
I loop-funktionen starter vi med at forberede en besked. Det er en simpel tekststreng og gemmes i en tegnpointer ved navn msg. Husk på, at, din besked kan være hvad som helst, men bør ikke overstige 27 tegn for bedre ydeevne. Og sørg for at tælle antallet af tegn i den, da du får brug for denne optælling i modtagerkoden. I vores tilfælde har vi 11 tegn.
// Preparing a messageconst char *msg = "Hello World";
Meddelelsen overføres derefter ved hjælp af en send()
-funktion. Den har to parametre: den første er array af data og den anden er antallet af bytes (længden af data), der skal sendes. send()
-funktionen efterfølges normalt af waitPacketSent()
-funktionen, som venter, indtil en eventuel tidligere sendepakke er færdig med at blive transmitteret. Derefter venter skitsen i et sekund for at give vores modtager tid til at tage imod det hele.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Arduino-kode – til 433MHz RF-modtager
Slut modtager-Arduinoen til computeren, og indlæs følgende kode:
// 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); }}
Som senderkaden starter modtagerkoden med at indlæse både RadioHead- og SPI-bibliotekerne og oprette et ASK-objekt.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
I opsætningsfunktionen: Vi initialiserer ASK-objektet og opstiller også den serielle monitor, da det er sådan, vi vil se vores modtagne meddelelse.
rf_driver.init();Serial.begin(9600);
I loop-funktionen: Vi opretter en buffer af samme størrelse som den transmitterede meddelelse. I vores tilfælde er det 11, husker du det? Du skal justere dette, så det passer til din meddelelseslængde. Sørg for at medtage eventuelle mellemrum og tegnsætning, da de alle tæller som tegn.
uint8_t buf;uint8_t buflen = sizeof(buf);
Næst kalder vi en recv()
-funktion. Denne tænder modtageren, hvis den ikke allerede er tændt. Hvis der er en gyldig meddelelse tilgængelig, kopierer den meddelelsen til dens første parameterbuffer og returnerer true ellers returnerer den false. Hvis funktionen returnerer true, går skitsen ind i if-erklæringen og udskriver den modtagne besked på den serielle skærm.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Så går vi tilbage til starten af sløjfen og gør det hele forfra.
Når skitsen er indlæst, åbner vi din serielle skærm. Hvis alt er OK, bør du se din besked.
Forbedring af rækkevidden af 433MHz RF-moduler
Den antenne, du bruger til både sender og modtager, kan virkelig påvirke den rækkevidde, du vil kunne opnå med disse RF-moduler. Faktisk vil du uden en antenne være heldig at kunne kommunikere over en afstand på mere end en meter.
Med et korrekt antennedesign vil du kunne kommunikere over en afstand på 50 meter. Det er selvfølgelig udendørs i et åbent rum. Din rækkevidde indendørs, især gennem vægge, vil være lidt svækket.
Antennen behøver ikke at være kompliceret. Et simpelt stykke enkeltkernetråd kan udgøre en glimrende antenne til både sender og modtager. Antennediameteren har næppe nogen betydning, så længe antennens længde opretholdes.
Den mest effektive antenne har samme længde som længden af den bølge, den anvendes til. Til praktiske formål er det tilstrækkeligt med en halv eller en fjerdedel af denne længde.
Bølgelængden for en frekvens beregnes som:
Bølgelængde af frekvens = | Sendehastighed (v) | |
Sendefrekvens (f) |
I luft er sendehastigheden lig med lysets hastighed, som er 299.792.458 m/s for at være præcis. Så for 433 MHz-båndet er bølgelængden:
Bølgelængde af frekvensen = | 299.792.458 m/s | |
433.000.000 Hz | ||
= | 0.6924 meter | |
= | 69,24 cm |
Som fuldbølgeantenne 69,24 cm er en ret lang antenne, er den ikke særlig praktisk at bruge. Derfor vælger vi en kvartbølgeantenne, som svarer til ca. 17,3 cm eller 6,8 tommer.
For en sikkerheds skyld, hvis du eksperimenterer med andre radiosendere, der bruger andre frekvenser, kan du bruge den samme formel til at beregne den nødvendige antennelængde. Ret nemt, ikke sandt?
Selv en antenne på 17,3 cm kan virke besværlig i dit lille Arduino-projekt. Men lad dig IKKE friste til at spole antennen for at gøre den mere kompakt, da dette vil påvirke rækkevidden alvorligt. En lige antenne er altid bedst!