Interfacing NRF24L01 Transceiver Module with STM32 Tx/Rx
Giao diện mô-đun thu phát NRF24L01 với STM32 Tx / Rx
Tổng quát
Trong bài này, chúng ta sẽ tìm hiểu Giao diện của Mô-đun thu phát không dây NRF24L01 với Vi điều khiển STM32. Chúng tôi sẽ tạo một mạch Người gửi và Người nhận bằng cách sử dụng một cặp Bo mạch Bluepill NRF24L01 + STM32F103C. NRF24L01 được sử dụng trên nhiều loại ứng dụng cần điều khiển không dây. Chúng là bộ thu phát cho thấy rằng mọi mô-đun đều 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 nào như Arduino hoặc STM32F103C.
Chúng tôi sẽ kết nối Mô-đun NRF24L01 với STM32 và sử dụng một số mã ví dụ, chúng tôi sẽ xây dựng một mạng không dây. Trong ví dụ đầu tiên, chúng tôi sẽ gửi một văn bản đơn giản “Xin chào thế giới” từ Máy phát đến Máy nhận. Trong ví dụ thứ hai, chúng ta sẽ giao diện Cảm biến áp suất khí quyển BME280 với STM32 & NRF24L01. Sau đó, chúng tôi sẽ gửi dữ liệu Độ ẩm, Nhiệt độ, Áp suất & Độ cao từ Máy phát / Người gửi đến Người nhận.
vật liệu
Chúng tôi cần các thành phần sau cho hướng dẫn này. Tất cả các thành phần có thể được mua dễ dàng từ Amazon. Liên kết mua linh kiện được đưa ra bên dưới.
S.N. | COMPONENTS NAME | DESCRIPTION | QUANTITY | |
---|---|---|---|---|
1 | STM32 Microcontroller | STM32F103C Bluepill Board | 2 | |
2 | NRF24L01 | NRF24L01+PA+LNA | 2 | |
3 | Barometric Pressure Sensor | BME280 | 1 | |
4 | Power Supply | 5V DC Adapter or 3.7V Battery | 2 | |
5 | Connecting Wires | Jumper Wires | 20 | |
6 | Breadboard | - | 1 |
2 Loại module sau như 1.
NRF24L01 là một mô-đun thu phát không dây, tức là mỗi mô-đun đều có thể gửi và nhận dữ liệu. Nó hoạt động trong tần số 2,4GHz. Tần số này thuộc băng tần ISM và được sử dụng hợp pháp ở hầu hết các quốc gia cho các dự án kỹ thuật. Các mô-đun khi hoạt động hiệu quả có thể bao phủ khoảng cách 100 mét.
Phiên bản thứ hai của mô-đun này, tức là nRF24L01 PA + LNA đi kèm với đầu nối SMA, ăng-ten mỏ vịt & chip RFX2401C đặc biệt tích hợp PA + LNA. Chip mở rộng phạm vi này cùng với một ăng-ten vịt giúp mô-đun đạt được phạm vi truyền dẫn lớn hơn đáng kể, khoảng 1000m. PA là viết tắt của Power Amplifier giúp tăng sức mạnh của tín hiệu được truyền từ chip nRF24L01 +. LNA là viết tắt của Low-Noise Amplifier lấy tín hiệu cực kỳ yếu và không chắc chắn từ ăng-ten và khuếch đại nó lên một mức hữu ích hơn.
Mô-đun hoạt động ở 3.3V nhưng chân SPI của nó có thể chịu được 5V. Mỗi mô-đun có dải địa chỉ là 125 và mọi mô-đun có thể giao tiếp với 6 mô-đun khác do đó có thể thiết lập mạng lưới với mô-đun này. Mô-đun NRF24L01 hoạt động với sự trợ giúp của giao tiếp SPI do đó bạn có thể sử dụng NRF24L01 với bất kỳ bộ vi điều khiển nào có Chân SPI như Bảng mạch STM32 hoặc Arduino.
Nếu bạn muốn tìm hiểu thêm về mô-đun này, thì bạn có thể theo dõi các dự án trước đây của chúng tôi dựa trên Mô-đun nRF24L01:
1. Giám sát dữ liệu cảm biến không dây với nRF24L01 & Arduino: Kiểm tra tại đây
2. Wifi Gateway & Node cảm biến với nRF24L01 Arduino & ESP8266: Kiểm tra tại đây
Interfacing NRF24L01 Transceiver Module with STM32
Bây giờ chúng ta hãy giao tiếp Mô-đun thu phát NRF24L01 với vi điều khiển STM32 và xây dựng bộ phát và bộ thu của riêng chúng tôi. Sơ đồ cho mạch phát và mạch thu được đưa ra dưới đây. Bạn có thể lắp ráp một cặp mạch trên breadboard.
The connection between NRF24L01 & STM32F103C Bluepill Boards is given below.
NRF24L01 CSN ………………………………………… PA4 of STM32F103C
NRF24L01 MOSI ………………………………………… PA7 of STM32F103C
NRF24L01 GND ………………………………………… GND of STM32F103C
NRF24L01 CE ………………………………………… PB0 of STM32F103C
NRF24L01 SCK ………………………………………… PA5 of STM32F103C
NRF24L01 MISO ………………………………………… PA6 of STM32F103C
NRF24L01 STM32 Library
Bảng STM32 không hỗ trợ Thư viện RadioHead nRF24L01 (#include <RH_NRF24.h>). Do đó, chúng ta cần sử dụng Thư viện RF24. Thư viện này được thiết kế để tuân thủ tối đa hoạt động dự kiến của chip & được xây dựng dựa trên thư viện SPI tiêu chuẩn.
Thư viện hỗ trợ hai tệp tiêu đề:
1 2 | #include <nRF24L01.h> #include <RF24.h> |
Bạn có thể tải xuống thư viện từ liên kết Github sau đây. Thêm thư viện vào Arduino IDE.
Simple Sender & Receiver Code
Bây giờ chúng ta hãy kiểm tra giao tiếp đơn giản giữa Máy phát và Máy thu STM2 NRF24L01. Mạch phát sẽ gửi “Hello World” cùng với số gói tin. Bạn có thể hiển thị tin nhắn đã truyền và đã nhận trên Serial Monitor.
Sender Code
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(PB0, PA4); // CE, CSN on Blue Pill
const uint64_t address = 0xF0F0F0F0E1LL;
int counter = 0;
void setup()
{
Serial.begin(9600);
radio.begin(); //Starting the Wireless communication
radio.openWritingPipe(address); //Setting the address where we will send the data
radio.setPALevel(RF24_PA_MIN); //You can set it as minimum or maximum depending on the distance between the transmitter and receiver.
radio.stopListening(); //This sets the module as transmitter
}
void loop()
{
char text[] = " Hello World";
char str[50];
sprintf(str,"%s %d",text,counter);
radio.write(&str, sizeof(str));
Serial.println(str);
counter++;
delay(2000);
}
Receiver Code
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(PB0, PA4); // CE, CSN on Blue Pill
const uint64_t address = 0xF0F0F0F0E1LL;
boolean button_state = 0;
void setup()
{
Serial.begin(9600);
radio.begin();
Serial.print("ADDRESS :");
radio.openReadingPipe(0, address); //Setting the address at which we will receive the data
radio.setPALevel(RF24_PA_MIN); //You can set this as minimum or maximum depending on the distance between the transmitter and receiver.
radio.startListening(); //This sets the module as receiver
}
void loop()
{
if (radio.available()) //Looking for the data.
{
Serial.println("Radio is sniffing");
char text[32] = ""; //Saving the incoming data
radio.read(&text, sizeof(text)); //Reading the data
Serial.println(text);
}
}
Sau khi tải lên mã trên cả vi điều khiển, bạn có thể mở cả hai Trình theo dõi nối tiếp. Nó sẽ hiển thị dữ liệu Người gửi và Người nhận cùng với số Gói tin.
Sending Sensor Data Wirelessly to Receiver using NRF24L01 & STM32
Bây giờ chúng ta hãy xem qua ví dụ thứ hai. Trong ví dụ này, chúng ta sẽ Giao tiếp NRF24L01 với cảm biến STM32 và BME280 tới Mạch người gửi. Bạn có thể kết nối Cảm biến áp suất khí quyển BME280 với Mạch người gửi. Cảm biến sử dụng Giao thức I2C để liên lạc và đo nhiệt độ môi trường, độ ẩm, Áp suất khí quyển và Độ cao. Dưới đây là mạch của máy phát.
Cảm biến hoạt động trên Giao thức I2C nên các Chân I2C của nó, tức là SDA & SCL được kết nối tương ứng với PB7 & PB6. Chúng tôi sẽ gửi kết quả đọc không dây của Cảm biến BME280 từ Người gửi STM32 NRF24L01 tới Bộ thu STM32 NRF24L01.
Sender Code
Mạch Người gửi yêu cầu Thư viện BME280. Bạn có thể lấy thư viện từ liên kết này: Thư viện BME280. Thêm thư viện vào thư mục Thư viện Arduino.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(PB0, PA4); // CE, CSN on Blue Pill
const uint64_t address = 0xF0F0F0F0E1LL;
int counter = 0;
float temperature;
float humidity;
float altitude;
float pressure;
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme;
struct MyData
{
int counter;
float temperature;
float humidity;
float altitude;
float pressure;
};
MyData data;
void setup()
{
Serial.begin(9600);
radio.begin(); //Starting the Wireless communication
radio.openWritingPipe(address); //Setting the address where we will send the data
radio.setPALevel(RF24_PA_MIN); //You can set it as minimum or maximum depending on the distance between the transmitter and receiver.
radio.stopListening(); //This sets the module as transmitter
if (!bme.begin(0x76))
{
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
}
void loop()
{
data.counter = counter;
data.temperature = bme.readTemperature();
data.pressure = bme.readPressure() / 100.0F;
data.altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);
data.humidity = bme.readHumidity();
Serial.print("Packet No. = ");
Serial.println(data.counter);
Serial.print("Temperature = ");
Serial.print(data.temperature);
Serial.println("*C");
Serial.print("Pressure = ");
Serial.print(data.pressure);
Serial.println("hPa");
Serial.print("Approx. Altitude = ");
Serial.print(data.altitude);
Serial.println("m");
Serial.print("Humidity = ");
Serial.print(data.humidity);
Serial.println("%");
Serial.println();
radio.write(&data, sizeof(MyData));
Serial.println("Data Packet Sent");
Serial.println("");
counter++;
delay(3000);
}
Receiver Code
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(PB0, PA4); // CE, CSN on Blue Pill
const uint64_t address = 0xF0F0F0F0E1LL;
struct MyData
{
int counter;
float temperature;
float humidity;
float altitude;
float pressure;
};
MyData data;
void setup()
{
Serial.begin(9600);
radio.begin();
Serial.print("ADDRESS :");
radio.openReadingPipe(0, address); //Setting the address at which we will receive the data
radio.setPALevel(RF24_PA_MIN); //You can set this as minimum or maximum depending on the distance between the transmitter and receiver.
radio.startListening(); //This sets the module as receiver
}
int recvData()
{
if ( radio.available() )
{
radio.read(&data, sizeof(MyData));
return 1;
}
return 0;
}
void loop()
{
if(recvData())
{
Serial.println("Data Received:");
Serial.print("Packet No. = ");
Serial.println(data.counter);
Serial.print("Temperature = ");
Serial.print(data.temperature);
Serial.println("*C");
Serial.print("Pressure = ");
Serial.print(data.pressure);
Serial.println("hPa");
Serial.print("Approx. Altitude = ");
Serial.print(data.altitude);
Serial.println("m");
Serial.print("Humidity = ");
Serial.print(data.humidity);
Serial.println("%");
Serial.println();
}
}
Sau khi tải lên mã, bạn có thể mở Serial Monitor. Serial Monitor sẽ hiển thị dữ liệu đã truyền và đã nhận.