Работа с 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. |
Распиновка 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);
}
Источники
http://wiki.sunfounder.cc/index.php? title=NRF24L01_Test_with_Arduino
https://www.instructables.com/NRF24L01-on-STM32F103/