Передача текста в nrf24l01

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Здравствуйте. Помогите разобраться с передачей текста.

Передатчик:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
void setup() {
  Serial.begin(9600); 
  radio.begin(); 
  radio.setAutoAck(1);       
  radio.setRetries(0, 15);   
  radio.enableAckPayload();   
  radio.setPayloadSize(32);     
  radio.openWritingPipe(address[0]); 
  radio.setChannel(0x60);
radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS); 
radio.powerUp(); 
radio.stopListening();
}

char text[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '#'};

void loop() {
radio.write(&text, sizeof(text));
delay(1000);
}

 

Приемник:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10); 
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};
void setup(){
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0,15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);
  radio.openReadingPipe(1,address[0]);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);
  radio.powerUp();
  radio.startListening();
}

   
 

void loop() {
char gotByte[8];
byte pipeNo;  
while( radio.available(&pipeNo)){
radio.read(&gotByte, sizeof(gotByte) );
}
for (byte i = 0; i < sizeof(gotByte); i++) {
Serial.print(gotByte[i]);
}
Serial.println();
}





   


 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

В мониторе порта приемника получаю ересть

⸮LL ?⸮?
⸮LL ?⸮?
⸮LL ?⸮?
⸮LL ?⸮?
⸮LL ?⸮?
⸮LL ?⸮?
⸮LL ?⸮?
⸮LL ?⸮?
⸮LL ?⸮?
⸮LL ?⸮?
⸮LL ?⸮?
 
Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Я вас не поняла.

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

попробуйте таблицу символов использовать, передавать цифры, используя таблицу, а на приемнике декодировать

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Проверьте скорость порта монитора. 9600 она или другая.

Ну и вот этот массив неправильно объявлен char text[8] = {'a''r''d''u''i''n''o''#'};

Не знаю как там write реализован в этой библиотеке возможно с указанием длины все работает и так.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Прием


void loop() {
char gotByte[9];
byte pipeNo;  
while( radio.available(&pipeNo)){
radio.read(&gotByte, sizeof(gotByte) );
for (byte i = 0; i < sizeof(gotByte); i++) {
Serial.print(gotByte[i]);
}
Serial.println();
}}

 

Передача

char qwe[9] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '#', '!'};

void loop() {
radio.write(&qwe, sizeof(qwe));
delay(1000);
}

Работает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Проблема снята?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Как бы рабоатет. Может посоветуете как сделать лучше, правильнее?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, тут много всего, но боюсь, будет всё как всегда - любое замечание воспринимается как наезд и вызывает резкую реакцию.

Ну, для начала мелочь - зачем Вам нужна переменная pipeNo, если Вы её нигде не используете? Если удалить строку 3, а строке 4 вместо &pipeNo написать NULL - ничего не изменится, только не будет этой переменной и будет чуть быстрее работать.

Продолжать? Или Вам уже скучно?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Конечно же продолжать, переменная осталась от неких экспериментов, забыла удалить)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Попробуйте заменить while на if в строке 4. Должно нормально работать. Скажите как получилось. Но это верно только до тех пор, пока длина Вашего пакета меньше payload_size. Если больше, то чтение становится сложнее. Вы знаете про payload_size?

2. В строка 5 и 6 у Вас написано

radio.read(&gotByte, sizeof(gotByte) );
for (byte i = 0; i < sizeof(gotByte); i++) {

Вы понимаете, что sizeof(gotByte)  здесь совершенно разные вещи? В строке 5 это общая длина масива - всех элементов, а в строке 6 - это количество элементов?

Численно они у Вас совпали только потому, что это массив типа char, а длина char - 1 байт. Будь там массив типа int. например, была бы беда. Не привыкайте так писать. там где нужно количество элементов массива, всегда пишите именно количество элементов (т.е. общий размре массива, поделённый на размер одного элемента). Сделайте это привычкой и никогда не будете ошибаться. Т.е. правильно было бы так:

radio.read(&gotByte, sizeof(gotByte) );
for (byte i = 0; i < sizeof(gotByte) / sizeof(gotByte[0]); i++) {

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Передатчик

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32); 
  radio.openWritingPipe(address[0]); 
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);
  radio.powerUp();
  radio.stopListening(); 
}

char message[9] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '#', '!'};

void loop() {
if (radio.write(&message, sizeof(message))) {
   Serial.println("Принял");
  } else {
    Serial.println("Не принял");
  }
delay(10);
}

Приемник

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9,10); 
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};

void setup(){
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0,15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);
  radio.openReadingPipe(1,address[0]);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS); 
  radio.powerUp();
  radio.startListening();
}

void loop() {
char gotByte[9];
if( radio.available()){
radio.read(&gotByte, sizeof(gotByte) );
for (byte i = 0; i < sizeof(gotByte) / sizeof(gotByte[0]); i++) {
Serial.print(gotByte[i]);
}
Serial.println();
}}

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

ЕвгенийП пишет:
Вы знаете про payload_size?

Не знаю.

 Serial.println("Не принял");

Почему-то модуль всегда отвечает этим сообщением, хотя второй модуль прекрансо принимает.

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Захотела организовать ответ если сообщение принято

Передатчик:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
int message[2];
int otvet;
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32); 
  radio.openWritingPipe(address[0]); 
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_1MBPS);

  radio.powerUp();
    radio.stopListening();//Передаем

  message[0]=1011;//true
  message[1]=1010;//false
}



void loop() {

radio.write(&message[0], sizeof(message[0]));
Serial.print("Отправили: ");
Serial.print(message[0]);
Serial.println("");

if (!radio.available()) {  
Serial.println("Пусто");
}else{                           
while (radio.available() ) {                    
radio.read(&otvet, sizeof(otvet));
Serial.print("Приняли: ");
Serial.print(otvet);
Serial.println("");
}}
delay(3000);
}

Приёмник:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9,10); 
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};
byte pipeNo;
void setup(){
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0,15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);
  radio.openReadingPipe(1,address[0]);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_1MBPS); 

  radio.powerUp();
  radio.startListening();//Слушаем
}
int  message;

void loop() {
if( radio.available(&pipeNo)){
radio.read(&message, sizeof(message) );
Serial.print("Приняли: ");
Serial.print(message);
Serial.println();
radio.writeAckPayload(&pipeNo,&message, sizeof(message)); 
Serial.print("Ответили: ");
Serial.print(message);
Serial.println();
}}

Приемник принимает 1011 и отправляет 1011

Передатчик отправляет 1011 и выволит сообщение Пусто

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Irinka пишет:

Не знаю.

Эта библиотека всегда отправляет пакет фиксированного размера. Размер равен payload_size. По умолчанию - 32 байта. Можно установить больше (но, не меньше) при помощи функции setPayloadSize.

Если Вы отправляете меньший (чем payload_size) пакет, она дополнит его нулями, а если больший, то обрежет. Об этом надо помнить и если нужно передать больше, то разбивать на куски.

Вы посмотрите исходный текст библиотеки. Там очень много комментариев, да и код в целом понятный - узнаете много интересного - это не простая библиотека, там много всего наворочено.

Irinka пишет:

 Serial.println("Не принял");

Почему-то модуль всегда отвечает этим сообщением, хотя второй модуль прекрансо принимает.

Что Вы имеете в виду - просто заменяеете один модуль другим или пытаетесь передать сразу на два (один передатчик - два приёмника)?

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

35 строкой в передатчик добавить

radio.startListening();

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Irinka, у нас тут как-то дискуссия возникла о сексизме в программировании. Мы (я и те, кто разделяет моё мнение) там в меньшинстве оказались, если Вам интересно, может Вы там что-нибудь прокомментируете?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

ЕвгенийП пишет:
Что Вы имеете в виду - просто заменяеете один модуль другим или пытаетесь передать сразу на два (один передатчик - два приёмника)?

Один модуль передает, другой принимает.

Valera19701 пишет:

35 строкой в передатчик добавить

radio.startListening();

Я так пробовала.

ЕвгенийП пишет:

Irinka, у нас тут как-то дискуссия возникла о сексизме в программировании. Мы (я и те, кто разделяет моё мнение) там в меньшинстве оказались, если Вам интересно, может Вы там что-нибудь прокомментируете?

Да-да, отвечу)))

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Ура, заработало!!!

Передатчик

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
int message[2];
int otvet;
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32); 
  radio.openWritingPipe(address[0]); 
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_1MBPS);
  radio.powerUp();
  radio.stopListening();//Передаем

  message[0]=1011;//true
  message[1]=1010;//false
}



void loop() {

if (radio.write(&message[0], sizeof(message[0]))) {
Serial.print("Отправили: ");
Serial.println(message[0]);
Serial.println("Приемник получил пакет");


if (!radio.available()) { 
//if (!radio.isAckPayloadAvailable()) {  
Serial.println("Пусто");
}else{ 
while (radio.available() ) {                    
radio.read(&otvet, sizeof(otvet));
Serial.print("Приняли: ");
Serial.print(otvet);
Serial.println("");
}}

}else{
Serial.println("Приемник НЕ получил пакет");
}
delay(3000);
}

Приёмник

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9,10); 
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};

void setup(){
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0,15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);
  radio.openReadingPipe(1,address[0]);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_1MBPS); 
  radio.powerUp();
  radio.startListening();//Слушаем
}
int  message;
int  otvet=9999;
void loop() {
if( radio.available()){
radio.read(&message, sizeof(message) );
Serial.print("Приняли: ");
Serial.print(message);
Serial.println();
delay(100);
radio.writeAckPayload(1,&otvet, sizeof(otvet)); 
//radio.write(&message, sizeof(message));
Serial.print("Ответили: ");
Serial.print(otvet);
Serial.println();
}}

 

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Выручайте:

RF24 radio(9,10); // инициализировать модуль на пинах 9 и 10 Для Уно

Я назначаю пины так:

byte P5 = (1 << 5);
byte P6 = (1 << 6);

#define D9   (DDRD  |=  P5)//9 пин atmega328
#define D10   (DDRD  |=  P6)//10 пин atmega328

RF24 radio(D9,D10); // инициализировать модуль на пинах 9 и 10 Для Уно

Но не работает. Почему? Как сделать?

Irinka
Irinka аватар
Offline
Зарегистрирован: 28.06.2017

Я это к чему...подключила к atmega128 к 14 и 15 пину

т.е.

RF24 radio(12,13);

14 пин атмеги-это 12 в скетче

15 пин атмеги-это 13 в скетче

неудобно.....