NRF24l01
- Войдите на сайт для отправки комментариев
В общем хочу соединить ардуино в сеть. 1 мастер и много (256) слейвов. В общем тривиальная задача, но возникли непредвиденные трудности. Слейв (пока один) прекрасно передает данные, но отказывается их нормально принимать. Мастер (пока один), в свою очередь прекрасно принимает данные, но не передает.
Симптомы: отправляю на мастер через USART кучу единичек на слейве загораются оба светодиода, отправляю кучу нулей снова загораются оба светодиода. Причем если передавать по одной цифре то то работает то нет.
Еще одна странная особенность если я слейв перезагружаю, то светодиоды загораются, так как были до перезагрузки. Видимо не очищается буфер в nrf24l01 но по идее так не должно быть.
Прилогаю программы обоих устройств:
Слейв
//слейв #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9,10); const uint64_t pipes[2] = { 0xFFFFF0F0E1LL, 0xFFFFF0F0D2LL }; const int led = 6; const int led1 = 7; //Объявление структур typedef struct{ byte a; //номер устройства byte b; //каманда (данные) byte c; //резерв на будущее byte d; //резерв на будущее } A_t; typedef struct{ byte a; //номер устройства byte b; //каманда (данные) byte c; //резерв на будущее byte d; //резерв на будущее } B_t; A_t duinoT; //структура на передачу transmit B_t duinoR; //структура на прием resive void setup() { pinMode(led, OUTPUT); radio.begin(); radio.openWritingPipe(pipes[0]); radio.openReadingPipe(1,pipes[1]); } void loop(void) { duinoT.a = 0x01; //занос данных в структуру: id duinoT.b = analogRead(0)/4; //занос данных в структуру: значение (пока переменный резистор) duinoT.c = 0xFF; //занос данных в структуру: просто значение зарезервировоно на будущее duinoT.d = 0xEF; //занос данных в структуру: просто значение зарезервировоно на будущее Send(); //функция отправки Resive(); //функция приема delay(5); //чтобы много не спамило //топорное зажигание светодиодов if (duinoR.a == 0x01) //duinoR.a это номер слейва { digitalWrite(led,1); if (duinoR.b == 0x01)//duinoR.a это "команда" digitalWrite(led1,1); else digitalWrite(led1,0); } } //функция отправки void Send (void) { radio.stopListening(); radio.write( &duinoT, sizeof(duinoT)); //забивание данных из структуры в эфир radio.startListening(); } //функция приема void Resive (void) { boolean done = false; while (!done){ done = radio.read( &duinoR, sizeof(duinoR));//забивание данных из эфира в структуру (на мастере отлично работает) }}
И мастера:
//мастер #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9,10); const uint64_t pipes[2] = { 0xFFFFF0F0E1LL, 0xFFFFF0F0D2LL }; typedef struct{ byte a; //номер устройства byte b; //каманда (данные) byte c; //резерв на будущее byte d; //резерв на будущее } A_t; typedef struct{ byte a; //номер устройства byte b; //каманда (данные) byte c; //резерв на будущее byte d; //резерв на будущее } B_t; A_t duinoT; //структура на передачу transmit B_t duinoR; //структура на прием resive void setup() { Serial.begin(19200); radio.begin(); radio.openWritingPipe(pipes[1]); radio.openReadingPipe(1,pipes[0]); } void loop(void) { if (radio.available()) { Resive(); //прием Log(); //слив данных на комп } //определение пришедшей цифры с компа if (Serial.available() > 0) { byte val = Serial.read(); Serial.println(val); if (val == '0')//если 0 то duinoT.b = 0 { duinoT.a = 0x01; duinoT.b = 0x00; duinoT.c = 0x02; duinoT.d = 0x03; Send(); Serial.println("0"); } if (val == '1')//если 1 то duinoT.b = 1 { duinoT.a = 0x01; duinoT.b = 0x01; duinoT.c = 0x02; duinoT.d = 0x03; Serial.println("1"); Send(); } } } //функция передачи (на слейве отлично работает) void Send (void) { radio.stopListening(); radio.write( &duinoT, sizeof(duinoT)); radio.startListening(); } //функция приема void Resive (void) { boolean done = false; while (!done){ done = radio.read( &duinoR, sizeof(duinoR)); }} //лог void Log (void) { Serial.print(duinoR.a); Serial.print(" "); Serial.print(duinoR.b); Serial.print(" "); Serial.print(duinoR.c); Serial.print(" "); Serial.println(duinoR.d); }
помогите определить, в чем проблема, надо чтобы светодиод стабильно гас и загорался по команде.
На питании модуля 3.3 в желательно посадить емкость
И кстати,модулей можно объеденить только до 6 штук !
питание стабилизированное, все модули висят у меня на 1м канале и 1 трубе, просто первый байт данных содержит номер устройства, и все же где касяк в коде?
И кстати,модулей можно объеденить только до 6 штук !
это откуда следует?
Это следует из описания этой библиотеки.Да вообще вроде ..
Это следует из описания этой библиотеки.Да вообще вроде ..
вы про какой пункт? я читал внимательно и ничего такого не видел
Прочитайте мой код, 1й байт данных и есть номер устройства и сравнивается програмно, а максимум 6 труб выходит из аппаратного лимита, так что все будет работат. Просто укажите мою ошибку: почему слейв криво принимает данные.
Прочитайте мой код, 1й байт данных и есть номер устройства и сравнивается програмно, а максимум 6 труб выходит из аппаратного лимита, так что все будет работат. Просто укажите мою ошибку: почему слейв криво принимает данные.
нет такого лимита, шесть труб не равно шести устройствам, адресное пространство у чипа 40 бит - вот столько устройств и может быть в сети
Все! Проблема решена, просто я не тот кварц поставил!
Какой кварц ??
Симптомы: отправляю на мастер через USART кучу единичек на слейве загораются оба светодиода, отправляю кучу нулей снова загораются оба светодиода. Причем если передавать по одной цифре то то работает то нет.
это готовый пример от разработчиков библиотеки и по идее должен работать,
а у моих NRF24L01 наверное проблема с радиотрактом
расскажи пожалуйста подробней, у меня тоже проблемы с 24L01 , которые уходят при удерживании кварца рукой
я кварц не на nrf-ке менял, а на ардуино. Я собрал ардуино на макетке. А по поводу ваших траблов я бы посоветовал исключить все помехи: вайфай, всякие дрели, микроволновки. 7 раз проверить соединение т.к. есть ножка (толи SCN толи CE) которая говорит нрфке кем быть, либо передатчиком либо приемником.
И кстати,модулей можно объеденить только до 6 штук !
Модуль поддерживаетаппаратно только 6 адресов , существует версия библиотеки RF24 создающая сеть и увеличивающие максимальное количество модулей.
наверно в даташите ,и в библиотеке RF24
в datasheet 24L01 такого не встречал, а RF24.h это программная, а не аппаратная поддержка.
Автор темы использует RF24 ,где ограничение на 6 каналов,но он пишет,что хочет " много (256) слейвов."