Аннотация
В этом материале мы рассмотрим процесс запуска 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);
}
Источники
Комментарии (10)
voldemar_d
22.01.2025 12:12процесс запуска NRF24L01 в связке со STM32F1
Можно подробнее про решаемую задачу? Что эта связка должна делать?
laminar
22.01.2025 12:12Судя по описанию пинов кнопка U2 - "закрывает", а кнопка U3 "открывает" какой-то механизм управляемый реле подключенное к приемнику. Искренне надеюсь, что реле не воткнуто напрямую в МК, как у автора нарисовано на схеме.
voldemar_d
22.01.2025 12:12А в целом это все зачем? Дистанционно это делать, типа радио-пульта ДУ?
В общем, хотелось бы автора услышать.
laminar
Кто и главное зачем выпустил эту "статью" из песочницы? Какую информационную нагрузку она несет? Уважаемый автор добавил конденсатор и скопипастил код передачи по spi в arduino IDE и это разработка, серьезно?!
voldemar_d
Для начинающих, кто думает о переходе с Arduino Uno на STM32, вполне годная статья, кмк.
Другое дело, что я, например, не понял постановку задачи. Что за передатчик, приемник, и что оно все вместе должно делать?
laminar
Вот серьезно, что здесь годного?
Причины данного решения, почему не msp430 или pic, не новомодные risc-v? Как вам это поможет в решении перехода на stm32
"Отлично! Я перейду на stm32 и тоже буду гуглить и копипастить!" - видимо к такой мысли должен прийти прочитавший эти строки.
Простите, автор запитывает свое устройство от лимона с воткнутыми в него двумя проводками? В спеках пишут - 11.3mA TX at 0dBm output power • 12.3mA RX at 2Mbps air data rate, 12.3 мА, Карл!!!
Ну просто чудо какое-то, конденсатор повышает силу тока в цепи, ведь по словам автора именно тока не хватало для запуска модуля.
Это что угодно, но не техническая статья, не руководство, это даже на заметку не тянет. Полезной информации она не содержит от слова совсем. Вам даже не понятно, что это за устройство и как оно функционирует.
voldemar_d
Ну если все работало на Arduino Uno, то непонятно, зачем вообще было с него переходить. Если габариты платы не устраивают, есть еще Arduino Pro Micro и прочие небольших размеров.
В целом я с замечаниями согласен, статью можно было бы получше оформить, как минимум. Если целью перехода было - просто освоение STM32, об этом тоже стоило бы написать.
sim2q
тем более что
хорошим тономего нормальный разраб и так должен добавить