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
Вроде я указал канал
const
uint32_t pipe = 123456789;
// адрес
Я изменил трубу(канал) на :
на всякий случай.
Добавил строчку кода на приемной Arduino
radio.stopListening(); // указал в явном виде тоже на всякий случай
И изменил openReadingPipe(0,pipe) на 1
radio.openReadingPipe(1,pipe); // открыть канал на приём.
Результата по прежнему нет.
Код получилсся следующий:
И :
В приемнике перед 30 строкой поставьте вывод в сериал, посмотрите что вообще что-то приходит, если приходит то уже надо смотреть что там рид принимает в качестве параметров.
Вроде я указал канал
const
uint32_t pipe = 123456789;
// адрес
Это труба (pipe) , а не канал (channel) . Это разные вещи.
Канал устанавливается так: radio.setChannel(8);
Попробуйте установить один и тот же канал для приемника и передатчика явно, хотя в принципе у вас и так выбирается общий канал - судя по приведенным скриншотам - 0x4C
Какое расстояние между модулями? - многие китайские NRF24 дальше 2-3х метров не работают.
Условие radio.available(); не выполняется. т.е. приёма данных нет вообще.
по поводу каналов вечером попробую, спасибо.
расстояние см 15 не больше.
К слжалению,
Не помогло.
Почитайте про setAutoAck, и о том, что на некоторых китайских nRF этот флаг имеет инвертированное значение. Инициализировать надо вообще всё. На амперке есть хорошая тема по nRF на форуме - лучше там почитайте, там уже все углы обоссаны не по одному разу.
Спасибо, буду вникать