Создаю канал связи на NRF24L01
- Войдите на сайт для отправки комментариев
Здравствуйте, уважаемые!
Разочаровался я что-то в Wi-Fi, т.к. канал ооочень короткобойный, даже внешняя антенна не помогает. Попались мне в руки модули E01-ML01DP5 на 100 мВт, порадовали расстоянием передачи.

Цифры и байты передаются, теперь хочу перевести на передачу стандартных сообщений моего проекта. Сообщения типа "L#-8888888-999". Написал пару простеньких скетчей - трансмиттер и приемник.
Трансмиттер:
#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10);
const uint32_t pipe = 123456789;
char sender[13];
void setup()
{
Serial.begin(57600);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.openWritingPipe(pipe);
}
void loop()
{
char sender[] = "L#0000000-000";
radio.write(sender, strlen(sender));
Serial.println(sender);
delay(1000);
}
Приёмник:
#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10);
const uint32_t ch1 = 123456789;
int len=0;
char data[]="";
void setup()
{
Serial.begin(57600);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.openReadingPipe(1,ch1);
radio.startListening();
}
void loop()
{
if(radio.available())
{
len = radio.getDynamicPayloadSize();
radio.read(&data, len );
Serial.println(data);
}
}
Проблема в том, что к сожалению нет приёма. Я предполагаю, что система ждет финишный байт (вроде 0х03 в МК), но его не получает, поэтому буфер просто переполняется поступающими данными. При смене параметра len = 13 приходит куча "переносов" в мониторе порта. При замене строчки на
radio.read(&data, sizeof(data));
в мониторе появляются также переносы с редкими символами [] и <.
Подскажите, что ж я неверно делаю.
И параллельно - был ли у кого-либо опыт работы с библиотекой RF24-Ethernet?
Всем Спасибо за Ответы!
https://github.com/AlexGyver/nRF24L01
Пожалуйста
Увы, даже скопировав скетчи, в приемнике снова идет мусор с высокой частотой.
Recieved: 255
Recieved: 0
Recieved: 1
Recieved: 0
Recieved: 128
Recieved: 0
Recieved: 14
Recieved: 0
Recieved: 223
Recieved: 0
Recieved: 0
Recieved: 0
Recieved: 255
Recieved: 0
Recieved: 0
Recieved: 192
Recieved: 0
Recieved: 0
Recieved: 192
Recieved: 0
Recieved: 223
Recieved: 0
Recieved: 0
Recieved: 128
Recieved: 0
Recieved: 0
Recieved: 223
Recieved: 0
Recieved: 0
Recieved: 255
Recieved: 0
Recieved: 255
Recieved: 0
Написал пару простеньких скетчей - трансмиттер и приемник.
В 7-ой строке приёмника память под массив data не выделена (вернее, выделенн 1 байт). А в 23-ей строке Вы в него читаете. Результат - прочитанное пишется поверх других переменных. Замените 7-ую строку на что-то борлее разумное, например,
chardata[33];В передатчике сделайте так, чтобы хвостовой 0 строки тоже передавался. Для этого в строке 21 вместо strlen(sender) пишите strlen(sender)+1.
Попробуйте, что получится и отпишитесь (только при этом обязательно опубликуйте актуальные скетчи).
chardata[33];Увы, ничего не дало. Также продолжает плодить переносы.
Тоже самое...
Ниже. Также добавил обозначение канала и правильно указал название "трубы". Пробовал менять скорость до 1 мбит/сек - результат такой же... Уже не знаю чего ему надо...
Передатчик:
#include <SPI.h> #include <RF24.h> RF24 radio(9, 10); const uint64_t ch1 = 0xF0F0F0F0E1LL; char sender[13]; void setup() { Serial.begin(57600); radio.begin(); delay(500); radio.setChannel(10); radio.setDataRate(RF24_250KBPS); radio.openWritingPipe(ch1); } void loop() { char sender[] = "L#0000000-000"; radio.write(sender, strlen(sender)+1); Serial.println(sender); delay(1000); }Приемник:
#include <SPI.h> #include <RF24.h> RF24 radio(9, 10); const uint64_t ch1 = 0xF0F0F0F0E1LL; int len=0; char data[70]; void setup() { Serial.begin(57600); radio.begin(); delay(500); radio.setChannel(10); radio.setDataRate(RF24_250KBPS); radio.openReadingPipe(1,ch1); radio.startListening(); } void loop() { if(radio.available()) { len = radio.getDynamicPayloadSize(); radio.read(&data, len ); Serial.println(data); } }Ну, то, что Вы сделали - по любому правильно.
А сейчас - отлаживайтесь. Не работает вслепую.
Вот что у Вас возвращает write? Печатайте в сериал! Чему равно len в 25-ой строке приёмника? Печатайте в сериал. Всё печатайте и смотрите! Всё! Это поможет локализовать проблему.
И, да, кстати, не знаю, чтоу Вас за библиотека, но в моей верии адрес долже быть указателем на байт (сам адрес задаётся массиво байтов), а не числом uint64_t как у Вас.
Ну, то, что Вы сделали - по любому правильно.
А сейчас - отлаживайтесь. Не работает вслепую.
Вот что у Вас возвращает write? Печатайте в сериал! Чему равно len в 25-ой строке приёмника? Печатайте в сериал. Всё печатайте и смотрите! Всё! Это поможет локализовать проблему.
Библиотека? Да я отсюда брал https://github.com/maniacbug/RF24
Заметил оооочень интересную фитчу.
После некоторых корректировок, при отсылке не посылке, а простой "1" раз в секунду, в монитор порта приемника прилетают хексовые числа, причем постоянно:
FFFFD8D8
FFFF8383
E0
E0
70
E0
70
80
0
FFFF8383
FFFFD8D8
EA3
0
FFFFD8D8
1C00
FFFFD8D8
70
1C00
FFFFD8D8
0
0
FFFFD8D8
Честно, я уже разочаровался их подключить. Перечитал кучу форумов, перепробовал кучу скетчей и примеров, разные версии библиотек (от МаньякБага и АлексГайвера) - один хрен при одиночном (тоесть второй модуль ОТКЛЮЧЕН!) подключении в сериал идет беспорядочный мусор. Такое чувство, что мне продали паленые модули....
Вот и сейчас, на таком скетче, льется мусор
#include <SPI.h> #include <RF24.h> #define CE_PIN 6 #define CSN_PIN 7 const uint64_t readingPipe = 0xE8E8F0F0AALL; int len=0; char data[]=""; RF24 radio(CE_PIN, CSN_PIN); void setup() { Serial.begin(9600); radio.begin(); radio.setChannel(50); radio.setRetries(15,15); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_HIGH); radio.setAutoAck(1); radio.setPayloadSize(32); radio.openReadingPipe(1,readingPipe); radio.startListening(); } void loop() { int in; if ( radio.available() ){ radio.read( &in, sizeof(in) ); Serial.println(in); } else { Serial.println("Radio not available"); } delay(1000); }Ну, приёмник без передатчика Вы не знаю для чего выложили. Может Вы и передаёте мусор, кто ж Вас знает.
Евгений, ну я же написал - передатчика нет. Отключен он.
А так, вот вам и приемник.
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define CE_PIN 9 #define CSN_PIN 10 const uint64_t writingPipe = 0xE8E8F0F0AALL; int out = 123; RF24 radio(CE_PIN, CSN_PIN); void setup() { delay(2000); radio.begin(); radio.setChannel(50); radio.setRetries(15,15); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_HIGH); radio.setAutoAck(1); radio.openWritingPipe(writingPipe); } void loop() { radio.write( &out, sizeof(out) ); delay(1000); }канал 110 поставьте, чтобы гадость с WiFi не ловил
Инопланетяне приветы шлют!!! ПС все что внутри <> пакет а за приветы духов
/**/ unsigned long mill;// переменная для millis() typedef void (*pDo)() ;// тип -функция обработчик //---------------------------------------------- const byte numBuffer = 20; char buffer[numBuffer]; byte iBuffer = 0; bool fBuffer = false; //---------------------------------------------- void setup() { Serial.begin(9600); } void loop() { mill = millis(); if (Serial.available() > 0) { char c = Serial.read(); switch (c) { case '<': iBuffer = 0; fBuffer = true; break; case '>': if (fBuffer == true) { buffer[iBuffer] = 0; Serial.println(buffer); iBuffer = 0; fBuffer = false; } break; default: if (c >= ' ' && c <= '}' && iBuffer < numBuffer )buffer[iBuffer++] = c; } } } /**/канал 110 поставьте, чтобы гадость с WiFi не ловил
Канал выбирался на основе данных с сканера каналов - https://github.com/gcopeland/RF24/blob/master/examples/scanner/scanner.pde
Менее загруженные - 50, 104 и 112. Но при переборе любого из них - тот же мусор. "Погуляв" по форуму, добавил всевозможные атрибуты для определения параметров передачи - ничего. Я не врубаюсь, почему именно с этими модулями гемморой, судя по сообщениям иных пользователей, у других никаких таких трудностей с ними нет, и загружая их же скетчи, получается то же самое.......
Проект уже жмет, месяц остался. Хотелось бы определиться - или заработают, или их в мусорку (500р на ветер) и покупка дальнобойной уличной точки доступа wifi.
Спасибо!
Традиционно: Передатчик
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <stdint.h> #define CE_PIN 9 #define CSN_PIN 10 const uint64_t writingPipe = 0xE8E8F0F0AALL; int out = 123; RF24 radio(CE_PIN, CSN_PIN); void setup() { radio.begin(); radio.powerUp() ; Serial.begin(9600); delay(2000); radio.setChannel(104); radio.setRetries(15,15); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_MAX); radio.setAutoAck(1); radio.setCRCLength(RF24_CRC_16); radio.setPayloadSize(32); radio.openWritingPipe(writingPipe); } void loop() { radio.write( &out, sizeof(out) ); Serial.println(out); delay(1000); }...и приёмник
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <stdint.h> #define CE_PIN 9 #define CSN_PIN 10 const uint64_t readingPipe = 0xE8E8F0F0AALL; int in; RF24 radio(CE_PIN, CSN_PIN); void setup() { radio.begin(); radio.powerUp() ; Serial.begin(9600); delay(2000); radio.setChannel(104); radio.setRetries(15,15); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_MAX); radio.setAutoAck(1); radio.setCRCLength(RF24_CRC_16); radio.openReadingPipe(1,readingPipe); radio.startListening(); } void loop() { int in; if ( radio.available() ){ radio.read( &in, sizeof(in) ); Serial.println(in); } radio.stopListening(); radio.startListening(); }В общем разобрался - модули заработали. Заработали только на библиотеке от tmrh20.
Теперь создаю процедуру импорта данных с Serial-порта.
Так и написали бы в чем была проблема. А то с криками ПАМАГТИ!! все прибегают, внимания требуют, а как своим опытом поделится - жлобе одно оказывается.
Так и написали бы в чем была проблема. А то с криками ПАМАГТИ!! все прибегают, внимания требуют, а как своим опытом поделится - жлобе одно оказывается.
А проблема проста - не все библиотеки этот модуль переваривает. МаньякБаг не скушал, сторонние - тоже самое.
Подниму свою же темку - хочу оптимизировать код, добавив функцию отправки, но почему то в созданной функции IDE ругается на незадекларированную переменную. Проблема в том, что передается символьный код разного формата. Я пытаюсь забить этот код в стринговую переменную messageout и сделать условие отправки messageout>0. Но почему то в новосозданной функции он не
-----//----- String messageout; -----//----- void loop () { -----//----- if (receive == "R0") { // если принят символ 'R' (Reset)... z++; -----//----- Serial.println("SN00000000-" + z0); String messageout = "SN00000000-"+ z0; dispatch(); } if (receive == "S0") { // если принят символ 'S' (Synx)... z++; -----//----- Serial.println("SN" + time_sync0 + "-" + z0); String messageout = "SN" + time_sync0 + "-" + z0; dispatch(); logger[(z % 10)] = String ("SN" + time_sync0 + "-" + z0); } } void dispatch() { if (messageout!=0) { char trans[32]; messageout.toCharArray(trans, 32); radio.stopListening(); radio.write(&trans,sizeof(trans)+1); Serial.println("Transive..."); radio.startListening(); Serial.flush(); } }Ругается на if (messageout!=0) - 'messageout' was not declared in this scope
В чем моя ошибка?
Ругается на if (messageout!=0) - 'messageout' was not declared in this scope
В чем моя ошибка?
У Вас сразу несколько ошибок.
1. Вы выложили неполный код, чем затруднили работу тем, кто хочет Вам помочь
2. Вы используете в строке 25 необъявленную переменную messageout.
То, что Вы объявляли её в других функциях - нещитова. Что за строка 2 я не понимаю (нужен полный код).
А вообще, очень рекомендую изучить "Области видимости переменных".
Чисто политически не могу выложить что там внутри =)
Но там по сути обработчик значений с датчиков, т.е. ничего интересного для радиопередатчика.
То, что Вы объявляли её в других функциях - нещитова. Что за строка 2 я не понимаю (нужен полный код).
Ну почему же? До сетапа я ее объявил. 2ая строка - это и есть ее объявление после "дефайнов".
Ну почему же? До сетапа я ее объявил. 2ая строка - это и есть ее объявление после "дефайнов".
Вы со мной спорите или с компилятором? Он говорит необъявлена - значит необъявлена. И никаких вариантов быть не может. А если Вы там что-то объявляли, значит неправильно это делали. Если код политически секретный, то и разбирайтесь с ним политически самостоятельно.
В принципе, разобрался. Затаился иной символ после #define.
С Победой!
В принципе, разобрался. Затаился иной символ после #define.
другие обьявления messageout убрали, надеюсь? Даже в том обрывке кода. что у вас приведен - переменная обьявлена трижды.
До победы еще рано. Что то не так затаилось у меня в коде.
В тестовом скетче проеобразование в массив (input.toCharArray(transive, 32); срабатывает, в основной программе - нет.
#include <SPI.h> #include "RF24.h" RF24 radio(7,8); byte addresses[][6] = {"1Node","2Node"}; void setup() { Serial.begin(115200); Serial.println(F("Start")); radio.begin(); radio.setPALevel(RF24_PA_MAX); radio.setChannel(110); radio.setDataRate( RF24_250KBPS ) ; radio.openWritingPipe(addresses[0]); //для приемника radio.openReadingPipe(1,addresses[1]); radio.startListening(); } void loop() { if (Serial.available() >0 ) { //если в порте что-то есть, то отправляем radio.stopListening(); String input = Serial.readStringUntil('\n'); char transive[32]; input.toCharArray(transive, 32); radio.write(&transive,sizeof(transive)+1); Serial.println("Transive..."); radio.startListening(); Serial.flush(); } else { //иначе ждём и читаем что пришло char receive[32]; if( radio.available()){ while (radio.available()) { radio.read( &receive, sizeof(receive) ); } Serial.println(receive); } } }Тестовая программа передает введенную посылку на другое устройство.
Зато не работает в основной программе. В сериал другого устройства выдает пустую строчку.
Ну и код.
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <TimerOne.h> #include <SPI.h> #include "RF24.h" RF24 radio(7,8); // объявляем пины для радиомодуля byte addresses[][6] = {"1Node","2Node"}; // объявляем трубы радиопередачи long time_ev, time_ms, time_sec, time_rez, time_z = 0; // объявляем таймеры char inputString[5]; // объявляем массив для приёма String time_ev0, time_sync, time_sync0, time_per; // объявляем переменные для времени события и синхронизации String receive = ""; // объявляем переменную для принятой посылки int i, z = 0; // повторение посылки если не принято ничего int z0, z10 ; String logger[10]; String messageout; void setup() { Serial.begin(115200); Serial.setTimeout(5); radio.begin(); // запускаем радио radio.setPALevel(RF24_PA_MAX); // ставим максимальный уровень мощности radio.setChannel(110); // устанавливаем канал связи radio.setDataRate( RF24_250KBPS ) ; // устанавливаем скорость передачи данных radio.openWritingPipe(addresses[1]); // трубы передачи для передатчика radio.openReadingPipe(1,addresses[0]); radio.startListening(); // начинаем слушать канал Serial.println("IS00000000-000"); // сообщение о начале работы delay(1000); } String addZeroes(const String& src, byte pad) // процедура добавления нулей { if (src.length() >= pad) return src; String result; String messageout; byte add = pad - src.length(); while (add--) result += "0"; result += src; return result; } void loop() { if (z0==1000) { z0=0; } } void serialEvent() { while (Serial.available() > 0) { // если есть принятый символ, receive = Serial.readStringUntil('\n'); // читаем его до конца строки } if (receive == "S0") { // если принят символ 'S' (Synx)... z0++; time_rez = millis(); String time_sync = String(time_rez, HEX); String time_sync0 = addZeroes(time_sync, 8); messageout = "SN" + time_sync0 + "-" + z0; Serial.println(messageout); dispatch(); logger[(z % 10)] = String ("SN" + time_sync0 + "-" + z0); } } void dispatch() { if (sizeof(messageout)!=0) { char trans[32]; Serial.println(messageout); messageout.toCharArray(trans, 32); Serial.println(trans); radio.stopListening(); radio.write(&trans,sizeof(trans)+1); Serial.println("Transive..."); radio.startListening(); Serial.flush(); messageout=""; } }messageout, time_sync, tyme_sync0 - обьявлены дважды. Может и еще какие, внимательно не смотрел.
Вы, похоже, не понимаете, как обьявляются переменные