Moduł RF składa się z nadajnika i odbiornika RF 433 MHz. Są to moduły RF typu ASK (Amplitude shift keying) lub OOK (Of Hook Keying). Podczas nadawania logicznego zera nadajnik całkowicie tłumi częstotliwość nośną, a tym samym zużywa tylko niewielką ilość energii w trybie pracy bateryjnej. Gdy nadawana jest logiczna jedynka, nadajnik jest włączony, a częstotliwość nośna jest pełna i stąd będzie duże zasilanie, które jest w zakresie około 4,5mA przy zasilaniu 3V.
Nadajnik i odbiornik są potrzebne do współpracy z mikrokontrolerami w celu przesyłania danych. Dane są wysyłane szeregowo z nadajnika i są odbierane przez dostrojony odbiornik. Nadajnik RF otrzymuje dane szeregowe z mikrokontrolera i wysyła je do odbiornika poprzez antenę podłączoną do 4. pinu nadajnika. Odbiornik odbiera dane przez antenę i podaje dane do mikrokontrolera podłączonego do niego.
Te moduły RF działają na określonej częstotliwości 433MHz. Sygnały RF może podróżować między nadajnikiem a odbiornikiem, nawet gdy istnieje przeszkoda. Moduły te są wykorzystywane do krótkiego zasięgu, low- budżet, simplex opartej komunikacji. Niskie zużycie energii czyni je idealnym rozwiązaniem dla baterii opartych wdrożeń. Jest on stosowany w różnych dziedzinach, takich jak zdalne sterowanie oświetleniem, daleki zasięg RFID, bezprzewodowe systemy alarmowe i bezpieczeństwa itp. Komunikacja RF jest używana w komunikacji mobilnej i może mieć długą komunikację rage i to jest to, co czyni je odpowiednimi do budowania aplikacji opartych na IoT. Więc tutaj zaczynamy z artykułem wprowadzającym o modułach RF i jak moduły RF mogą być używane z Arduino do wysyłania i odbierania danych.
433 MHz RF Transmitter Module
Ten mały moduł jest nadajnikiem RF. Jego budowa jest bardzo prosta. Sercem modułu jest rezonator SAW, który jest dostrojony do pracy na częstotliwości 433,xx MHz. Jest tranzystor przełączający i kilka elementów pasywnych na nim.
Gdy logika HIGH jest podana jako wejście DATA, oscylator jest włączony i produkuje stałą falę nośną RF na 433.xx MHz, a gdy wejście DATA jest logika LOW, oscylator jest wyłączony, więc nie nośna jest produkowany. Technika ta jest nazywana Amplitude Shift Keying (ASK).
Specyfikacja
- Napięcie robocze: 3V – 12V
- Prąd roboczy: max Mniej niż 40mA, a min 9mA
- Tryb rezonansowy: (SAW)
- Tryb modulacji: ASK
- Częstotliwość pracy: 433.92MHz
- Moc nadawcza: 25mW
- Błąd częstotliwości: +150kHz (max)
- Prędkość: mniej niż 10Kbps
- Zasięg transmisji: 90m (w otwartej przestrzeni)
Moduł odbiornika RF 433 MHz
To jest moduł odbiornika RF. Mimo że wygląda na skomplikowany, jest równie prosty jak moduł nadajnika. Składa się z układu tunera RF, wzmacniaczy OP i PLL. Kilka wzmacniaczy OP służy do wzmocnienia fali nośnej odbieranej z nadajnika. Wzmocniony sygnał jest następnie podawany do PLL (Phase Lock Loop), który umożliwia dekoderowi „zablokowanie” na strumieniu bitów cyfrowych, co daje lepiej zdekodowane wyjście i odporność na zakłócenia.
Specyfikacje
- Napięcie robocze: 5.0VDC +0.5V
- Prąd roboczy:≤5.5mA max
- Tryb modulacji: OOK/ASK
- Częstotliwość pracy: 433.92MHz
- Pasmo przenoszenia: 2MHz
- Czułość: przekracza -100dBm (50Ω)
Wymagane komponenty
- Arduino Nano (2)
- Moduł nadajnika RF 433MHz
- Moduł odbiornika RF 433MHz
- Moduł odbiornika RF 433MHz
- Potencjometr
- LED (5)
- Przewody połączeniowe
.
Schemat połączeń
Schemat obwodu dla nadajnika RF przy użyciu Arduino Nano jest podany poniżej. Tutaj podłączony jest potencjometr, aby zmieniać wartości, które mają być wysyłane do odbiornika za pomocą nadajnika RF.
Poniżej są szczegóły połączeń pinów pomiędzy nadajnikiem RF i Arduino
- Pin D12 Arduino – pin DATA nadajnika RF
- VCC Arduino – VCC nadajnika RF
- GND Arduino – GND nadajnika RF
- GND układu Arduino – pierwszy pin potencjometru
- A2 układu Arduino – drugi pin potencjometru
- VCC układu Arduino – trzeci pin potencjometru
Schemat układu dla odbiornika RF przy użyciu Arduino Nano jest pokazany poniżej. Mamy tu szereg diod LED. Diody LED są przesuwane na podstawie wartości potencjometru odbieranych przez odbiornik.
Poniżej znajdują się szczegóły połączeń pinów pomiędzy odbiornikiem RF a Arduino
- Pin D11 Arduino – pin DATA odbiornika RF.
- VCC Arduino – VCC odbiornika RF.
- GND Arduino – GND odbiornika RF.
- Dodatnie wyprowadzenia diod LED są podłączone do pinów cyfrowych D2, D3, D4, D5, i D6
- Ujemne wyprowadzenia diod LED są uziemione.
Objaśnienie kodu
Kompletny kod Arduino dla nadajnika i odbiornika RF jest podany na końcu tego tutoriala, tutaj wyjaśniamy kompletny program, aby zrozumieć działanie projektu. Ale przed rozpoczęciem pracy z kodem najpierw musimy zainstalować jedną bibliotekę w Arduino IDE.
Tutaj używamy biblioteki virtual wire. Pobierz bibliotekę virtual wire z poniższego linku
https://www.resistorpark.com/content/Arduino_Libraries/Arduino_Wireless_Communication_Libraries/VirtualWire.zip
VirtualWire jest biblioteką Arduino, która udostępnia funkcje do wysyłania krótkich wiadomości, bez adresowania, potwierdzania czy retransmisji. Wiadomości wysyłane są trochę jak UDP drogą bezprzewodową z wykorzystaniem ASK (amplitude shift keying). Biblioteka ta obsługuje wiele niedrogich nadajników i odbiorników radiowych.
Aby dodać bibliotekę w Arduino IDE przejdź do Sketch>>Include library>>Add .ZIP library a następnie wgraj bibliotekę, którą pobrałeś z powyższego linku.
Po wgraniu programu otwórz monitor szeregowy po obu stronach i zobaczysz wyjścia jak na rysunku poniżej.
Wyjście na sekcji nadajnika RF pokazuje wartości potencjometru.
A wyjście na odbiorniku pokazuje odebraną wartość czujnika. Diody LED są przesunięte w zależności od zakresu wartości czujnika. Tutaj podaliśmy zakres 200 dla każdej diody.
Więc w ten sposób Arduino może być użyte w komunikacji opartej na RF, sprawdź więcej projektów IoT opartych na Arduino tutaj.
Kod dla sekcji nadajnika RF
#include <VirtualWire.h>
const int SensorPin = A2; // pin potencjometru
int SensorData;
char SensorCharMsg;
void setup()
{
pinMode(SensorPin,INPUT);
//do debugowania
Serial.begin(9600);
/// VirtualWire setup
vw_setup(2000); // Bity na sekundę
}
void loop()
{
// Odczyt i zapis danych z czujnika 1
SensorData = analogRead(SensorPin);
// Konwertuj dane całkowite na tablicę Char bezpośrednio
itoa(SensorData,SensorCharMsg,10);
// DEBUG
Serial.print(„Sensor Integer: „);
Serial.print(SensorData); //wydrukuj dane z czujnika
Serial.print(” Sensor CharMsg: „);
Serial.print(SensorCharMsg); //wydrukuj tablicę znaków
Serial.println(” „);
delay(100);
// END DEBUG
vw_send((uint8_t *)SensorCharMsg, strlen(SensorCharMsg)); //wyślij wiadomość
vw_wait_tx(); //poczekaj aż cała wiadomość zniknie
delay(200);
} // END void loop
Kod dla sekcji odbiornika RF
#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
// Inicjalizacja IO i ISR
// Wymagane dla DR3100
vw_set_ptt_inverted(true);
// Bity na sekundę
vw_setup(2000);
// Uruchomienie PLL odbiornika
vw_rx_start();
} // END void setup
void loop()
{
uint8_t buf;
uint8_t buflen = VW_MAX_MESSAGE_LEN;
// Non-blocking
if (vw_get_message(buf, &buflen))
{
int i;
// Wiadomość z dobrą sumą kontrolną otrzymana, zrzuć ją.
for (i = 0; i < buflen; i++)
{
// Wypełnij tablicę znaków SensorCharMsg odpowiednimi
// znakami z bufora.
SensorCharMsg = char(buf);
}
// Null terminate the char array
// To musi być zrobione w przeciwnym razie wystąpią problemy
// gdy przychodzące wiadomości będą miały mniej cyfr niż poprzednie
//.
SensorCharMsg = '\0′;
// Konwertuj tablicę znaków Sensor1CharMsg na liczbę całkowitą
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);
}
.