24 C
Hanoi
Thứ Bảy, Tháng Năm 21, 2022
Home LẬP TRÌNH VI ĐIỀU KHIỂN ARDUINO Truyền nhận dữ liệu không dây Arduino với NRF24L01

Truyền nhận dữ liệu không dây Arduino với NRF24L01

Giới thiệu về module NRF24L01

Module NRF24L01 là một module truyền nhận dữ liệu nâng cao với khả năng kết nối point-to-point (2 node mạng), hoặc network (mạng lưới nhiều node mạng), sử dụng sóng radio 2.4GHz. Khoảng cách đạt được của module không khuếch đại công suất trong không gian không vật cản là 100m và của module có khuếch đại công suất lên tới 1km.
Có khả năng truyền tín hiệu 2 chiều. Tức là một module vừa có thể là transmitter vừa có thể là receiver. Khác biệt so với loại 433Mhz là phải có 2 module riêng biệt.

Ứng dụng:

 – Bàn phím, chuột không dây
– Game controller
– Điều khiển từ xa 
– Nhà thông minh và tự động hóa
– Hệ thống giám sát không dây
– Hệ thống cảm biến tiết kiệm điện
– Internet of Things…

  • Điện áp hoạt động: 1.9V – 3.6V. Để module hoạt động ổn định, bạn có thể nối thêm tụ hóa 10uF giữa 2 chân nguồn và GND.
  • Có sẵn anthena tần số 2.4GHz.
  • Truyền được 100m trong môi trường mở với 250kbps baud.
  • Tốc độ truyền dữ liệu qua sóng: 250kbps to 2Mbps.
  • Tự động bắt tay (Auto Acknowledge).
  • Tự động truyền lại khi bị lỗi (auto Re-Transmit).
  • Multiceiver – 6 Data Pipes.
  • Bộ đệm dữ liệu riêng cho từng kênh truyền nhận: 32 Byte separate TX and RX FIFOs.
  • Các chân IO đều chịu được điện áp vào 5V, tương thích với Arduino.
  • Lập trình được kênh truyền sóng trong khoảng 2400MHz đến 2525MHz (chọn được 125 kênh).
  • Thứ tự chân giao tiếp : GND,VCC,CS,CSN,SCK,MOSI,MISO,IQR

o Modul nRF24L01 hoạt động ở tần số sóng ngắn 2.4G nên Modul này khả năng truyền dữ liệu tốc độ cao và truyền nhận dữ liệu trong điều kiện môi trường có vật cản
o Modul nRF24L01 có 126 kênh truyền. Điều này giúp ta có thể truyền nhận dữ liệu trên nhiều kênh khác nhau.
o Modul khả năng thay đổi công suất phát bằng chương trình, điều này giúp nó có thể hoạt động trong chế độ tiết kiệm năng lượng.
o Chú ý: Điện áp cung cấp cho là 1.9V đến 3.6V. Điện áp thường cung cấp là 3.3V. Nhưng các chân IO tương thích với chuẩn 5V. Điều này giúp nó giao tiếp rộng dãi với các dòng vi điều khiển.

PinTênChức năngMô tả
1CENgõ vào sốPin chọn mode TX hoặc RX
2CSNNgõ vào sốPin chọn chip SPI
3SCKNgõ vào sốPin clock SPI
4MOSINgõ vào sốSPI Slave Data input
5MISONgõ ra sốSPI Slave Data output, với 3 lựa chọn
6IRQNgõ ra sốPin kết nối ngắt, tích cực mức thấp

Ví dụ mẫu

Thư viện: Giải nén và copy vào đường dẫn C:\Users\….\Documents\Arduino\libraries
DHT11.zip: https://drive.google.com/file/d/14GnUyMSq2JXlwt9qINFMeNs1LQm27c7z/view?usp=sharing
nRF24L01.zip: https://drive.google.com/file/d/1_UlFKZ9Pv30j9uzWLI85d_RjAbbGnTwO/view?usp=sharing
RF24.zip: https://drive.google.com/file/d/1-vZK7nLH6rZTQSfuyS97kTus2ISNmc8i/view?usp=sharing

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.

Code gửi dòng “Hello World”

/*
* Arduino Wireless Communication Tutorial
*     Example 1 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* 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(&amp;text, sizeof(text)); //Gửi dữ liệu có trong mảng text
  delay(1000);
}

Code nhận thông tin và gửi thông tin đó lên Serial

/*
* Arduino Wireless Communication Tutorial
*       Example 1 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* 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(&amp;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 module NRF24L01, đo nhiệt độ độ ẩm DHT11

Kết nối module NRF24L01 ở cả 2 bên như sau:

MISO: pin 12 của Arduino UNO
MOSI: pin 11 của Arduino UNO
SCK: pin 13 của Arduino UNO
CE: pin 8 của Arduino UNO
CSN: 9 của Arduino UNO
GND và VCC: GND và 3.3V của Arduino UNO

Code bên DHT11:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <DHT11.h>
 
int pin = A0;
DHT11 dht11(pin);
float temperature[2];
 
double Fahrenheit(double celsius) {
return ((double)(9 / 5) * celsius) + 32;
}
 
double Kelvin(double celsius) {
return celsius + 273.15;
}
 
RF24 radio(8, 9);
const uint64_t pipe = 0xE8E8F0F0E1LL;
 
void setup(void) {
radio.begin();
radio.openWritingPipe(pipe);
}
 
void loop(void)
{
float temp, humi;
dht11.read(humi, temp);
temperature[0] = temp;
temperature[1] = humi;
radio.write(temperature, sizeof(temperature));
delay(1000);
}

Code bên màn hình LCD16x02:

#include <nRF24L01.h>
#include <RF24.h>
#include <DHT11.h>
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
 
 
float temperature[2];
 
RF24 radio(8, 9);
const uint64_t pipe = 0xE8E8F0F0E1LL;
 
void setup(void) 
{
  Serial.begin(9600);
  lcd.begin(16, 2);
 
  radio.begin();
  radio.openReadingPipe(1, pipe);
  radio.startListening();
 
 
  lcd.print("Humidity & temp");
  delay(2000);
  lcd.clear();
  lcd.print("Starting.....");
  delay(2000);
}
 
void loop(void)
{
  if ( radio.available() )
{
  bool done = false;
  while (!done)
{
  done = radio.read(temperature, sizeof(temperature));
  lcd.clear();
  delay(500);
 
  lcd.setCursor(0, 0);
  lcd.print("Temp");
  lcd.setCursor(0, 1);
  lcd.print("Humidity");
  lcd.setCursor(9, 0);
  lcd.print(temperature[0]);
  lcd.print(" C");
  lcd.setCursor(9, 1);
  lcd.print(temperature[1]);
  lcd.print(" %");
  delay(1000);
}
}
  else
{
  lcd.setCursor(0, 0);
  lcd.print("No radio Found");
}
}

Truyền nhận 2 chiều sử dụng NRF24L01 điều khiển động cơ Servo

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ở

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* 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(&amp;angleValue, sizeof(angleValue));
  delay(5);
  radio.startListening();
  while (!radio.available());
  radio.read(&amp;buttonState, sizeof(buttonState));
  if (buttonState == HIGH) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}

Code module 1: Kết nối với động cơ servo

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* 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(&amp;angleV, sizeof(angleV));
      myServo.write(angleV);
    }
    delay(5);
    radio.stopListening();
    buttonState = digitalRead(button);
    radio.write(&amp;buttonState, sizeof(buttonState));
  }
}

Tham khảo: https://espace.edu.vn/

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Lựa chọn Stack-up cho PCB

Bước 1: Chọn số lượng lớp dự định ban đầu 1 hoặc 2 lớp – Đối với mạch thử nghiệm Sử dụng 1 hoặc 2 lớp...

Via và khả năng mang dòng điện trên PCB

Via bao gồm 3 thành phần: Conductive barrel: Lỗ khoan được mạ dẫn điện Pad: Phần đồng dẫn điện ở 2 đầu của một lỗ via. Antipad:...

Các vấn đề thiết kế PCB mật độ cao HDI

PCB kết nối mật độ cao (High-density interconnect HDI) thể hiện sự tiên tiến của ngành công nghiệp bảng mạch in ngày nay, do...

Ground và vấn đề thiết kế PCB

Các nhà thiết kế layout PCB luôn quan tâm đến những câu hỏi nổi bật này, như làm thế nào để lập kế hoạch...

Recent Comments