NRF24l01

10s
Offline
Зарегистрирован: 05.11.2013

 

В общем хочу соединить ардуино в сеть. 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);
}

 

10s
Offline
Зарегистрирован: 05.11.2013

 

помогите определить, в чем проблема, надо чтобы светодиод стабильно гас и загорался по команде.

MaksMS
Offline
Зарегистрирован: 11.03.2013

На питании модуля 3.3 в желательно посадить емкость 

И кстати,модулей можно объеденить только до 6 штук !

10s
Offline
Зарегистрирован: 05.11.2013

питание стабилизированное, все модули висят у меня на 1м канале и 1 трубе, просто первый байт данных содержит номер устройства, и все же где касяк в коде?

axill
Offline
Зарегистрирован: 05.09.2011

MaksMS пишет:

И кстати,модулей можно объеденить только до 6 штук !

это откуда следует?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Это следует из описания этой библиотеки.Да вообще вроде ..

axill
Offline
Зарегистрирован: 05.09.2011

MaksMS пишет:

Это следует из описания этой библиотеки.Да вообще вроде ..

вы про какой пункт? я читал внимательно и ничего такого не видел

10s
Offline
Зарегистрирован: 05.11.2013

Прочитайте мой код, 1й байт данных и есть номер устройства и сравнивается програмно, а максимум 6 труб выходит из аппаратного лимита, так что все будет работат. Просто укажите мою ошибку: почему слейв криво принимает данные.

axill
Offline
Зарегистрирован: 05.09.2011

10s пишет:

Прочитайте мой код, 1й байт данных и есть номер устройства и сравнивается програмно, а максимум 6 труб выходит из аппаратного лимита, так что все будет работат. Просто укажите мою ошибку: почему слейв криво принимает данные.

нет такого лимита, шесть труб не равно шести устройствам, адресное пространство у чипа 40 бит - вот столько устройств и может быть в сети

10s
Offline
Зарегистрирован: 05.11.2013

Все! Проблема решена, просто я не тот кварц поставил!

MaksMS
Offline
Зарегистрирован: 11.03.2013

Какой кварц ??

Member
Offline
Зарегистрирован: 06.11.2013

10s пишет:
В общем хочу соединить ардуино в сеть. 1 мастер и много (256) слейвов. В общем тривиальная задача, но возникли непредвиденные трудности. Слейв (пока один) прекрасно передает данные, но отказывается их нормально принимать. Мастер (пока один), в свою очередь прекрасно принимает данные, но не передает.

Симптомы: отправляю на мастер через USART кучу единичек на слейве загораются оба светодиода, отправляю кучу нулей снова загораются оба светодиода. Причем если передавать по одной цифре то то работает то нет. 

это готовый пример от разработчиков библиотеки и по идее должен работать,

а у моих NRF24L01 наверное проблема с радиотрактом

Member
Offline
Зарегистрирован: 06.11.2013
10s
Offline
Зарегистрирован: 05.11.2013

я кварц не на nrf-ке менял, а на ардуино. Я собрал ардуино на макетке. А по поводу ваших траблов я бы посоветовал исключить все помехи: вайфай, всякие дрели, микроволновки. 7 раз проверить соединение т.к. есть ножка (толи SCN толи CE) которая говорит нрфке кем быть, либо передатчиком либо приемником.

xstramento
Offline
Зарегистрирован: 19.10.2013

MaksMS пишет:
На питании модуля 3.3 в желательно посадить емкость 

И кстати,модулей можно объеденить только до 6 штук !

объединить во что и почему 6 штук, магическое число ?

MaksMS
Offline
Зарегистрирован: 11.03.2013

Модуль поддерживаетаппаратно  только 6 адресов , существует  версия библиотеки RF24 создающая сеть и увеличивающие максимальное количество модулей.

xstramento
Offline
Зарегистрирован: 19.10.2013

MaksMS пишет:
Модуль поддерживаетаппаратно  только 6 адресов , существует  версия библиотеки RF24 создающая сеть и увеличивающие максимальное количество модулей.
где описана такая аппаратная поддержка шести адресов (адресов pipes ?)

MaksMS
Offline
Зарегистрирован: 11.03.2013

наверно в даташите ,и в библиотеке RF24

xstramento
Offline
Зарегистрирован: 19.10.2013

MaksMS пишет:
наверно в даташите ,и в библиотеке RF24

в datasheet 24L01 такого не встречал, а RF24.h это программная, а не аппаратная поддержка.

MaksMS
Offline
Зарегистрирован: 11.03.2013

Автор темы использует RF24 ,где ограничение на 6 каналов,но он пишет,что хочет " много (256) слейвов."