NRF24 что это, помехи или нет.
- Войдите на сайт для отправки комментариев
Добрый день. Делаю первые шаги в ардуино.
И пробую соединить 2 модуля NRF24L01 + PA +LNA
2 платы UNO, два модуля nrf, каждый из NRF питается отдельно от прочего 3.3 через AMS1117 (без доп кондера).
Делаю простейший пример с яркостью диода. Казалось бы всё ок, но приемник периодический, раз в 1,2 секунды читает что-то лишнее и я не могу понять помеха это или бага.
Вот тексты кодов.:
Передатчик
#include <SPI.h> // Подключаем библиотеку для работы с SPI-интерфейсом #include <nRF24L01.h> // Подключаем файл конфигурации из библиотеки RF24 #include <RF24.h> // Подключаем библиотеку для работа для работы с модулем NRF24L01 #define PIN_POT A5 // Номер пина Arduino, к которому подключен потенциометр #define PIN_CE 10 // Номер пина Arduino, к которому подключен вывод CE радиомодуля #define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля RF24 radio(PIN_CE, PIN_CSN); // Создаём объект radio с указанием выводов CE и CSN int potValue[1]; // Создаём массив для передачи значений потенциометра int sVal; int nVal; void setup() { Serial.begin(9600); radio.begin(); // Инициализация модуля NRF24L01 radio.setChannel(100); // Обмен данными будет вестись на пятом канале (2,405 ГГц) radio.setDataRate (RF24_250KBPS); // Скорость обмена данными 1 Мбит/сек radio.setPALevel(RF24_PA_HIGH); // Выбираем высокую мощность передатчика (-6dBm) radio.openWritingPipe(0x7878787878LL); // Открываем трубу с уникальным ID } void loop() { sVal = analogRead(PIN_POT); nVal = map(sVal,0,1023,0,255); Serial.println(nVal); potValue[0] = nVal; // Считываем показания потенциометра radio.write(potValue, 1); // Отправляем считанные показания по радиоканалу delay(300); }
Приемник
#include <SPI.h> // Подключаем библиотеку для работы с SPI-интерфейсом #include <nRF24L01.h> // Подключаем файл конфигурации из библиотеки RF24 #include <RF24.h> // Подключаем библиотеку для работа для работы с модулем NRF24L01 #define PIN_LED 3 // Номер пина Arduino, к которому подключен светодиод #define PIN_CE 10 // Номер пина Arduino, к которому подключен вывод CE радиомодуля #define PIN_CSN 9 // Номер пина Arduino, к которому подключен вывод CSN радиомодуля RF24 radio(PIN_CE,PIN_CSN); // Создаём объект radio с указанием выводов CE и CSN int potValue[1]; // Создаём массив для приёма значений потенциометра void setup() { Serial.begin(9600); pinMode(PIN_LED, OUTPUT); // Настраиваем на выход пин светодиода radio.begin(); // Инициализация модуля NRF24L01 radio.setChannel(100); // Обмен данными будет вестись на пятом канале (2,405 ГГц) radio.setDataRate (RF24_250KBPS); // Скорость обмена данными 1 Мбит/сек radio.setPALevel(RF24_PA_HIGH); // Выбираем высокую мощность передатчика (-6dBm) radio.openReadingPipe (1, 0x7878787878LL); // Открываем трубу ID передатчика radio.startListening(); // Начинаем прослушивать открываемую трубу } void loop() { if(radio.available()){ // Если в буфер приёмника поступили данные radio.read(&potValue, sizeof(potValue)); // Читаем показания потенциометра Serial.println(potValue[0]); analogWrite(PIN_LED, potValue[0]); // Регулируем яркость диода } else { Serial.println('no radio'); } delay(300); }
В консоли на передатчике лишнего не вижу, только числа из диапазона 0-255 (при покручивании потенциометра, меняются)
Вывод в консоль на приемнике
26991 78 79 78 78 79 78 26991 79 79 78 78 78 78 78 26991 78 79 79 79 78 78 26991 78 79 78 78 78 78 26991 78 79 78 78 78 78 78 26991 78 78
т.е. яркость диода меняется в ответ на изменение потенциометра на передатчике, но вот что за 26991
Пробовал разные setChannel, результат такой же., только этих 26991 может быть больше, иногда сразу пачками валятся.
Вопрос, помехи ли это и поможет ли электролитический кондекнсатор на 470мФ, около AMS1117
?
Спасибо.
Я правильно понимаю, что из int вы отсылаете один байт (radio.write(potValue, 1)) и потом этот байт запихиваете обратно в int?
Я правильно понимаю, что из int вы отсылаете один байт (radio.write(potValue, 1)) и потом этот байт запихиваете обратно в int?
Неправильно понимаете.
Он пишет один байт (строка 24 передатчика), а читает два (строка 23 приёмника). Чё там в буфере payloada находится, то и видим в итоге.
AlexGru, Вы поняли, что я сказал?
Неправильно понимаете.
Он пишет один байт (строка 24 передатчика), а читает два (строка 23 приёмника). Чё там в буфере payloada находится, то и видим в итоге.
Ну, я в том смысле, что на стороне приёмника в int пихается переданный байт и вчерашний ужин.
Вопрос, помехи ли это и поможет ли электролитический кондекнсатор на 470мФ, около AMS1117
На NRF24 помех быть не может от слова невозможно. Ибо в пакете есть синхрополе + CRC. Таким образом пакет либо принимается "целиком" - либо не принимается СОВСЕМ! Я думаю, что объяснил вполне внятно.
По поводу конденсатора: на NRF24 + PA мне хватало и 100мкф. но прям на ноги NRF24.
AlexGru, Вы поняли, что я сказал?
Не уверен :(
Пишем из 2-х байтной potValueпеременной явно один байт, radio.write(potValue, 1);
а читаем в 2-х байтную переменную, всё что пришло
radio.read(&potValue,
sizeof
(potValue));
Ладно бы полная лажа была при передаче, а так странно, особенно с учётом
На NRF24 помех быть не может от слова невозможно.
В общем я понял, что это чисто мои проблемы (код) чтения/записи, буду читать искать.
Ищите в районе размерности int
AlexGru - зачем вы вообще используете для приема и передачи двухбайтный инт, если старательно преобразуете значение командой map к диапазону 0-255 ? - раз преобразуете к диапазону одного байта - так один байт и передавали бы
Вообще у вас в голове, похоже, каша, инт вы от байта отличаете смутно и код, наверно, не ваш и вы его почти не понимаете... учитесь.
Вообще у вас в голове, похоже, каша, инт вы от байта отличаете смутно и код, наверно, не ваш и вы его почти не понимаете... учитесь.
Согласен, код из интернетов, вот буду вникать, по быстрому были взяты примеры.
Правда, на небольшие расстояния работаю.
А нрфка даже на максимальной мощности по расстоянию "ниаллё" Метров 500 в прямой видимости в городе. В поле не проверял.
В общем часов 5 ещё посидел, что только не делал. перепроверил коннекты по пинам. Питание. На приемнике добавил конденсатор. Все равно сама природа явления не изменилас.
От байтов перешел к массивам интов.
Код передатчика
Код приемника
Вывод на приемнике
Передактчик видит, если приемник выключен и выдает "Message not sent", тут ок.
Очень смущает следующее, если вообще выключить передатчик, то приемник выводит всё время строки
29793
и более того, если закоментить на приемнике код
то ничего не меняется, как будто функция
radio.read(&drv,
sizeof
(drv)); внутри себя выдает сообщение 29783 в консоль.
Можно конечно решить всё это анализируя состав пришедших данных или их изменчивость, но это как-то костыльно.
Ещё заметил, что если отправлять чаще чем принимать, то всё ок, этих сообщений
29783 нет.Так решать тоже не совсем правильно.
Что же я делаю не так? :(
Библиотеку использую эту https://github.com/nRF24/RF24
Давно бы написал сам библиотеку да уже бы всё давно бы работало. Там всё просто, по датащам всё расписано и есть примеры на С. Можно тупо копипастить некоторые вещи прям из датащей.
Очень смущает следующее, если вообще выключить передатчик, то приемник выводит всё время строки
29793
Что Вы написали, то он и выводит. А Вы что хотите, чтобы он выводил? Текст "no data"? Так поставьте в 35-ой строке правильные кавычки - будет выводить.
если отправлять чаще чем принимать, то всё ок, этих сообщений 29783 нет
Ну, правильно, если всегда "available", то на 35-ую строку и не попадает никогда.
Ну, правильно, если всегда "available", то на 35-ую строку и не попадает никогда.
Ну тогда и дело не в кавычках, поменяю, но.
По большому счет данные принимает, если они не приходят, хоть и available, то вижу 0 в данных.,
думаю можно считать вывод числа из функции read как некую отладочную инфу, и игнорировать просто., это ведь вывод в консоль просто, в мои переменные не попадает.
Просто хотелось разобраться почему available даже при выключенном передатчике и что за отладочная инфа.
AlexGru -если вы ничего не поняли в ответе - то не надо спорить. просто поменяйте кавычки и запустите еще раз
Чем нести бред, поменяйте лучше кавычки.
А если уж
то, для начала, разберитесь в какой именно строке скетча Вы печатаете это число "29793". Ведь у Вас нет никакой печати числа! Тогда кто же его печатает?
Вот когда в этом разберётесь, будет польза, а бредить не надо, примите галаперидольчику, полегчает.
Да, только поставил двойные кавычки, как все встало на свои места. Всем спасибо.
Да, только поставил двойные кавычки, как все встало на свои места. Всем спасибо.
ага, а то сразу "неведомая отладочная информация".... привыкайте в первую очередь искать косяки у себя.