Аннотация
В этом материале мы рассмотрим процесс запуска NRF24L01 в связке со STM32F1. Разработка ведется в Arduino IDE. В статье указан код и схемы подключения для того, чтобы можно было повторить проект самому.
Актуальность статьи
Всё началось с того, что я решил перейти с Arduino UNO на stm32f1 при работе с NRF24L01. Код перестал работать. На поиск решения проблемы ушло несколько дней. Эта статья — результат моих усилий. Материал этой статьи можно воспринимать просто как пример кода для начала работы со связкой stm32f1 + NRF24L01.
Технологии
Разработка ведется в Arduino IDE. Если вы новичок в этой теме, то прочтите эту статью.
ВАЖНО! ЕСЛИ ВЫ ВЫБРАЛИ ДРУГОЕ ЯДРО, ЭТО МОЖЕТ ПРИВЕСТИ К НЕИЗВЕСТНЫМ ПОСЛЕДСТВИЯМ. В моём случае, в поле "Дополнительные ссылки для Менеджера плат" я вписал: https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
Используется библиотека RF24. Её можно установить в менеджере библиотек.
Проблема
В моей ситуации п��облема заключалась в том, что модуль NRF24L01 не включался. Из нескольких источников я узнал, что плата чувствительна к силе тока и может не запуститься, если её недостаточно.
Решение
Я нашёл решение этой проблемы на сайте instructables. Код, который я использовал, также был взят оттуда, но я немного адаптировал его под свои нужды.
Суть решения заключалась в том, чтобы добавить в цепь питания модуля NRF24L01 обычный электролитический конденсатор ёмкостью 10 мкФ.
Ниже приведена схема.
Распиновка NRF24L01
Pin | Name | Description |
|---|---|---|
1 | GND | Ground (0V) |
2 | VCC | Power Supply (3.3V) |
3 | CE | Mode Enable Activates RX or TX mode |
4 | CSN | Chip Select |
5 | SCK | Serial Clock |
6 | MOSI | Master Output, Slave Input |
7 | MISO | Master Input, Slave Output |
8 | IRQ | Interrupt Request. Under wireless communication, MCU communicates with NRF24L01 by IRQ. |

Распиновка STM32F1

Соединение STM32F1 с NRF24L01


Код передатчика
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define CE_PIN PB0 #define CSN_PIN PA4 #define RED_PIN PB10 #define GREEN_PIN PB11 #define CLOSE_BTN_PIN PB6 #define OPEN_BTN_PIN PB7 RF24 radio(CE_PIN, CSN_PIN); const uint64_t address = 0xF0F0F0F0E1LL; boolean button_1_state = 0; boolean button_2_state = 0; void setup() { // Кнопки pinMode(CLOSE_BTN_PIN, INPUT_PULLUP); pinMode(OPEN_BTN_PIN, INPUT_PULLUP); // Светодиоды pinMode(RED_PIN, OUTPUT); pinMode(GREEN_PIN, OUTPUT); digitalWrite(RED_PIN, HIGH); digitalWrite(GREEN_PIN, HIGH); Serial.begin(9600); radio.begin(); radio.openWritingPipe(address); radio.setPALevel(RF24_PA_MIN); radio.stopListening(); digitalWrite(RED_PIN, LOW); digitalWrite(GREEN_PIN, LOW); } void loop() { button_1_state = digitalRead(CLOSE_BTN_PIN); button_2_state = digitalRead(OPEN_BTN_PIN); while(!button_1_state && button_2_state) { char text[2]; text[0] = 0xAA; text[1] = 0x00; radio.write(&text, sizeof(text)); digitalWrite(GREEN_PIN, HIGH); button_1_state = digitalRead(CLOSE_BTN_PIN); button_2_state = digitalRead(OPEN_BTN_PIN); } digitalWrite(GREEN_PIN, LOW); while(button_1_state && !button_2_state) { char text[2]; text[0] = 0xAC; text[1] = 0x00; radio.write(&text, sizeof(text)); digitalWrite(RED_PIN, HIGH); button_1_state = digitalRead(CLOSE_BTN_PIN); button_2_state = digitalRead(OPEN_BTN_PIN); } digitalWrite(RED_PIN, LOW); delay(100); }
Код приёмника
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <SoftwareSerial.h> #define TX_PIN PA9 #define RX_PIN PA10 #define CE_PIN PB0 #define CSN_PIN PA4 #define RELAY_PIN PB3 SoftwareSerial mySerial(RX_PIN, TX_PIN); RF24 radio(CE_PIN, CSN_PIN); const uint64_t address = 0xF0F0F0F0E1LL; void setup() { pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, LOW); mySerial.begin(9600); radio.begin(); radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_MIN); radio.startListening(); } void loop() { if (radio.available()) { char text[2] = ""; radio.read(&text, sizeof(text)); if (text[0] == 0xAA) { mySerial.println(text); digitalWrite(RELAY_PIN, HIGH); } else if(text[0] == 0xAC) { mySerial.println(text); digitalWrite(RELAY_PIN, LOW); } } delay(5); }
