Vill du lägga till trådlösa funktioner i ditt nästa Arduinoprojekt, för mindre än priset på en kopp kaffe? Då är 433MHz RF-sändar- och mottagarmoduler något för dig! De kan ofta fås på nätet för mindre än två dollar för ett par, vilket gör dem till ett av de billigaste datakommunikationsalternativen som du kan få. Och det bästa av allt är att dessa moduler är superlilla, vilket gör att du kan införliva ett trådlöst gränssnitt i nästan vilket projekt som helst.
Hårdvaruöversikt
Låt oss ta en närmare titt på 433MHz RF Transmitter and Receiver Modules.
Denna lilla modul är en sändare bland två. Den är verkligen enkel som den ser ut. Hjärtat i modulen är SAW-resonatorn som är avstämd för 433,xx MHz-drift. Det finns en omkopplingstransistor och några passiva komponenter, det är allt.
När en logisk HIGH läggs på DATA-ingången går oscillatorn och producerar en konstant RF-utgångsbärvåg vid 433,xx MHz och när DATA-ingången tas till logisk LOW stannar oscillatorn. Denna teknik är känd som Amplitude Shift Keying, som vi kommer att diskutera i detalj inom kort.
Detta är en mottagarmodul. Även om den ser komplex ut är den lika enkel som sändarmodulen. Den består av en RF-avstämd krets och ett par OP-förstärkare för att förstärka den mottagna bärvågen från sändaren. Den förstärkta signalen matas vidare till en PLL (Phase Lock Loop) som gör det möjligt för avkodaren att ”låsa” sig på en ström av digitala bitar, vilket ger bättre avkodat resultat och brusimmunitet.
ASK – Amplitude Shift Keying
Som diskuterats ovan använder dessa moduler, för att sända digitala data över radio, en teknik som kallas Amplitude Shift Keying eller ASK. Vid Amplitude Shift Keying ändras amplituden (dvs. nivån) på bärvågen (i vårt fall är det en 433 MHz-signal) som svar på den inkommande datasignalen.
Detta liknar i hög grad den analoga tekniken amplitudmodulering som du kanske känner till om du är bekant med AM-radio. Den kallas ibland binär amplitudskiftning eftersom det bara är två nivåer som vi har att göra med. Du kan se det som en ON/OFF-omkopplare.
- För Digital 1 – Detta driver bäraren med full styrka.
- För Digital 0 – Detta stänger av bäraren helt och hållet.
Så här ser amplitudmoduleringen ut:
Amplitude Shift Keying har fördelen att det är mycket enkelt att genomföra. Det är ganska enkelt att konstruera dekoderkretsen. ASK behöver också mindre bandbredd än andra modulationstekniker som FSK (Frequency Shift Keying). Detta är en av anledningarna till att den är billig.
Nackdelen är dock att ASK är känslig för störningar från andra radioapparater och bakgrundsbrus. Men så länge du håller din dataöverföring till en relativt långsam hastighet kan den fungera tillförlitligt i de flesta miljöer.
433MHz RF Transmitter & Receiver Pinout
Låt oss ta en titt på pinout för 433MHz RF Transmitter och Receiver Modules.
DATA-stiftet accepterar digitala data som ska överföras.
VCC levererar ström till sändaren. Detta kan vara vilken positiv likspänning som helst mellan 3,5 V och 12 V. Observera att RF-utgången är proportionell mot matningsspänningen, dvs. ju högre spänning, desto större blir räckvidden.
GND är en jordstift.
Antenna är ett stift för extern antenn. Som diskuterats tidigare vill du löda en 17,3 cm lång bit solid tråd till denna stift för att få bättre räckvidd.
VCC levererar ström till mottagaren. Till skillnad från sändaren måste matningsspänningen för mottagaren vara 5V.
DATA-stiften matar ut den mottagna digitala datan. De två mittersta stiften är internt bundna till varandra, så du kan använda en av dem för datautgång.
GND är en jordstift.
Antenna är ett stift för extern antenn som ofta är omärkt. Det är padden längst ner till vänster på modulen, precis bredvid den lilla spolen. Återigen kommer du att vilja löda en 17,3 cm lång bit solid tråd till denna stift för den förbättrade räckvidden.
Koppling – Anslutning av 433MHz RF-sändare och mottagare till Arduino UNO
Nu när vi vet allt om modulerna är det dags att ta dem i bruk!
Då vi ska skicka data mellan två Arduinokort behöver vi förstås två Arduinokort, två brödbrädor och ett par bryggkablar.
Kopplingen för sändaren är ganska enkel. Den har bara tre anslutningar. Anslut VCC-stiftet till 5V-stiftet och GND till jord på Arduino. Data-In-stiftet ska anslutas till Arduinos digitala stift #12. Du bör försöka använda stift 12 eftersom biblioteket som vi kommer att använda i vår skiss som standard använder detta stift för dataingång.
Den följande illustrationen visar ledningarna.
När du väl har kopplat sändaren kan du gå vidare till mottagaren. Kabeldragningen för mottagaren är lika enkel som för sändaren.
En gång till finns det bara tre anslutningar att göra. Anslut VCC-stiftet till 5V-stiftet och GND till jord på Arduino. Någon av de två mittersta Data-Out-stiften ska anslutas till digital stift #11 på Arduino.
Så här ska ledningarna för mottagaren se ut.
Nu när både sändaren och mottagaren är kopplade behöver vi skriva lite kod och skicka den till respektive Arduino-kort. Eftersom du förmodligen bara har en dator kommer vi att börja med sändaren. När koden har laddats dit kommer vi att gå vidare till mottagaren. Den Arduino som sändaren är ansluten till kan sedan strömförsörjas med hjälp av ett nätaggregat eller batteri.
RadioHead-biblioteket – en schweizisk armékniv för trådlösa moduler
För att börja koda finns det ett bibliotek som heter RadioHead som vi måste installera i vårt Arduino IDE och som kommer att göra det mycket enklare att skriva koden.
RadioHead är ett bibliotek som gör det möjligt att på ett enkelt sätt överföra data mellan Arduinobord. Det är så mångsidigt att det kan användas för att driva alla typer av radiokommunikationsenheter, inklusive våra 433MHz-moduler.
Vad RadioHead-biblioteket gör är att ta våra data, kapsla in dem i ett datapaket som innehåller en CRC (Cyclic Redundancy Check) och sedan skicka det med den nödvändiga preambeln och rubriken till en annan Arduino. Om data tas emot korrekt informeras den mottagande Arduino om att det finns data tillgänglig och fortsätter att avkoda och åtgärda den.
RadioHead-paketet är uppbyggt på följande sätt: En 36 bitars ström av ”1” och ”0” bitpar, som kallas ”Training Preamble”, skickas i början av varje sändning. Dessa bitar är nödvändiga för att mottagaren skall kunna justera sin förstärkning innan den får de faktiska uppgifterna. Därefter följer en 12-bitars ”startsymbol” och sedan läggs de faktiska uppgifterna (nyttolasten) till.
En ramkontrollsekvens (CRC) läggs till i slutet av paketet som omräknas av RadioHead i mottagarsidan och om CRC-kontrollen är korrekt varnas den mottagande enheten. Om CRC-kontrollen misslyckas, kasseras paketet.
Hela paketet ser ut ungefär så här:
Du kan ladda ner biblioteket genom att besöka airspayce.com eller, klicka bara på den här knappen för att ladda ner zip:
För att installera det, öppna Arduino IDE, gå till Sketch > Include Library > Add .ZIP Library, och välj sedan RadioHead-filen som du just laddat ner. Om du behöver mer information om hur du installerar ett bibliotek kan du besöka denna handledning Installera ett Arduino-bibliotek.
Arduino-kod – för 433MHz RF-sändare
I vårt experiment kommer vi bara att skicka ett enkelt textmeddelande från sändaren till mottagaren. Det kommer att vara till hjälp för att förstå hur modulerna används och kan tjäna som grund för mer praktiska experiment och projekt.
Här är skissen vi kommer att använda för vår sändare:
// 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 är en ganska kort skiss, men det är allt du behöver för att få en signal överförd.
Skissen börjar med att inkludera RadioHead ASK-biblioteket. Vi måste också inkludera Arduino SPI-biblioteket eftersom RadioHead-biblioteket är beroende av det.
#include <RH_ASK.h>#include <SPI.h>
Nästan måste vi skapa ett ASK-objekt för att få tillgång till specialfunktioner relaterade till RadioHead ASK-biblioteket.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
I setup-funktionen måste vi initialisera ASK-objektet.
// Initialize ASK Objectrf_driver.init();
I loop-funktionen börjar vi med att förbereda ett meddelande. Det är en enkel textsträng och lagras i en teckenpekare som heter msg. Tänk på att, ditt meddelande kan vara vad som helst men bör inte överstiga 27 tecken för bättre prestanda. Och se till att räkna antalet tecken i det, eftersom du kommer att behöva den räkningen i mottagarkoden. I vårt fall har vi 11 tecken.
// Preparing a messageconst char *msg = "Hello World";
Meddelandet överförs sedan med hjälp av en send()
-funktion. Den har två parametrar: den första är en array med data och den andra är antalet bytes (datalängd) som ska skickas. send()
-funktionen följs vanligtvis av waitPacketSent()
-funktionen som väntar tills ett eventuellt tidigare sändningspaket är klart att sändas. Därefter väntar skissen i en sekund för att ge vår mottagare tid att ta emot allt.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Arduino-kod – för 433MHz RF-mottagare
Koppla in mottagarens Arduino till datorn och ladda in följande kod:
// 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); }}
Samma som sändarkadan börjar mottagarkoden med att ladda både RadioHead- och SPI-biblioteken och skapa ett ASK-objekt.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
I setup-funktionen: vi initialiserar ASK-objektet och ställer även in den seriella monitorn eftersom det är så vi kommer att se vårt mottagna meddelande.
rf_driver.init();Serial.begin(9600);
I loop-funktionen: vi skapar en buffert med samma storlek som det överförda meddelandet. I vårt fall är det 11, minns du? Du måste justera detta för att matcha längden på ditt meddelande. Se till att inkludera eventuella mellanslag och interpunktion eftersom de alla räknas som tecken.
uint8_t buf;uint8_t buflen = sizeof(buf);
Nästan anropar vi en recv()
funktion. Denna slår på mottagaren om den inte redan är på. Om det finns ett giltigt meddelande tillgängligt kopierar den meddelandet till sin första parameterbuffert och returnerar true annars returnerar den false. Om funktionen returnerar true går skissen in i if-statement och skriver ut det mottagna meddelandet på seriemonitorn.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Därefter går vi tillbaka till början av slingan och gör om allt igen.
Efter att ha laddat skissen öppnar du din seriemonitor. Om allt är OK bör du se ditt meddelande.
Förbättra räckvidden för 433MHz RF-moduler
Antennen som du använder för både sändare och mottagare kan verkligen påverka räckvidden som du kommer att kunna få med dessa RF-moduler. Faktum är att utan antenn har du tur om du kan kommunicera över ett avstånd på mer än en meter.
Med en korrekt antennkonstruktion kan du kommunicera över ett avstånd på 50 meter. Det är naturligtvis utomhus på en öppen plats. Din räckvidd inomhus, särskilt genom väggar, kommer att försvagas något.
Antennen behöver inte vara komplicerad. En enkel bit enkeltråd kan utgöra en utmärkt antenn för både sändare och mottagare. Antenndiametern har knappast någon betydelse, så länge antennens längd bibehålls.
Den mest effektiva antennen har samma längd som längden på den våg den används för. För praktiska ändamål räcker det med halva eller en fjärdedel av den längden.
Våglängden för en frekvens beräknas som:
Våglängd för frekvensen = | Sändningshastighet (v) |
Sändningsfrekvens (f) |
I luft är sändningshastigheten lika med ljusets hastighet, som är 299 792 458 m/s för att vara exakt. För 433 MHz-bandet är våglängden alltså:
Våglängd för frekvensen = | 299 792 458 m/s |
433 000 000 Hz | |
= | 0.6924 meter |
= | 69,24 cm |
Som fullvågsantenn 69,24 cm är en ganska lång antenn är den inte särskilt praktisk att använda. Därför väljer vi en kvartsvågsantenn som motsvarar ungefär 17,3 cm eller 6,8 tum.
För säkerhets skull, om du experimenterar med andra radiosändare som använder olika frekvenser, kan du använda samma formel för att beräkna den nödvändiga antennlängden. Ganska enkelt, eller hur?
Även en antenn på 17,3 cm kan verka obekväm i ditt lilla Arduino-projekt. Men låt dig INTE frestas att spola antennen för att göra den mer kompakt, eftersom detta allvarligt kommer att påverka räckvidden. En rak antenn är alltid bäst!