Giới thiệu module NRF24L01
Module thu phát không dây nRF24L01 hoạt động theo giao thức SPI, SPI là chuẩn truyền thông nối tiếp tốc độ cao. Đây là kiểu truyền thông Master-Slave, trong đó có 1 chip Master điều phối quá trình tuyền thông và các chip Slaves được điều khiển bởi Master vì thế truyền thông chỉ xảy ra giữa Master và Slave.
SPI là một cách truyền song công (full duplex) nghĩa là tại cùng một thời điểm quá trình truyền và nhận có thể xảy ra đồng thời. SPI đôi khi được gọi là chuẩn truyền thông “4 dây” vì có 4 đường giao tiếp trong chuẩn này đó là SCK (Serial Clock), MISO (Master Input Slave Output), MOSI (Master Ouput Slave Input) và SS (Slave Select).
NRF24L01 hoạt động ở giải tần số 2,4GHz và có khả năng truyền tín hiệu 2 chiều, tức là 1 module có thể là transmitter vừa có thể là receiver.
Lưu ý: Cấp nguồn cho module sử dụng điện áp từ 1.9 – 3.6V
Hình ảnh một số module NRF24L01 trên thị trường:
Module NRF24I01 loại thường, có khoảng cách thu phát khoảng 100m, khoảng 30-50m trong nhà.
NRF24L01+PA+LNA được thiết kế với bộ khuyếch đại công suất và anten SMA giúp tăng khoảng cách liên lạc không dây lên đến 1Km trong điều kiện không có vật cản.
Mạch thu phát RF NRF24L01 mini được sử dụng để truyền nhận dữ liệu không dây qua sóng RF 2.4GHZ, mạch có thiết kế nhỏ gọn, độ bền cao, khoảng cách tối đa 100m.
Sơ đồ nối dây Arduino và NRF24L01
Do module kết nối với Arduino theo chuẩn truyền SPI nên bắt buộc ta phải kết nối 3 chân của module vào đúng 3 chân: MOSI, MISO, SCK của Arduino như hình bên dưới. 2 chân CE và CSN có thể thay đổi sang chân bất kỳ của Arduino.

Sơ đồ kết nối với Arduino
Ví dụ kết nối với các loại Arduino khác:
Code mẫu truyền và nhận 1 chiều của NRF24L01
Trước khi bắt đầu, bạn cần download thư viện NRF24L01 tại đây.
Code bên phát để truyền dòng “Hello World”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
* * Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(9, 10); // Chọn chân kết nối CE, CSN const byte address[6] = "00001" ; // Địa chỉ cần truyền void setup() { radio.begin(); radio.openWritingPipe(address); // Set địa chỉ truyền radio.setPALevel(RF24_PA_MIN); // Set chế độ hoạt động radio.stopListening(); // Đặt module NRF24L01 ở chế độ phát } void loop() { const char text[] = "Hello World" ; radio.write(&text, sizeof (text)); //Gửi dữ liệu có trong mảng text delay(1000); } |
Code bên nhận thông tin và gửi thông tin đó lên Serial
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(9, 10); // Chọn chân kết nối CE, CSN const byte address[6] = "00001" ; // Địa chỉ nhận void setup() { Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); // Set địa chỉ nhận radio.setPALevel(RF24_PA_MIN); // Set chế độ hoạt động radio.startListening(); // Set module NRF24L01 ở chế độ thu } void loop() { if (radio.available()) { // Kiểm tra có dữ liệu thu được hay không? char text[32] = "" ; radio.read(&text, sizeof (text)); // Đọc dữ liệu thu được Serial.println(text); // Chuyển dữ liệu lên cổng Serial } } |
Truyền nhận 2 chiều sử dụng NRF24L01
Lúc này ta đặt 1 module phát ở địa chỉ 00001 và thu ở địa chỉ 00002. Module thứ 2 đặt ngược lại là phát ở địa chỉ 00002 và thu ở địa chỉ 00001. Sau khi phát sẽ đặt ngay về chế độ thu.
Sơ đồ kết nối của 2 module:
Code module 1: Kết nối với biến trở
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
* * Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define led 12 RF24 radio(9, 10); // CE, CSN const byte addresses[][6] = { "00001" , "00002" }; boolean buttonState = 0; void setup() { pinMode(12, OUTPUT); radio.begin(); radio.openWritingPipe(addresses[1]); // 00002 radio.openReadingPipe(1, addresses[0]); // 00001 radio.setPALevel(RF24_PA_MIN); } void loop() { delay(5); radio.stopListening(); int potValue = analogRead(A0); int angleValue = map(potValue, 0, 1023, 0, 180); radio.write(&angleValue, sizeof (angleValue)); delay(5); radio.startListening(); while (!radio.available()); radio.read(&buttonState, sizeof (buttonState)); if (buttonState == HIGH) { digitalWrite(led, HIGH); } else { digitalWrite(led, LOW); } } |
Code module 2: Kết nối với servo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
* * Library: TMRh20/RF24, https://github.com/tmrh20/RF24/ */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> #define button 4 RF24 radio(7, 8); // CE, CSN const byte addresses[][6] = { "00001" , "00002" }; Servo myServo; boolean buttonState = 0; void setup() { pinMode(button, INPUT); myServo.attach(5); radio.begin(); radio.openWritingPipe(addresses[0]); // 00001 radio.openReadingPipe(1, addresses[1]); // 00002 radio.setPALevel(RF24_PA_MIN); } void loop() { delay(5); radio.startListening(); if ( radio.available()) { while (radio.available()) { int angleV = 0; radio.read(&angleV, sizeof (angleV)); myServo.write(angleV); } delay(5); radio.stopListening(); buttonState = digitalRead(button); radio.write(&buttonState, sizeof (buttonState)); } } |