Работа с NRF24L01 и STM32F1

Аннотация

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

#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 
#include 
#include 
#include 

#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/

© Habrahabr.ru