25 C
Hanoi
Chủ Nhật, Tháng Chín 25, 2022

THIẾT KẾ PHẦN CỨNG - NHẬN THIẾT KẾ ĐIỆN TỬ CHO SẢN PHẨM PHẦN CỨNG SỐ, IOT, CÔNG NGHIỆP,...

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

Chia sẻ PCB KIT ESP32

Mạch nguyên lý schemaic: Download toàn bộ project phần mềm Altium: DOWNLOAD Một vài hình ảnh thiết kế trên Altium:

Chia sẻ PCB Ethernet Gigabit Switch 5 Port

Mạch nguyên lý Schematic: DOWNLOAD ALTIUM PROJECT Một số hình ảnh 3D và 2D của mạch: Lớp TOP: Lớp 2: Lớp 3:Lớp Bottom:

Chia sẻ PCB mạch Hub USB2.0 dùng FE1.1S

DOWNLOAD PROJECT (ALTIUM) Mạch thiết kế trên phần mềm Altium, 2 lớp, dùng cho mục đích thử nghiệm.

Chia sẻ PCB nguồn công nghiệp VRB2405YMD-20WR3

Công suất đầu ra 20 Vin (VDC) 18~36 Vout (VDC) 5 Số đầu ra 1 Điện áp cách ly 1500     DOWNLOAD  

Recent Comments