RF-moduuli koostuu 433 MHz:n RF-lähettimestä ja -vastaanottimesta. Nämä ovat ASK (Amplitude shift keying) tai OOK (Of Hook Keying) -tyyppisiä RF-moduuleja. Logiikan nollaa lähettäessään lähetin vaimentaa kantoaaltotaajuuden kokonaan ja kuluttaa siten akkukäytössä vain vähän virtaa. Kun lähetetään logiikkaa yksi, lähetin on päällä ja kantoaaltotaajuus on täysi ja näin ollen on suuri virransyöttö, joka on noin 4,5 mA:n luokkaa 3 voltin virtalähteellä.

Lähetin ja vastaanotin on liitettävä mikrokontrollereihin tiedonsiirtoa varten. Tiedot lähetetään sarjamuodossa lähettimestä ja vastaanotetaan viritetyllä vastaanottimella. RF-lähetin vastaanottaa sarjadataa mikrokontrollerista ja lähettää sen vastaanottimeen lähettimen 4. tappiin kytketyn antennin kautta. Vastaanotin vastaanottaa tiedot antennin kautta ja antaa tiedot siihen liitetylle mikrokontrollerille.

Nämä RF-moduulit toimivat tietyllä 433 MHz:n taajuudella. RF-signaalit voivat kulkea lähettimen ja vastaanottimen välillä silloinkin, kun siellä on este. Näitä moduuleja käytetään lyhyen kantaman, pienen budjetin, simplex-pohjaiseen viestintään. Alhainen virrankulutus tekee niistä ihanteellisia akkupohjaisia toteutuksia varten. Sitä käytetään eri aloilla, kuten valaistuksen kauko-ohjauksessa, pitkän kantaman RFID:ssä, langattomissa hälytys- ja turvajärjestelmissä jne. RF-viestintää käytetään mobiiliviestinnässä, ja sillä voi olla pitkän kantaman viestintä, mikä tekee niistä sopivia IoT-pohjaisten sovellusten rakentamiseen. Joten tässä aloitamme johdantoartikkelin RF-moduuleista ja siitä, miten RF-moduuleja voidaan käyttää Arduinon kanssa tietojen lähettämiseen ja vastaanottamiseen.

433 MHz RF-lähetinmoduuli

Tämä pieni moduuli on RF-lähetin. Se on hyvin yksinkertainen. SAW-resonaattori, joka on viritetty 433,xx MHz:n toimintaan, on moduulin sydän. Siinä on kytkentätransistori ja muutama passiivinen komponentti.

Kun DATA-syötteeksi annetaan looginen HIGH, oskillaattori on PÄÄLLÄ ja tuottaa jatkuvan RF-ulostulon kantoaallon 433,xx MHz:n taajuudella, ja kun DATA-syötteeksi annetaan looginen LOW, oskillaattori on POIS PÄÄLTÄ, joten kantoaaltoa ei tuoteta. Tätä tekniikkaa kutsutaan nimellä Amplitude Shift Keying (ASK).

Tekniset tiedot

  • Työjännite: 3V – 12V
  • Työskentelyvirta: max. alle 40mA ja min. 9mA
  • Resonanssitila: ASK
  • Työskentelytaajuus: 433.92MHz
  • Lähetysteho: 25mW
  • Taajuusvirhe: +150kHz (max)
  • Nopeus: alle 10Kbps
  • Lähetysalue: 90m (avoimessa tilassa)

433 MHz RF-vastaanotinmoduuli

Tämä on RF-vastaanotinmoduuli. Vaikka se näyttää monimutkaiselta, se on yhtä yksinkertainen kuin lähetinmoduuli. Se koostuu RF-viritinpiiristä, OP-vahvistimista ja PLL:stä. Pari OP-vahvistinta käytetään vahvistamaan lähettimestä vastaanotettua kantoaaltoa. Vahvistettu signaali syötetään sitten PLL:ään (Phase Lock Loop), jonka avulla dekooderi voi ”lukittua” digitaaliseen bittivirtaan, mikä antaa paremman dekoodatun ulostulon ja häiriönsietokyvyn.

Tekniset tiedot

  • Työskentelyjännite: 5.0VDC +0.5V
  • Työskentelyvirta:≤5.5mA max
  • Modulaatiotila: OOK/ASK
  • Työtaajuus: 433.92MHz
  • Kaistanleveys: 2MHz
  • Herkkyys:

Tarvittavat komponentit

  • Arduino Nano (2)
  • RF 433MHz lähetinmoduuli
  • RF 433MHz vastaanotinmoduuli
  • RF 433MHz vastaanotinmoduuli
  • .

  • Potentiometri
  • LED (5)
  • Kytkentäjohdot

Piirikaavio

Alhaalla on esitetty RF-lähettimen piirikaavio Arduino Nanoa käyttäen. Tässä potentiometri on kytketty vaihtelemaan vastaanottimeen lähetettäviä arvoja RF-lähettimen avulla.

Alhaalla ovat RF-lähettimen ja Arduinon väliset nastaliitännät

  • Arduinon D12-nasta – RF-lähettimen DATA-nasta
  • Arduinon VCC – RF-lähettimen VCC
  • Arduinon GND – RF-lähettimen GND
  • Arduinon GND – potentiometrin ensimmäinen tappi
  • Arduinon A2 tappi – potentiometrin toinen tappi
  • Arduinon VCC – potentiometrin kolmas tappi

Alhaalla on esitetty RF-vastaanottimen piirikaavio, jossa käytetään Arduino Nanoa. Tässä meillä on sarja LEDejä. LEDit siirtyvät vastaanottimen vastaanottamien potentiometriarvojen perusteella.

Alhaalla ovat RF-vastaanottimen ja Arduinon väliset nastakytkentätiedot

  • Arduinon D11-tappi – RF-vastaanottimen DATA-tappi.
  • Arduinon VCC – RF-vastaanottimen VCC.
  • Arduinon GND – RF-vastaanottimen GND.
  • LEDien positiiviset johdot on kytketty digitaalisiin nastoihin D2, D3, D4, D5 ja D6
  • LEDien negatiiviset johdot on maadoitettu.

Koodin selitys

Täydellinen Arduino-koodi sekä RF-lähettimen että vastaanottimen puolella annetaan tämän opetusohjelman lopussa, tässä selitämme täydellisen ohjelman ymmärtämään projektin toimintaa. Mutta ennen koodin aloittamista meidän on ensin asennettava yksi kirjasto Arduino IDE:hen.

Tässä käytämme virtuaalilankakirjastoa. Lataa virtual wire-kirjasto alla olevasta linkistä

https://www.resistorpark.com/content/Arduino_Libraries/Arduino_Wireless_Communication_Libraries/VirtualWire.zip

VirtualWire on Arduino-kirjasto, joka tarjoaa ominaisuuksia lyhyiden viestien lähettämiseen ilman osoitetta, kuittausta tai uudelleenlähetystä. Viestit lähetetään hieman UDP:n tapaan langattomasti käyttäen ASK:ta (amplitude shift keying). Tämä kirjasto tukee useita edullisia radiolähettimiä ja -vastaanottimia.

Lisätäksesi kirjaston Arduino IDE:ssä siirry kohtaan Sketch>>Include library>>Add .ZIP library ja lataa sitten yllä olevasta linkistä lataamasi kirjasto.

Ohjelman lataamisen jälkeen avaa sarjamonitori molemmilla puolilla ja näet ulostulot alla esitetyllä tavalla.

RF-lähetinosan ulostulo näyttää potentiometrin arvot.

Ja vastaanottimen ulostulo näyttää vastaanotetun anturin arvon. LEDit siirtyvät anturiarvojen vaihteluvälin mukaan. Tässä olemme antaneet kullekin LEDille 200:n vaihteluvälin.

Tällä tavalla Arduinoa voidaan siis käyttää RF-pohjaisessa viestinnässä, tarkista lisää Arduino-pohjaisia IoT-projekteja täältä.

Koodi

RF-lähettimen jakson koodi
#include <VirtualWire.h>
const int SensorPin = A2; // potentiometrin tappi
int SensorData;
char SensorCharMsg;
void setup()
{
pinMode(SensorPin,INPUT);
// debuggausta varten
Serial.begin(9600);
// VirtualWire setup
vw_setup(2000); // Bittiä sekunnissa
}
void loop()
{
// Luetaan ja tallennetaan Sensor 1:n tiedot
SensorData = analogRead(SensorPin);
// Muunna kokonaislukudata suoraan Char-matriisiksi
itoa(SensorData,SensorCharMsg,10);
// DEBUG
Serial.print(”Sensor Integer: ”);
Serial.print(SensorData); // tulostaa anturitiedot
Serial.print(” Sensor CharMsg: ”);
Serial.print(SensorCharMsg); // tulostaa char-joukon
Serial.println(” ”);
delay(100);
// END DEBUG
vw_send((uint8_t *)SensorCharMsg, strlen(SensorCharMsg)); // lähetä viesti
vw_wait_tx(); // odota, kunnes koko viesti on mennyt
delay(200);
} // END void loop

Koodi RF-vastaanotinosiolle
#include <VirtualWire.h>
int SensorData; // Sensors
char SensorCharMsg; // RF Transmission container
const int led1 = 2;
const int led2 = 3;
const int led3 = 4;
const int led4 = 5;
const int led5 = 6;
void setup()
{
Serial.begin(9600);
pinMode(led1, INPUT);
pinMode(led2, INPUT);
pinMode(led3, INPUT);
pinMode(led4, INPUT);
pinMode(led5, INPUT);
// VirtualWire
// IO:n ja ISR:n alustaminen
// Vaaditaan DR3100:lle
vw_set_ptt_inverted(true);
// Bittiä sekunnissa
vw_setup(2000);
// Vastaanottimen PLL:n käynnistäminen
vw_rx_start();
} // END void setup

void loop()
{
uint8_t buf;
uint8_t buflen = VW_MAX_MESSAGE_LEN;
// Ei-blokkaava
if (vw_get_message(buf, &buflen))
{
int i;
// Viestin, jossa on vastaanotettu hyvällä tarkistussummalla varustettu viesti, dumppaa se.
for (i = 0; i < buflen; i++)
{
// Täytä SensorCharMsg Char array vastaavilla
// merkeillä puskurista.
SensorCharMsg = char(buf);
}
// Nollaa char-matriisi
// Tämä on tehtävä, muuten tulee ongelmia
// kun saapuvissa viesteissä on vähemmän numeroita kuin
// edellisessä.
SensorCharMsg = ’\0’;
// Muunna Sensor1CharMsg Char array kokonaisluvuksi
SensorData = atoi(SensorCharMsg);
// DEBUG
Serial.print(”Sensor ”);
Serial.println(SensorData);
// END DEBUG
}
if (SensorData <= 200)
{
digitalWrite(led1, HIGH);
}
else
digitalWrite(led1, LOW);
if ( SensorData > 200 && SensorData <= 400)
{
digitalWrite(led2, HIGH);
}
else
digitalWrite(led2, LOW);
if ( SensorData > 400 && SensorData <= 600)
{
digitalWrite(led3, HIGH);
}
else
digitalWrite(led3, LOW);
if ( SensorData > 600 && SensorData <= 800)
{
digitalWrite(led4, HIGH);
}
else
digitalWrite(led4, LOW);
if ( SensorData > 800 && SensorData <= 1023)
{
digitalWrite(led5, HIGH);
}
else
digitalWrite(led5, LOW);
}
}

Video

.

Vastaa

Sähköpostiosoitettasi ei julkaista.