модуль nRF24L01+ сошел с ума
- Войдите на сайт для отправки комментариев
Пт, 02/12/2016 - 19:57
Суть такая приобрел модули nRF24L01+ вроде потестил работали оба.

Тепреь они то работают то нет. Все темы с неми прочтены. Все подключено верно библа норм с ней обычные модули работают на ура а эти то передают то не передают. Заметил что когда ебру в руки как будто предача идет но не всегда. Не понятно вообщем что с ними. Кондер напаян на всякий на них. Кто то знает может есть особенность в них какая нить?
нужен конденсатор на 100 мкф припаять к каждой плате на штырьки питания.
Припаять именно на платы nRF24L01+
без них сигнал не стабильный и сам долго мучался пока не узнал об этом
А еще в паралель к элетролиту 0.1 мкф (100nF) кондесатор. И будет вам счастье.
У меня напаян кондер на все модули 100мФ и работало все эти можули приехали и не пашутточнее то работают норм то нет. Вообщем суть такая питание 5В потом плата Мини с преобразователем 5-3В этот модуль и датчик DS температурный то работал в корпус собрал не пашет разобрал поначалу питания не хватало разобрался дальше тоже самое начало происходить то работает то нет(
без запятых вообще ничего не понятно...
На клаве прсото кнопка плохо робит точнее не робит)
А мощность передатчика какую выставляете?
У меня нормально работает только на LOW(-12dBm), на всех остальных не стабильно и какой у вас источник питания модуля, он в момент передачи очень большей ток потребляет в импульсе длительностью порядка 50мл/сек!
В том то и дело что маленькие модули нормально работают а вот эти большие то работают то нет. Мистика тесты причем тестовые скетчи норм работают а так передача в моем проекте через них не идет. Скажите как лучше их запитать от отдельного источника питания? обязательно ли чтобы была общая земля у модуля и ардуины?
Земля должна быть общей обязательно, питание должно быть очень хорошим с током в 0,5А, то есть что бы выдерживало импульсный ток в 0,5А без просадки и провода которые идут на модуль я имею ввиду 3.3в и GND должны быть мощьными с сичением хотя бы 0,35 - 0.5б тогда станет стабильно работать даже на максимальной мощьности!
п.с. Вобщем паяйте стабилизатор на AMS1117-33 или покупайте готовый на ALI...
Ну так у меня ест ьтакой стабилизатор. Вот я и спрашиваю если питание на ардуину и на этот LDO будет общим то пойдет или надо именно землю с дуины?
Не совсем понимаю вашего вопроса?
У вас есть источник напряжения(какой-то БП) вы берете с него общий на LDO и +5в, с LDO на nRF24L01+ и также +3.3в, на дуину с этого же источника берете землю и +5в, в итоге соеденительный кабель между дуиной и nRF еще закальцует GND, но этот кабель уже может быть с маленьким сичение и с большим падением на проводах!
Вам самое главное к nRF подвести мощное питание которое не будет просаживаться в импульсе!
п.с. Еще вот что вспомнил про эти модули, у них есть еще одна фишка как потерия работоспособности ....
В общем надо в каждом цикле опроса делать инициализацию модуля и так тогда будет стабильно тоже работать!
Передатчик: //---nRF24L01--------------------------------------------------- // #define RF24_CE 9 //Ножка_включения_чипа(1-ВКЛ;0-ОТКЛ) #define RF24_CSN 10 //Ножка_обращения_к_модему #define Channel 110 //Рабочий_канал_2400+(Channel*1)=2510мГц #define ID_nRF24 0xA345884A01LL //Открываем трубу с идентификатором 0xA345884A01 (для передачи данных). на одном канале может быть только 1 труба, для передачи). (последний байт "идентификатора-передатчика (01)" нужен для распознавания трубами приёмника, которых может быть до 6-на одном канале). #define Modulations RF24_250KBPS //Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS). При скорости 2 Мб/с, задействуются сразу два канала (выбранный и следующий за ним). (самая дальнобойная 250KBPS, но скорость меньше) #define PowerRF24 /*RF24_PA_HIGH*/RF24_PA_LOW//Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm) #define PipeNumber 1 //Номер индификатора трубы byte FLRFError = 0; //Флаг_кода_ошибки_передатчика #define RH_RF24_MAX_MESSAGE_LEN 32 //Константа_максимального_размера_буфера //-------------------------------------------------------------- // RF24 Modem(RF24_CE, RF24_CSN); //***Init_nRF24L01********************************************** // byte Init_nRF24L01(boolean FLInfo) { //Инициализация_модуля_nRF24L01+ byte FLRFError; // if (Modem.begin()) { // FLRFError = 3; //Нормальная_инициализация_модема Modem.setChannel(Channel); //Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц.(на одном канале можно, одновременно иметь "1 передатчик-рот-труба" или "6 приёмников-ушей-трубы" Modem.setDataRate(Modulations); //Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS). При скорости 2 Мб/с, задействуются сразу два канала (выбранный и следующий за ним). (самая дальнобойная 250KBPS, но скорость меньше) Modem.setPALevel(PowerRF24); //Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm). Modem.openWritingPipe(ID_nRF24); //Открываем трубу с идентификатором 0xA345884A01LL (для передачи данных). на одном канале может быть только 1 труба, для передачи). (последний байт "идентификатора-передатчика (01)" нужен для распознавания трубами приёмника, которых может быть до 6-на одном канале). Modem.openReadingPipe(PipeNumber,ID_nRF24); //Открываем 1 трубу с идентификатором 0xA345884A01LL для приема данных ("приёмник"-на одном канале может быть открыто до 6 разных труб), (которые должны отличаться только последним байтом идентификатора) if (FLInfo) { // #ifdef Debug_RF-DATA // Serial.println("INIT-OK, is rf24_modem: Code-3"); // Serial.print("Channel-INIT:");Serial.print(Channel);Serial.print(" Freq:");Serial.print(2400+Channel);Serial.println("mHz"); Serial.print("Modulations-INIT:");Serial.print(Modulations);// Serial.println("(0-RF24_1MBPS; 1-RF24_2MBPS 2-RF24_250KBPS)"); Serial.println("----------------------------"); // Serial.print("PowerRF24-INIT:");Serial.println(PowerRF24); // Serial.println("(0-RF24_PA_MIN=-18dBm; 1-RF24_PA_LOW=-12dBm;"); Serial.println("(2-RF24_PA_HIGH=-6dBm; 3-RF24_PA_MAX=0dBm)");// Serial.println("----------------------------"); // Serial.print("PayloadSize:");Serial.print(Modem.getPayloadSize());Serial.println("byte"); Serial.print("CRCLength:(8x");Serial.print(Modem.getCRCLength());Serial.println(")bit"); Serial.println("============================"); // #endif // } // } // else {FLRFError = 2; //Ошибка_инициализация_модема if (FLInfo) { // #ifdef Debug_RF-DATA // Serial.println("No respons, is rf24_modem: Code-2 FAILED!"); Serial.println(""); // #endif // } // } // return FLRFError; // } // //***END_Init_nRF24L01****************************************** // //***START_Setup************************************************ // void setup() { // //---nRF24L01------------------------------------------------- // //FLRFError=Init_nRF24L01(true/*true-Вывод_информации;false-НЕТ*/);//Инициализация_nRF24l01+ } // //***END_Setup************************************************** // //***START_loop************************************************* // void loop() { // FLRFError=Init_nRF24L01(false/*true-Вывод_информации;false-НЕТ*/);//Инициализация_nRF24l01+ if (FLRFError != 2) {Modem.startListening();delay(100);Modem.stopListening();}//Процедура_от_зависания_модема_при_плохом_питании else if (FLRFError == 2) {delay(3000);} if (Какие-то условия при каких происходит передача данных ) { -- Ваш код обработки данных, упаковывания его --- FLRFError = Modem.write(buf,SizeBUF); if (FLRFError == 0) {Transferdata_Time_COUNT = milis+1500; //Сброс_счетчика_времени_на_1,5с_повтор_передачи_данный_в_результате_ошибки_передачи_через_1,5с #ifdef Debug_RF-DATA // Serial.println("No reply, is RH_RF24_server: Code-0; Data Send FAILED!"); //Serial.print("Milis:");Serial.print(milis);Serial.print("mS; ");Serial.print("RealMiles:");Serial.print(millis());Serial.println("mS"); //Serial.print("Transferdata_Time_COUNT:");Serial.print(Transferdata_Time_COUNT);Serial.println("mS"); Serial.println(""); // #endif // } // if (FLRFError == 1) { //Успешная_передача_данны Transferdata_Time_COUNT = TransferdataTimeCOUNT+milis; //Сброс_счетчика_времени_жадежки_10секундн #ifdef Debug_RF-DATA // Serial.println("Sending to RH_RF24_server; Code-1: Data Send");// Send a message to RH_RF24_server if (DS1IMA.ERRORCODE != 0) {Serial.print("Data_Send_to_Server: ");Serial.print(STRDS[ADRSTR]);Serial.print("; String Len:");Serial.print(strlen(STRDS[ADRSTR]));Serial.print("; DS1Error:");Serial.println(RFData/10000);} else {Serial.print("Data_Send_to_Server: ");Serial.print(STRDS[ADRSTR]);Serial.print("; String Len:");Serial.print(strlen(STRDS[ADRSTR]));Serial.print("; Temp:");Serial.println((float)RFData/100);} Serial.println(""); // #endif // } // } // if (FLRFError == 0) {Transferdata_Time_COUNT = milis+1500; //Сброс_счетчика_времени_на_1,5с_повтор_передачи_данный_в_результате_ошибки_передачи_через_1,5с //------------------------------------------------------------- // } // //***END_loop*************************************************** //Вобщем как то так!
Приемник:
//***START_loop************************************************* // void loop() { // //------------------------------------------------------------ // FLRFError=Init_nRF24L01(false/*true-Вывод_информации;false-НЕТ*/);//Инициализация_nRF24l01+ if (FLRFError != 2) {Modem.startListening();delay(100);} //Процедура_от_зависания_модема_при_плохом_питании else {if (FLRFError == 2) {if (ErrorCode==3) {FLError_Wait=false;} ErrorCode=2;delay(3000);}} if ((Modem.available(&pipe)) && (FLRFError != 2)) { // Если в буфере имеются принятые данные, то получаем номер трубы, по которой они пришли, по ссылке на переменную pipe Modem.stopListening(); ////Процедура_от_зависания_модема_при_плохом_питании if (pipe == PipeNumber) { // //---Читальщик_данных_из_буфера----------------------------- // Modem.read(buf, len); // Читаем данные в переменную TEST и указываем сколько байт читать ---Обрабатываем буфер--- } // } // if (FLRFError == 3) {if (ErrorCode==2) {ErrorCode=0;FLError_Wait=false;RF_Time_COUNT=0;}} //------------------------------------------------------------ // //***END_loop*************************************************** //Сделал отдельное питание. Тепреь мега видит его тестом но скет по отправке не работет. Все ранво. Тест простой вот код на отправку:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> const uint64_t pipe = 0xF0F1F2F3F4LL; RF24 radio(48, 49); // CE, CSN void setup(){ Serial.begin(9600); radio.begin(); delay(200); radio.setChannel(100); // канал (0-127) radio.setDataRate(RF24_1MBPS); radio.setPALevel(RF24_PA_HIGH); radio.openWritingPipe(pipe); // открываем трубу на передачу. } void loop() { int data[2]; data[0]=11; data[1]=22; radio.write(&data, sizeof(data)); delay(1000); }Дальше код на прием:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> const uint64_t pipe = 0xF0F1F2F3F4LL; RF24 radio(9, 10); // CE, CSN void setup(){ Serial.begin(9600); radio.begin(); delay(200); radio.setChannel(100); // канал (0-127) radio.setDataRate(RF24_1MBPS); radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe" radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop() { int data[2]; if (radio.available()) { radio.read(&data, sizeof(data)); // читаем данные и указываем сколько байт читать Serial.println(data[0]); Serial.println(data[1]); } }Все очень просто. Все работает на маленьких модулях а тут вроде видит его тестит а не отправляет питания точно за глаза провода сделал норм кондер повесил до кучи. И все равно анамалия какая то. Есть идеи?
Чет совсем муть какая то. Стандартный тесто скетч на передачу и прием пашет. А мой нет хотя работал раньше 100 проц. Вот результ теста отправляет Мега на 11 порте принимает нана.
Попробуйте на пониженной мощности проверить...
Думаю тут проблема в том что данному модулю надо давать больше настроек для работы. Как вы думаете? Вот скетч который тестовый тут видно что тут больше настроек.
/* March 2014 - TMRh20 - Updated along with High Speed RF24 Library fork Parts derived from examples by J. Coliz <maniacbug@ymail.com> */ /** * Example for efficient call-response using ack-payloads * * This example continues to make use of all the normal functionality of the radios including * the auto-ack and auto-retry features, but allows ack-payloads to be written optionlly as well. * This allows very fast call-response communication, with the responding radio never having to * switch out of Primary Receiver mode to send back a payload, but having the option to switch to * primary transmitter if wanting to initiate communication instead of respond to a commmunication. */ #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include "printf.h" // Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 9 & 10 RF24 radio(9,10); // Topology byte addresses[][6] = {"1Node","2Node"}; // Radio pipe addresses for the 2 nodes to communicate. // Role management: Set up role. This sketch uses the same software for all the nodes // in this system. Doing so greatly simplifies testing. typedef enum { role_ping_out = 1, role_pong_back } role_e; // The various roles supported by this sketch const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"}; // The debug-friendly names of those roles role_e role = role_pong_back; // The role of the current running sketch byte counter = 1; // A single byte to keep track of the data being sent back and forth void setup(){ Serial.begin(9600); printf_begin(); printf("\n\rRF24/examples/GettingStarted/\n\r"); printf("ROLE: %s\n\r",role_friendly_name[role]); printf("*** PRESS 'T' to begin transmitting to the other node\n\r"); // Setup and configure radio radio.begin(); radio.setAutoAck(1); // Ensure autoACK is enabled radio.enableAckPayload(); // Allow optional ack payloads radio.setRetries(0,15); // Smallest time between retries, max no. of retries radio.setPayloadSize(1); // Here we are sending 1-byte payloads to test the call-response speed radio.openWritingPipe(addresses[1]); // Both radios listen on the same pipes by default, and switch when writing radio.openReadingPipe(1,addresses[0]); // Open a reading pipe on address 0, pipe 1 radio.startListening(); // Start listening radio.powerUp(); radio.printDetails(); // Dump the configuration of the rf unit for debugging } void loop(void) { /****************** Ping Out Role ***************************/ if (role == role_ping_out){ // Radio is in ping mode byte gotByte; // Initialize a variable for the incoming response radio.stopListening(); // First, stop listening so we can talk. printf("Now sending %d as payload. ",counter); // Use a simple byte counter as payload unsigned long time = micros(); // Record the current microsecond count if ( radio.write(&counter,1) ){ // Send the counter variable to the other radio if(!radio.available()){ // If nothing in the buffer, we got an ack but it is blank printf("Got blank response. round-trip delay: %lu microseconds\n\r",micros()-time); }else{ while(radio.available() ){ // If an ack with payload was received radio.read( &gotByte, 1 ); // Read it, and display the response time printf("Got response %d, round-trip delay: %lu microseconds\n\r",gotByte,micros()-time); counter++; // Increment the counter variable } } }else{ printf("Sending failed.\n\r"); } // If no ack response, sending failed delay(1000); // Try again later } /****************** Pong Back Role ***************************/ if ( role == role_pong_back ) { byte pipeNo, gotByte; // Declare variables for the pipe and the byte received while( radio.available(&pipeNo)){ // Read all available payloads radio.read( &gotByte, 1 ); // Since this is a call-response. Respond directly with an ack payload. // Ack payloads are much more efficient than switching to transmit mode to respond to a call radio.writeAckPayload(pipeNo,&gotByte, 1 ); // This can be commented out to send empty payloads. printf("Sent response %d \n\r", gotByte); } } /****************** Change Roles via Serial Commands ***************************/ if ( Serial.available() ) { char c = toupper(Serial.read()); if ( c == 'T' && role == role_pong_back ) { printf("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK\n\r"); role = role_ping_out; // Change roles (ping out) radio.openWritingPipe(addresses[0]); // Open different pipes when writing. Write on pipe 0, address 0 radio.openReadingPipe(1,addresses[1]); // Read on pipe 1, as address 1 } else if ( c == 'R' && role == role_ping_out ) { printf("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK\n\r"); role = role_pong_back; // Become the primary receiver (pong back) radio.openWritingPipe(addresses[1]); // Since only two radios involved, both listen on the same addresses and pipe numbers in RX mode radio.openReadingPipe(1,addresses[0]); // then switch pipes & addresses to transmit. radio.startListening(); // Need to start listening after opening new reading pipes } } }Все начало работать тогда неясно как так то. Поставил LOW уровень как вы сказали. Но тогда не ясно питания в любом случии заглаза на нем кушай не хочу. Мне главное чтобы в 3х комнатной хате он ловил основной блок. Вот поэтому я и выбрал данный модуль для базы. А у маленьких модулей без усилителя дальность в квартире какая кто знает?
radio.setRetries(0,15);// Smallest time between retries, max no. of retriesУ меня зарабатало без этого всего сделал лучше провода сделал отдельное питание с общей землей и только когда поставил LOW начало передавать. До этого он его видел но не передавал с данным простых скетчем. Пока кумекаю что дальше потестировать. Завтра еще кое что попробую отпишусь. Спасибо за коменты. еще напишу.