Ứng dụng: Truyền dữ liệu không dây, điều khiển từ xa, Mạng nội bộ đơn giản.

#nRF24L01 #rf #khongday #dieukhientuxa #cachcaithuvienarduino

Các môđun RF này rất phổ biến trong các ứng dụng Arduino. NRF24L01 là được sử dụng nhiều trên ứng dụng yêu cầu điều khiển không dây. Đây là các bộ thu phát có nghĩa là mỗi mô-đun có thể truyền và nhận dữ liệu. Các mô-đun này rất rẻ và bạn có thể sử dụng chúng với bất kỳ vi điều khiển (MCU) nào.
[upl-image-preview url=https://making.vn/assets/files/2020-05-05/1588664382-932803-image.png]

Thông số kỹ thuật nRF24L01 - Bộ thu phát RF 2.4GHz

  • IC thu phát đơn tần 2,4 GHz GFSK RF đơn chip (GFSK: Gaussian frequency-shift keying truyền đi bằng hình thức biến đổi tần số Gaussian ).
    [upl-image-preview url=https://making.vn/assets/files/2020-05-05/1588664898-409798-image.png]

  • Phạm vi với Anten: Tốc độ 250Kb (không vật cản)> 1000 mét

  • Công suất: Tiêu thụ điện năng cực thấp

  • Điện áp đầu vào: 3,3V

  • Chân: dung sai 5V

Lập trình NRF24L01 với Arduino

Thư viện được sử dụng trong chương trình này là: http://www.airspayce.com/mikem/arduino/RadioHead/RadioHead-1.46.zip
Bạn cần cài đặt chương trình này trước.
Các chân của nRF24L01
[upl-image-preview url=https://making.vn/assets/files/2020-05-05/1588665114-337984-image.png]

CHÚ Ý ĐIỆN ÁP CẤP CHO MODULE LÀ 3.3V NẾU KHÔNG nRF24L01 SẼ BỊ CHÁY

Sau khi cài thư viện xong, Bạn vào Arduino IDE

File -> Examples -> RadioHead -> nrf24 -> nrf24_client

Ở đây là có 1 bộ phát nrf24_client, và 1 bộ chủ nrf24_server

Cách đấu nối với Arduino dành cho nrf24_client
[upl-image-preview url=https://making.vn/assets/files/2020-05-05/1588665144-346999-image.png]

Chương trình ở nrf24_client.

// nrf24_client

#include <SPI.h>
#include <RH_NRF24.h>

RH_NRF24 nrf24;

void setup() 
{
  Serial.begin(9600);
  if (!nrf24.init())
    Serial.println("Khoi dong nrf24 bi loi");
  // Mặc định đặt ở tần số 2.402 GHz (Kênh 2), 2Mbps, 0dBm
  if (!nrf24.setChannel(1))
    Serial.println("setChannel bi loi");
  if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
    Serial.println("setRF loi");    
}


void loop()
{
  Serial.println("Gui du lieu sang nrf24_server");
  // Gửi dữ liệu -Hello World!- sang server
  uint8_t data[] = "Hello World!";
  nrf24.send(data, sizeof(data));
  
  nrf24.waitPacketSent();
  // Chờ nrf24_server trả lời
  uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

  if (nrf24.waitAvailableTimeout(500))
  { 
    // Chờ trả lời
    if (nrf24.recv(buf, &len))
    {
      Serial.print("Nhan duoc tra loi: ");
      Serial.println((char*)buf);
    }
    else
    {
      Serial.println("recv loi");
    }
  }
  else
  {
    Serial.println("Khong nhan duoc tra loi, Ban can phai bat nrf24_server de nhan du lieu");
  }
  delay(400);
}

Sơ đồ nối dây cho nrf24_server
[upl-image-preview url=https://making.vn/assets/files/2020-05-05/1588665741-476529-image.png]
Chương trình mẫu nrf24_server
File -> Examples -> RadioHead -> nrf24 -> nrf24_server

// nrf24_server

#include <SPI.h>
#include <RH_NRF24.h>

// Singleton instance of the radio driver
RH_NRF24 nrf24;
// RH_NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf
// RH_NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin
// RH_NRF24 nrf24(8, 7); // For RFM73 on Anarduino Mini

void setup() 
{
  Serial.begin(9600);
  while (!Serial) 
    ; // wait for serial port to connect. Needed for Leonardo only
  if (!nrf24.init())
    Serial.println("init failed");
  // Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
  if (!nrf24.setChannel(1))
    Serial.println("setChannel failed");
  if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
    Serial.println("setRF failed");    
}

void loop()
{
  if (nrf24.available())
  {
    // Should be a message for us now   
    uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    if (nrf24.recv(buf, &len))
    {
//      NRF24::printBuffer("request: ", buf, len);
      Serial.print("Nhan duoc yeu cau: ");
      Serial.println((char*)buf);
      
      // Send a reply
      uint8_t data[] = "Va tra loi: hi you!";
      nrf24.send(data, sizeof(data));
      nrf24.waitPacketSent();
      Serial.println("Sent a reply");
    }
    else
    {
      Serial.println("recv failed");
    }
  }
}

Mạch kết nối rất tốt khi máy thu và máy phát khá gần nhau. nếu bạn tách chúng ra quá xa, bạn sẽ mất liên lạc.
Phạm vi giao tiếp sẽ thay đổi. Nó phụ thuộc vào mức độ nhiễu của môi trường, bạn cần dùng Anten đặt ngoài trời để kết nối được tốt hơn !.