Аннотация

В этом материале мы рассмотрим процесс запуска 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.

Картинка взята с сайта sunfounder
Картинка взята с сайта sunfounder

Распиновка 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);
}

Источники

  1. http://wiki.sunfounder.cc/index.php?title=NRF24L01_Test_with_Arduino

  2. https://www.instructables.com/NRF24L01-on-STM32F103/

Комментарии (10)


  1. laminar
    22.01.2025 12:12

    Кто и главное зачем выпустил эту "статью" из песочницы? Какую информационную нагрузку она несет? Уважаемый автор добавил конденсатор и скопипастил код передачи по spi в arduino IDE и это разработка, серьезно?!


    1. voldemar_d
      22.01.2025 12:12

      Для начинающих, кто думает о переходе с Arduino Uno на STM32, вполне годная статья, кмк.

      Другое дело, что я, например, не понял постановку задачи. Что за передатчик, приемник, и что оно все вместе должно делать?


      1. laminar
        22.01.2025 12:12

        Вот серьезно, что здесь годного?

        я решил перейти с Arduino UNO на stm32f1

        Причины данного решения, почему не msp430 или pic, не новомодные risc-v? Как вам это поможет в решении перехода на stm32

        Я нашёл решение этой проблемы на сайте instructables. Код, который я использовал, также был взят оттуда

        "Отлично! Я перейду на stm32 и тоже буду гуглить и копипастить!" - видимо к такой мысли должен прийти прочитавший эти строки.

        В моей ситуации проблема заключалась в том, что модуль NRF24L01 не включался. Из нескольких источников я узнал, что плата чувствительна к силе тока и может не запуститься, если её недостаточно.

        Простите, автор запитывает свое устройство от лимона с воткнутыми в него двумя проводками? В спеках пишут - 11.3mA TX at 0dBm output power • 12.3mA RX at 2Mbps air data rate, 12.3 мА, Карл!!!

        Суть решения заключалась в том, чтобы добавить в цепь питания модуля NRF24L01 обычный электролитический конденсатор ёмкостью 10 мкФ

        Ну просто чудо какое-то, конденсатор повышает силу тока в цепи, ведь по словам автора именно тока не хватало для запуска модуля.

        Это что угодно, но не техническая статья, не руководство, это даже на заметку не тянет. Полезной информации она не содержит от слова совсем. Вам даже не понятно, что это за устройство и как оно функционирует.


        1. voldemar_d
          22.01.2025 12:12

          Ну если все работало на Arduino Uno, то непонятно, зачем вообще было с него переходить. Если габариты платы не устраивают, есть еще Arduino Pro Micro и прочие небольших размеров.

          В целом я с замечаниями согласен, статью можно было бы получше оформить, как минимум. Если целью перехода было - просто освоение STM32, об этом тоже стоило бы написать.


        1. sim2q
          22.01.2025 12:12

          Ну просто чудо какое-то, конденсатор

          тем более что хорошим тоном его нормальный разраб и так должен добавить


  1. sav13
    22.01.2025 12:12

    А потом автор узнал что есть NRF52 !!!


    1. voldemar_d
      22.01.2025 12:12

      А в чем отличия?


  1. voldemar_d
    22.01.2025 12:12

    процесс запуска NRF24L01 в связке со STM32F1

    Можно подробнее про решаемую задачу? Что эта связка должна делать?


    1. laminar
      22.01.2025 12:12

      Судя по описанию пинов кнопка U2 - "закрывает", а кнопка U3 "открывает" какой-то механизм управляемый реле подключенное к приемнику. Искренне надеюсь, что реле не воткнуто напрямую в МК, как у автора нарисовано на схеме.


      1. voldemar_d
        22.01.2025 12:12

        А в целом это все зачем? Дистанционно это делать, типа радио-пульта ДУ?

        В общем, хотелось бы автора услышать.