Wil je draadloze mogelijkheden toevoegen aan je volgende Arduino project, voor minder dan de prijs van een kopje koffie? Goed, dan zijn 433MHz RF Zender en Ontvanger Modules precies voor u! Ze kunnen vaak online worden verkregen voor minder dan twee dollar voor een paar, waardoor ze een van de meest goedkope datacommunicatie opties die je kunt krijgen. En het beste van alles, deze modules zijn super klein, zodat u een draadloze interface op te nemen in bijna elk project.
Hardware Overzicht
Laten we eens een kijkje nemen op de 433MHz RF Zender en Ontvanger Modules.
Deze kleine module is een zender onder twee. Het is echt eenvoudig zoals het eruit ziet. Het hart van de module is de SAW-resonator die is afgestemd op 433,xx MHz. Er is een schakeltransistor en een paar passieve componenten, dat is het.
Wanneer een logische HIGH wordt toegepast op de DATA-ingang, loopt de oscillator en produceert een constante RF draaggolf op 433,xx MHz en wanneer de DATA-ingang naar een logische LOW wordt gebracht, stopt de oscillator. Deze techniek staat bekend als Amplitude Shift Keying, die we zo dadelijk in detail zullen bespreken.
Dit is een ontvangermodule. Hoewel het er complex uitziet, is het net zo eenvoudig als de zendermodule. Hij bestaat uit een RF-afstemkring en een paar OP-versterkers om de ontvangen draaggolf van de zender te versterken. Het versterkte signaal wordt verder toegevoerd aan een PLL (Phase Lock Loop) die de decoder in staat stelt te “locken” op een stroom van digitale bits, hetgeen een betere gedecodeerde output en ruisongevoeligheid geeft.
ASK – Amplitude Shift Keying
Zoals hierboven besproken, gebruiken deze modules voor het verzenden van digitale gegevens over de radio een techniek die Amplitude Shift Keying of ASK wordt genoemd. Bij Amplitude Shift Keying wordt de amplitude (d.w.z. het niveau) van de draaggolf (in ons geval is dat een 433MHz signaal) veranderd als reactie op het binnenkomende datasignaal.
Dit lijkt erg op de analoge techniek van amplitude modulatie waarmee u wellicht bekend bent als u bekend bent met AM radio. Het wordt ook wel binaire amplitude verschuiving genoemd, omdat er maar twee niveaus zijn waar we mee te maken hebben. U kunt het zien als een aan/uit schakelaar.
- Voor Digitaal 1 – Deze stuurt de draaggolf op volle sterkte.
- Voor Digitaal 0 – Deze schakelt de draaggolf volledig uit.
Zo ziet de amplitudemodulatie er uit:
Amplitude Shift keying heeft het voordeel dat het zeer eenvoudig te implementeren is. Het is vrij eenvoudig om de decoderschakelingen te ontwerpen. ASK heeft ook minder bandbreedte nodig dan andere modulatietechnieken zoals FSK (Frequency Shift Keying). Dit is een van de redenen waarom ASK zo goedkoop is.
Het nadeel is echter dat ASK gevoelig is voor interferentie van andere radio-apparatuur en achtergrondruis. Maar zolang u uw data transmissie op een relatief lage snelheid houdt kan het betrouwbaar werken in de meeste omgevingen.
433MHz RF Zender & Ontvanger Pinout
Laten we eens kijken naar de pinout van 433MHz RF Zender en Ontvanger Modules.
DATA pin accepteert te verzenden digitale data.
VCC levert voeding voor de zender. Dit kan elke positieve gelijkspanning tussen 3,5V en 12V zijn. Merk op dat de RF-uitgang evenredig is met de voedingsspanning, d.w.z. hoe hoger de spanning, hoe groter het bereik zal zijn.
GND is een aardingspen.
Antenna is een pen voor een externe antenne. Zoals eerder besproken, zult u een stukje massieve draad van 17,3 cm aan deze pen willen solderen voor een beter bereik.
VCC levert de voedingsspanning voor de ontvanger. In tegenstelling tot de zender moet de voedingsspanning voor de ontvanger 5V zijn.
DATA pinnen geven de ontvangen digitale gegevens door. De twee middelste pinnen zijn intern met elkaar verbonden, zodat u ze beide kunt gebruiken voor de data-uitgang.
GND is een aardpen.
Antenna is een pen voor de externe antenne, die vaak ongemarkeerd is. Het is het voetje linksonder op de module, vlak naast de kleine spoel. Ook hier geldt dat je een stukje massieve draad van 17,3 cm aan deze pen moet solderen voor een beter bereik.
Bedrading – Aansluiten 433MHz RF zender en ontvanger op Arduino UNO
Nu we alles weten over de modules is het tijd om ze in gebruik te nemen!
Aangezien we data gaan versturen tussen twee Arduino boards, hebben we natuurlijk twee Arduino boards, twee breadboards en een paar jumper draden nodig.
De bedrading voor de zender is vrij eenvoudig. Het heeft slechts drie aansluitingen. Verbind de VCC pin met 5V pin en GND met ground op de Arduino. De gegevens-In speld zouden met digitale speld 12 van Arduino moeten worden verbonden. U moet proberen pin 12 te gebruiken, omdat de bibliotheek die we in onze sketch gebruiken standaard deze pin gebruikt voor data-input.
De volgende illustratie toont de bedrading.
Als u de zender eenmaal bedraad heeft, kunt u verder gaan met de ontvanger. De bedrading van de ontvanger is net zo eenvoudig als die van de zender.
Ook nu zijn er slechts drie aansluitingen. Verbind de VCC pin met 5V pin en GND met de grond op de Arduino. Een van de middelste twee Data-Out pinnen moet worden verbonden met digitale pin #11 op de Arduino.
Dit is hoe de bedrading voor de ontvanger eruit zou moeten zien.
Nu zowel de zender als de ontvanger bedraad zijn, moeten we wat code schrijven en die naar de respectievelijke Arduino boards sturen. Aangezien je waarschijnlijk maar één PC hebt, zullen we beginnen met de zender. Zodra de code daar is geladen, gaan we verder met de ontvanger. De Arduino waarop de zender is aangesloten, kan vervolgens worden gevoed met een voeding of batterij.
RadioHead Bibliotheek – een Zwitsers zakmes voor draadloze modules
Voordat we beginnen met coderen, is er een bibliotheek genaamd RadioHead die we moeten installeren in onze Arduino IDE die het schrijven van de code een stuk eenvoudiger zal maken.
RadioHead is een bibliotheek die eenvoudige gegevensoverdracht tussen Arduino boards mogelijk maakt. Het is zo veelzijdig dat het kan worden gebruikt om allerlei radiocommunicatie-apparaten aan te sturen, met inbegrip van onze 433MHz modules.
Wat RadioHead bibliotheek doet is het nemen van onze gegevens, inkapselen in een pakket van gegevens die een CRC (Cyclic Redundancy Check) bevat en vervolgens verzenden met de nodige preamble en header naar een andere Arduino. Als de gegevens correct worden ontvangen, wordt de ontvangende Arduino geïnformeerd dat er gegevens beschikbaar zijn en gaat over tot decodering en actie it.
Het RadioHead Pakket is als volgt samengesteld: Een 36 bit stroom van “1” en “0” bit paren, genaamd een “Training Preamble”, wordt verzonden aan het begin van elke transmissie. Deze bits zijn nodig voor de ontvanger om zijn versterking aan te passen alvorens de eigenlijke gegevens te ontvangen. Daarna volgt een 12 bits “Start Symbol” en dan wordt de eigenlijke data (payload) toegevoegd.
Een Frame Check Sequence of CRC wordt aan het eind van het pakket toegevoegd, die door RadioHead aan de ontvangstzijde wordt herberekend en als de CRC-controle correct is, wordt het ontvangende apparaat gealarmeerd. Als de CRC-controle mislukt, wordt het pakket weggegooid.
Het hele pakket ziet er ongeveer zo uit:
U kunt de bibliotheek downloaden door een bezoek te brengen aan airspayce.com of klik op deze knop om de zip te downloaden:
Om het te installeren, open de Arduino IDE, ga naar Sketch > Include Library > Add .ZIP Library, en selecteer dan het RadioHead bestand dat je net hebt gedownload. Als u meer details over het installeren van een bibliotheek wilt, bezoek deze Installing an Arduino Library tutorial.
Arduino Code – For 433MHz RF Transmitter
In ons experiment zullen we gewoon een eenvoudig tekstbericht van de zender naar de ontvanger sturen. Het zal nuttig zijn om te begrijpen hoe de modules te gebruiken en kan dienen als basis voor meer praktische experimenten en projecten.
Hier is de schets die we zullen gebruiken voor onze zender:
// 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);}
Het is een vrij korte schets, maar het is alles wat je nodig hebt om een signaal verzonden te krijgen.
De schets begint met het opnemen van RadioHead ASK bibliotheek. We moeten ook de Arduino SPI-bibliotheek opnemen omdat de RadioHead-bibliotheek daarvan afhankelijk is.
#include <RH_ASK.h>#include <SPI.h>
Volgende moeten we een ASK-object maken om toegang te krijgen tot speciale functies met betrekking tot de RadioHead ASK-bibliotheek.
// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;
In de setup-functie moeten we het ASK-object initialiseren.
// Initialize ASK Objectrf_driver.init();
In de loop-functie beginnen we met het voorbereiden van een bericht. Het is een eenvoudige tekst string en opgeslagen in een karakter pointer genaamd msg. Hou in gedachten dat, je bericht van alles kan zijn, maar dat het niet langer dan 27 karakters moet zijn voor een betere performance. En zorg ervoor dat je het aantal karakters telt, want je zult die telling nodig hebben in de ontvanger code. In ons geval hebben we 11 tekens.
// Preparing a messageconst char *msg = "Hello World";
Het bericht wordt dan verzonden met een send()
-functie. Deze heeft twee parameters: de eerste is een array van gegevens en de tweede is het aantal bytes (lengte van de gegevens) dat moet worden verzonden. De send()
functie wordt gewoonlijk gevolgd door de waitPacketSent()
functie, die wacht tot het verzenden van het vorige pakket is voltooid. Daarna wacht de sketch een seconde om onze ontvanger de tijd te geven alles op te nemen.
rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);
Arduino Code – Voor 433MHz RF Ontvanger
Sluit de ontvanger Arduino aan op de computer en laad de volgende code:
// 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); }}
Net als de zender code, begint de ontvanger code met het laden van zowel de RadioHead als de SPI bibliotheken en het maken van een ASK object.
#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;
In de setup-functie: we initialiseren het ASK-object en stellen ook de seriële monitor in, omdat we op deze manier onze ontvangen boodschap zullen bekijken.
rf_driver.init();Serial.begin(9600);
In de loop-functie: we maken een buffer van dezelfde grootte als de verzonden boodschap. In ons geval is dat 11, weet je nog? U zult dit moeten aanpassen aan de lengte van uw bericht. Vergeet niet om spaties en leestekens mee te tellen, want die tellen allemaal als tekens.
uint8_t buf;uint8_t buflen = sizeof(buf);
Volgende roepen we een recv()
-functie op. Deze zet de ontvanger aan als hij nog niet aan staat. Als er een geldig bericht beschikbaar is, kopieert de functie het bericht naar de eerste parameterbuffer en geeft true terug, anders false. Als de functie true teruggeeft, gaat de sketch in if en drukt het ontvangen bericht af op de seriële monitor.
if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }
Dan gaan we terug naar het begin van de lus en doen we alles opnieuw.
Na het laden van de sketch opent u uw seriële monitor. Als alles OK is, zou u uw boodschap moeten zien.
Betere reikwijdte van 433MHz RF modules
De antenne die u gebruikt voor zowel de zender als de ontvanger kan echt van invloed zijn op de reikwijdte die u kunt behalen met deze RF modules. Zonder antenne kunt u met geluk communiceren over een afstand van meer dan een meter.
Met een goede antenne kunt u communiceren over een afstand van 50 meter. Natuurlijk is dat buiten in een open ruimte. Uw bereik binnenshuis, vooral door muren heen, zal iets minder zijn.
De antenne hoeft niet ingewikkeld te zijn. Een eenvoudig stuk eenaderige draad kan een uitstekende antenne zijn voor zowel zender als ontvanger. De diameter van de antenne is nauwelijks van belang, zolang de lengte van de antenne maar gehandhaafd blijft.
De meest effectieve antenne heeft dezelfde lengte als de lengte van de golf waarvoor hij wordt gebruikt. Voor praktische doeleinden is de helft of een kwart van die lengte voldoende.
De golflengte van een frequentie wordt berekend als:
Golflengte van frequentie = | Snelheid van de transmissie (v) |
Transmissiefrequentie (f) |
In de lucht is de transmissiesnelheid gelijk aan de lichtsnelheid, die om precies te zijn 299.792.458 m/s bedraagt. Voor de 433 MHz band is de golflengte dus:
Golflengte van frequentie = | 299,792,458 m/s |
433,000,000 Hz | |
= | 0.6924 meter |
= | 69,24 cm |
Omdat een full wave antenne van 69,24 cm een behoorlijk lange antenne is, is het niet erg praktisch om deze te gebruiken. Daarom kiezen we voor een kwartgolfantenne, die ongeveer 17,3 cm lang is.
Voor het geval dat u met andere radiozenders experimenteert die andere frequenties gebruiken, kunt u dezelfde formule gebruiken om de vereiste antennelengte te berekenen. Vrij eenvoudig, toch?
Een antenne van 17,3 cm kan onhandig lijken in je kleine Arduino-project. Maar laat je NIET verleiden om de antenne te spoelen om hem compacter te maken, want dit zal het bereik ernstig beïnvloeden. Een rechte antenne is altijd het beste!