Từ những thập niên cuối của thế kỉ 19 sóng vô tuyến đã được khám phá và ứng dụng mạnh mẽ trong lĩnh vực truyền thông. Ngày nay, nhiều thiết bị truyền thông được ra đời phục vụ trong nhiều nhu cầu khác nhau.
Module RF315 với ưu điểm nhỏ gọn và giá thành thấp nhưng vẫn đáp ứng được nhu cầu truyền tải thông tin bằng sóng vô tuyến là một lựa chọn thích hợp cho việc học tập, nghiên cứu và ứng dụng trong các dự án nhỏ, để truyền nhận thông tin đơn giản.
Sóng vô tuyến và truyền thông bằng sóng vô tuyến là gì?
Một điện tích chuyển động sinh ra một điện trường và từ trường biến thiên xung quanh nó, lan truyền trong không gian gọi là sóng điện từ.
Sóng vô tuyến là một dạng sóng điện từ có bước sóng nằm trong phổ điện từ với tần số nằm trong khoảng 3 kHz đến 300 GHz, tương ứng với bước sóng 1mm đến 100 km và được truyền đi với vận tốc ánh sáng (trong môi trường chân không), có thể lan truyền đi trong môi trường không gian tự do và trên bề mặt Trái Đất nên được ứng dụng nhiều trong truyền thông vô tuyến.
Bản chất của dữ liệu là 1 dải mã nhị phân gồm các kí tự 0 và 1 nối tiếp nhau, vậy để truyền được dữ liệu đi chúng ta cần chuyển dải nhị phân đó thành 1 dạng tín hiệu có thể truyền đi được và nó phải có dao động (có dạng sóng) để bên nhận có thể phân biệt được các bit trong tín hiệu mà nó nhận được. Dạng tín hiệu sau khi được điều chế đó chính là sóng vô tuyến với một biên độ, tần số và pha xác định.
Để sử dụng sóng vô tuyến trong truyền thông cần 1 bộ điều chế sóng (theo một quy luật điều chế nhất định) sau đó phát tín hiệu đi và 1 ăng-ten thu tín hiệu, giải mã và cho ra thông tin ban đầu.
Module RF315 và thư viện hỗ trợ VitualWire
Demo Module thu phát RF315 với Arduino
Thành phần linh kiện
- 2 board Arduino.
- Module RF315 gồm 1 module phát (module nhỏ hơn có 3 chân) và 1 module thu (module lớn hơn có 4 chân).
- BreadBoard x 2.
- Dây dẫn.
Sơ đồ lắp đặt
Thư viện VitualWire và các hàm cơ bản
VitualWire là gì?
Arduino hỗ trợ thư viện VitualWire giúp cho việc sử dụng Module RF315 dễ dàng và đơn giản hơn.
Download thư viện tại đây, sau đó mở Arduino IDE, chọn Sketch → Import Library... → Add Library ... và chọn file .zip vừa tải về để cài đặt thư viện.
Các hàm config
vw_set_tx_pin(transmit_pin) | Chọn chân truyền data trên Arduino (mặc định là D12) |
vw_set_rx_pin(receice_pin) | Chọn chân nhận data trên Arduino (mặc định là D11) |
vw_set_ptt_pin(transmit_en_pin) | Chọn chân enable (mặc định là D10) |
vw_set_ptt_inverted(true) | Đảo giá trị cho chân enable |
vw_setup(bits_per_second) | Chọn tốc độ truyền nhận dữ liệu, lưu ý tốc độ truyền nhận dữ liệu của module thu và module phát phải bằng nhau |
Các hàm dùng cho việc truyền dữ liệu
vw_send(message, length) | Gửi 1 message là 1 mảng kiểu byte với length là độ dài của message |
vw_tx_active() | Trả về true nếu message đang được gửi và trả về false nếu như không nhận được message |
vw_wait_tx() | Chờ cho đến khi message gửi xong |
Các hàm dùng cho việc nhận dữ liệu
vw_rx_start() | Cho phép receiver module bắt đầu nhận tín hiệu |
vw_have_message() | Trả về true nếu message đã được gửi |
vw_wait_rx() | Chờ cho đến khi nhận xong message và trả về true |
vw_wait_rx_max(timeout_ms) | Chờ cho đến khi nhận xong message và trả về true hoặc trả về false khi thời gian chờ vượt quá timeout_ms |
vw_get_message(buf, &buflen) | Đọc message và độ dài của message được nhận gần nhất vào buf và buflen, với buf là 1 mảng kiểu byte |
vw_rx_stop() | Dừng cho phép nhận tín hiệu |
Code thử nghiệm
Code mẫu Module phát
#include <VirtualWire.h> #define LED_PIN 13; #define TRANSMIT_PIN 12; #define TRANSMIT_EN_PIN 10; #define SPEED 1024; void setup() { vw_set_ptt_pin(TRANSMIT_EN_PIN); vw_set_ptt_inverted(true); vw_setup(SPEED); vw_set_tx_pin(TRANSMIT_PIN); pinMode(LED_PIN, OUTPUT); } void loop() { char msg[5] = {'S','T','D','I','O'}; digitalWrite(LED_PIN, HIGH); vw_send((byte *)msg, 5); vw_wait_tx(); digitalWrite(LED_PIN, LOW); delay(1000); }
Code mẫu module thu
#include <VirtualWire.h> #define RECEIVE_PIN 11; #define SPEED 1024; byte msg[VW_MAX_MESSAGE_LEN]; byte msgLen = VW_MAX_MESSAGE_LEN; void setup() { Serial.begin(9600); Serial.println("Ready........."); vw_setup(SPEED); vw_set_rx_pin(RECEIVE_PIN); vw_rx_start(); } void loop() { if (vw_have_message()) { vw_wait_rx(); vw_get_message(msg, &msgLen); Serial.print("Got: "); for (int i = 0; i < msgLen; i++) { Serial.write(msg[i]); } Serial.println(); } }