Arduino + радиомодуль nrf24
- Войдите на сайт для отправки комментариев
Есть задача - нужно передать команду (сейчас интересует просто факт передачи) с arduino №1 на arduino №2, используя радиомодуль nrf24, однако данные, например число типа int не передается.
Как делал : Arduino№1(Arduino UNO) и Arduino №2(Arduino UNO)соединил следующим образом c радиомодулем nrf24 № 1 и nrf24 №2 соответственно(т.е. Arduino№1(Arduino UNO) + nrf24 №1 и Arduino№2(Arduino UNO) + nrf24 №2):
GND - GND
3V3 - 3V3
CE - 8
CSN - 7
SCK - 13
MOSI - 11
MISO - 12
Думаю, что радиомодули рабочие и соединил все правильно, т.к. при загрузке следующего кода:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(8,7); // инициализировать модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53);// Для Меги
const uint8_t num_channels = 128;
uint8_t values[num_channels];
void setup(void)
{
Serial.begin(9600);
printf_begin();
radio.begin();
radio.setAutoAck(false);
radio.startListening();
radio.printDetails(); // Вот эта строка напечатает нам что-то, если все правильно соединили.
delay(5000); // И посмотрим на это пять секунд.
radio.stopListening();
int i = 0; // А это напечатает нам заголовки всех 127 каналов
while ( i < num_channels ) {
printf("%x",i>>4);
++i;
}
printf("\n\r");
i = 0;
while ( i < num_channels ) {
printf("%x",i&0xf);
++i;
}
printf("\n\r");
}
const int num_reps = 100;
void loop(void)
{
memset(values,0,sizeof(values));
int rep_counter = num_reps;
while (rep_counter--) {
int i = num_channels;
while (i--) {
radio.setChannel(i);
radio.startListening();
delayMicroseconds(128);
radio.stopListening();
if ( radio.testCarrier() )
++values[i];
}
}
int i = 0;
while ( i < num_channels ) {
printf("%x",min(0xf,values[i]&0xf));
++i;
}
printf("\n\r");
}
int serial_putc( char c, FILE * ) {
Serial.write( c );
return c;
}
void printf_begin(void) {
fdevopen( &serial_putc, 0 );
}
Результат следующий:
Arduino №1 + nrf24 №1

Arduino №2 + nrf24 №2

ТЕПЕРЬ САМА ПРОБЛЕМА
Загружаю код на Arduino №1
#include <SPI.h>
#include <RF24.h>
RF24 radio(8, 7); // можно использовать любые
const uint32_t pipe = 123456789; // адрес
byte massiv[1];
void setup()
{
Serial.begin(9600);
printf_begin();
//radio.setAutoAck(false);
radio.begin();
radio.setDataRate(RF24_250KBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
radio.openWritingPipe(pipe); // открыть канал на отправку
radio.printDetails(); // Вот эта строка напечатает нам что-то, если все правильно соединили.
delay(5000);
}
void loop()
{
massiv[0] = 255;
radio.write(massiv, 1);
Serial.println("Отправлено ");
Serial.println(massiv[0]);
delay(500);
massiv[0] = 155;
radio.write(massiv, 1);
Serial.println("Отправлено ");
Serial.println(massiv[0]);
delay(500);
}
int serial_putc( char c, FILE * ) {
Serial.write( c );
return c;
}
void printf_begin(void) {
fdevopen( &serial_putc, 0 );
}
на Arduino №2
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(8, 7);
const uint32_t pipe = 123456789;
byte massiv[4];
void setup(void)
{
pinMode(13, OUTPUT);
Serial.begin(9600);
printf_begin();
//radio.setAutoAck(false);
radio.begin();
radio.setDataRate(RF24_250KBPS); // RF24_1MBPS или RF24_2MBPS
radio.openReadingPipe(0,pipe); // открыть канал на приём
radio.startListening(); // приём
radio.printDetails(); // Вот эта строка напечатает нам что-то, если все правильно соединили.
delay(5000);
}
void loop()
{
if(radio.available())
{
radio.read(massiv, 1);
if(massiv[0] == 255)
{
Serial.println(massiv[0]);
digitalWrite(13, HIGH);
}
if(massiv[0] == 155)
{
Serial.println(massiv[0]);
digitalWrite(13, LOW);
}
}
}
int serial_putc( char c, FILE * ) {
Serial.write( c );
return c;
}
void printf_begin(void) {
fdevopen( &serial_putc, 0 );
}
Результат следующий :
на Arduino №1

на Arduino №2

Как видно на Arduino №2 нет принятых данных. В чем проблема не знаю. Если у кого есть какие-то предположения буду рад. Зарание спасибо.
Канал не указан по которому работаете. И посмотрите что написано про 0 в openReadingPipe https://maniacbug.github.io/RF24/classRF24.html
Вроде я указал канал
constuint32_t pipe = 123456789;// адресЯ изменил трубу(канал) на :
на всякий случай.
Добавил строчку кода на приемной Arduino
radio.stopListening(); // указал в явном виде тоже на всякий случай
И изменил openReadingPipe(0,pipe) на 1
radio.openReadingPipe(1,pipe); // открыть канал на приём.
Результата по прежнему нет.
Код получилсся следующий:
#include <SPI.h> #include <RF24.h> RF24 radio(8, 7); // можно использовать любые const uint32_t pipe = 0xF0F0F0F0AA; // адрес byte massiv[1]; void setup() { Serial.begin(9600); printf_begin(); //radio.setAutoAck(false); radio.begin(); radio.setDataRate(RF24_250KBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS radio.stopListening(); // указал в явном виде на всякий случай radio.openWritingPipe(pipe); // открыть канал на отправку radio.printDetails(); // Вот эта строка напечатает нам что-то, если все правильно соединили. delay(5000); } void loop() { massiv[0] = 255; radio.write(massiv, 1); Serial.println("Отправлено "); Serial.println(massiv[0]); delay(500); massiv[0] = 155; radio.write(massiv, 1); Serial.println("Отправлено "); Serial.println(massiv[0]); delay(500); } int serial_putc( char c, FILE * ) { Serial.write( c ); return c; } void printf_begin(void) { fdevopen( &serial_putc, 0 ); }И :
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(8, 7); const uint32_t pipe = 0xF0F0F0F0AA; byte massiv[4]; void setup(void) { pinMode(13, OUTPUT); Serial.begin(9600); printf_begin(); //radio.setAutoAck(false); radio.begin(); radio.setDataRate(RF24_250KBPS); // RF24_1MBPS или RF24_2MBPS radio.openReadingPipe(1,pipe); // открыть канал на приём radio.startListening(); // приём radio.printDetails(); // Вот эта строка напечатает нам что-то, если все правильно соединили. delay(5000); } void loop() { if(radio.available()) { radio.read(massiv, 1); if(massiv[0] == 255) { Serial.println(massiv[0]); digitalWrite(13, HIGH); } if(massiv[0] == 155) { Serial.println(massiv[0]); digitalWrite(13, LOW); } } } int serial_putc( char c, FILE * ) { Serial.write( c ); return c; } void printf_begin(void) { fdevopen( &serial_putc, 0 ); }В приемнике перед 30 строкой поставьте вывод в сериал, посмотрите что вообще что-то приходит, если приходит то уже надо смотреть что там рид принимает в качестве параметров.
Вроде я указал канал
constuint32_t pipe = 123456789;// адресЭто труба (pipe) , а не канал (channel) . Это разные вещи.
Канал устанавливается так: radio.setChannel(8);
Попробуйте установить один и тот же канал для приемника и передатчика явно, хотя в принципе у вас и так выбирается общий канал - судя по приведенным скриншотам - 0x4C
Какое расстояние между модулями? - многие китайские NRF24 дальше 2-3х метров не работают.
Условие radio.available(); не выполняется. т.е. приёма данных нет вообще.
по поводу каналов вечером попробую, спасибо.
расстояние см 15 не больше.
К слжалению,
Не помогло.
Почитайте про setAutoAck, и о том, что на некоторых китайских nRF этот флаг имеет инвертированное значение. Инициализировать надо вообще всё. На амперке есть хорошая тема по nRF на форуме - лучше там почитайте, там уже все углы обоссаны не по одному разу.
Спасибо, буду вникать