Работа с 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 <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/


ссылка на оригинал статьи https://habr.com/ru/articles/875638/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *