В этой статье мы рассмотрим подключение беспроводного приемопередающего модуля NRF24L01 к плате STM32F103C8. Мы соберем схему передатчика и приемника, используя пару NRF24L01 + STM32F103C8 (Blue Pill). Модуль NRF24L01 используется в большом числе приложений, там, где требуется беспроводное управление чем либо. Это приемопередатчики, которые предполагают, что каждый модуль может передавать и получать данные. Эти модули очень дешевы, и вы можете использовать их с любым микроконтроллером, таким как Arduino или STM32F103C8.
Мы подключим модуль NRF24L01 к плате STM32 и, используя пример кода, построим беспроводную сеть. В первом примере мы отправим простой текст «Hello World» с передатчика на приемник. Во втором примере мы дополнительно подключим к этой схеме датчик барометрического давления BME280. Затем мы отправим данные о влажности, температуре, давлении и высоте с передатчика/отправителя на приемник.
Необходимые компоненты
- Отладочная плата STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
- Модуль nRF24L01 (купить на AliExpress).
- Датчик BME280 (купить на AliExpress).
- Источник питания 5 В.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Модуль NRF24L01
nRF24L01 — это беспроводной приемопередающий модуль, то есть каждый модуль может как отправлять, так и получать данные. Он работает на частоте 2,4 ГГц . Эта частота попадает в диапазон ISM и является законной для использования в большинстве стран для инженерных проектов. При эффективной работе модули могут покрывать расстояние до 100 метров.
Вторая версия этого модуля, nRF24L01 PA+LNA, поставляется с разъемом SMA , антенной-уткой и специальным чипом RFX2401C, который объединяет в себе PA + LNA. Этот чип вместе с антенной-уткой помогает модулю достичь значительно большего диапазона передачи - около 1000 м. PA означает усилитель мощности (Power Amplifier) , который увеличивает мощность сигнала, передаваемого с чипа nRF24L01+. LNA означает усилитель с низким уровнем шума (Low-Noise Amplifier), который принимает крайне слабый и неопределенный сигнал с антенны и усиливает его до более полезного уровня.
Модуль работает при напряжении 3,3 В, но его контакты SPI допускают напряжение 5 В. Каждый модуль имеет диапазон 125 адресов, и каждый модуль может взаимодействовать с 6 другими модулями, поэтому с этим модулем можно организовать ячеистую сеть. Модуль NRF24L01 работает с помощью интерфейса SPI, поэтому вы можете использовать NRF24L01 с любым микроконтроллером с контактами SPI, например, с платами STM32 или Arduino.
Взаимодействие модуля приемопередатчика NRF24L01 с STM32
Теперь давайте соединим модуль трансивера NRF24L01 с микроконтроллером STM32 и построим собственный передатчик и приемник. Схема передатчика и приемника приведена ниже. Вы можете собрать пару этих схем на макетной плате.
Ниже показано соединение плат NRF24L01 и STM32F103C Blue Pill.
NRF24L01 CSN ……………………………………………… PA4 STM32F103C
NRF24L01 MOSI ………………………………………… PA7 STM32F103C
NRF24L01 GND ……………………………………………… GND STM32F103C
NRF24L01 CE ……………………………………………… PB0 STM32F103C
NRF24L01 SCK ………………………………………… PA5 STM32F103C
NRF24L01 MISO ………………………………………… PA6 STM32F103C

Библиотека NRF24L01 для STM32
Плата STM32 не поддерживает библиотеку nRF24L01 RadioHead ( #include <RH_NRF24.h>). Поэтому нам нужно использовать библиотеку RF24. Эта библиотека разработана для максимального соответствия предполагаемой работе чипа и построена на основе стандартной библиотеки SPI.
Библиотека поддерживает два заголовочных файла:
1 2 |
#include <nRF24L01.h> #include <RF24.h> |
Вы можете загрузить библиотеку по следующей ссылке с Github. Добавьте библиотеку в Arduino IDE.
Более подробно про использование интерфейса SPI в плате STM32F103C8 (Blue Pill) вы можете прочитать в этой статье.
Простой код передатчика и приемника
Теперь давайте проверим простую связь между передатчиком и приемником STM32 NRF24L01. Схема передатчика отправит «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 25 26 27 28 |
#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); } |
Код приемника
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 |
#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); } } |
После загрузки кода на оба микроконтроллера вы можете открыть оба окна монитора последовательной связи. Они отобразят данные отправителя и получателя с номером пакета.
Беспроводная отправка данных с датчика с помощью NRF24L01 и STM32
Давайте теперь рассмотрим второй пример. В этом примере мы будем подключать NRF24L01 с датчиком BME280 к схеме передатчика. Датчик BME280 использует протокол I2C для связи и измеряет температуру окружающей среды, влажность, атмосферное давление и высоту. Ниже приведена схема передатчика для данного варианта.
Датчик работает по протоколу I2C, поэтому его выводы I2C, т.е. SDA и SCL, подключены к PB7 и PB6 соответственно. Мы будем отправлять показания датчика BME280 по беспроводной сети с передатчика STM32 NRF24L01 на приемник STM32 NRF24L01.
Код передатчика
Для кода передатчика требуется библиотека BME280, ее вы можете скачать по следующей ссылке. Добавьте библиотеку в папку библиотек Arduino.
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
#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); } |
Код приемника
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#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(); } } |
После загрузки кода вы можете открыть окно монитора последовательной связи и в нем вы увидите переданные и полученные данные.
43 просмотров