Nrf24l01+

maksim
Offline
Зарегистрирован: 12.02.2012

Ветку перечитайте с начала и найдете ответ на свой вопрос.

Casper17
Offline
Зарегистрирован: 21.06.2013

День добрый. У кого получилось подключить эти модули следующим образом: Один сервер, который будет принимать данные с разных устройств по запросу или по времени. И два, три клиента с дачиками. У меня не очень получается разобраться с ними. Если кто сможет подробно объясеить и помочь буду благодарен. Пишите в аську или на почту, что бы тут не захломлять ветку. miiobuhov (сабака)mail точка ru. аська 611659742

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Casper17 пишет:

День добрый. У кого получилось подключить эти модули следующим образом: Один сервер, который будет принимать данные с разных устройств по запросу или по времени. И два, три клиента с дачиками. У меня не очень получается разобраться с ними. Если кто сможет подробно объясеить и помочь буду благодарен. Пишите в аську или на почту, что бы тут не захломлять ветку. miiobuhov (сабака)mail точка ru. аська 611659742

Так вам вон выше Максим уже ответил :) ветку перечитайте и все поймете...

Casper17
Offline
Зарегистрирован: 21.06.2013

Перечитывал, но вопросы всеравно куча!

Casper17
Offline
Зарегистрирован: 21.06.2013

maksim пишет:

Что бы долго не разбираться...
Вывод IRQ не подключаю и не использую. Это заливаете в дуину, которая подключена к компу:
 

#include <SPI.h>
#include "RF24.h"
RF24 radio(9, 10);

const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
// адреса каналов приема и передачи

void setup(){
  Serial.begin(9600);
  radio.begin();  
  radio.setDataRate(RF24_250KBPS); // Скорость передачи
  radio.setChannel(100); // Номер канала от 0 до 127
  radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[1]);  // Открываем канал передачи
  radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
}

void loop(){
  if(Serial.available()){
    char data[32] = "";
    byte i = 0;
    while(Serial.available()){
       data[i] = Serial.read();
       i++;
       delay(2);
    }
    data[i] = 0;
    radio.stopListening();
    radio.write(&data, 32);
    radio.startListening();
  }
  
  if(radio.available()){
    char data[32] = "";
    radio.read(&data, 32);
    Serial.println(data);
  }
}

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

А этот заливаете в дуину которая будет автономна:
 

#include <SPI.h>
#include "RF24.h"
RF24 radio(9, 10);

const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL};
// адреса каналов приема и передачи

void setup(){
  radio.begin();  
  radio.setDataRate(RF24_250KBPS);
  radio.setChannel(100);
  radio.setRetries(15,15);
  radio.openWritingPipe(pipes[0]);
  radio.openReadingPipe(1, pipes[1]);
  radio.startListening();
}

void loop(){
  if(radio.available()){
    char data[32] = "";
    radio.read(&data, 32);
    radio.stopListening();
    radio.write(&data, 32);
    radio.startListening();
  }
}

Суть теста - первый код получив данные из сериал, отправляет в радиоэфир пакет, второй код принимает пакет и отправляет обратно, первый принимает пакет и передает обратно в сериал. Сам не проверял на работоспособность но вроде как должен работать - то есть что написали в сериал, то и должно вернуться обратно.

Пробовал этот код, в эфире тишина(( Сначала сыпались эроглифы, потом поменял местами СN и CSN ироглифы ушли но в эфире по прежнему тишина... И в примере библиотеки mirf где пинг сервера и клиента там надо что то изменять в коде или залил как есть и все должно заработать? Пинг и на клиенте и на сервере должен отображаться в мониторинге, да?

maksim
Offline
Зарегистрирован: 12.02.2012

Что-то не так делаете. И при чем тут mirf ?

ustas
Offline
Зарегистрирован: 12.03.2012

Casper17 пишет:

Пробовал этот код, в эфире тишина(( Сначала сыпались эроглифы, потом поменял местами СN и CSN ироглифы ушли но в эфире по прежнему тишина... И в примере библиотеки mirf где пинг сервера и клиента там надо что то изменять в коде или залил как есть и все должно заработать? Пинг и на клиенте и на сервере должен отображаться в мониторинге, да?

иероглифы - надо смотреть на соответствие скорости порта в скетче и сериал-мониторе.

Cn и CSn с какой целью местами меняли?

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

Соединил две Nano и NRF24, скачал библиотеку mirf и записал на дуины скетчи ping_client и ping_server. 

Т.к. второго компа нет, запустил на компе один IDE, запустил виртуальную машину  и на ней запустил вторую IDE и подключил дуины к разным USB. Вот что вышло:

Правильно ли это работает?

З.Ы.Прошу сильно не пинать...

Casper17
Offline
Зарегистрирован: 21.06.2013

Да все правильно. У меня такая проблема. Имеется плата мега и уно(спаяна самостоятельно). Используя этот скетч

Nixoid пишет:

Нормально всё работает.

Подключил к двум Ардуино нано на 328 меге два модуля  Nrf24l01+.

Питание 3,3 вольта. SPI напрямую.

Код привожу ниже - соеденял свой комп с ноутбуком - все передаётся нормально и без ошибок.

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

Просто в одном поставьте Mirf.setRADDR((byte *)"app1");

во втором Mirf.setRADDR((byte *)"app2");

и соответсвенно в первом Mirf.setTADDR((byte *)"app2");

во втором Mirf.setTADDR((byte *)"app1");

 

вот код.

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#define MAX_BUFF 32 //Буфер приёма-передачи

void setup(){
  Serial.begin(9600);
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  
  Mirf.setRADDR((byte *)"app2"); //Хдесь задаём адрес
  Mirf.payload = MAX_BUFF; //Здесь задаём буфер
  Mirf.channel = 10; 
//Это канал приёма-передачи - должен 
//быть одинаковым у устройств.
  Mirf.config();
  
  Serial.println("Start.."); 
}

char buff[MAX_BUFF];
int c_count = 0;

void loop(){
  int i;
  //sending  
  if (c_count = Serial.available()) {
    if (c_count <= MAX_BUFF) {
      for (i=0; i<c_count; i++) {
        buff[i] = Serial.read();
      }
    } else {
      for (i=0; i<MAX_BUFF; i++) {
        buff[i] = Serial.read();
      }
    }
    buff[i] = 0;
    Mirf.setTADDR((byte *)"app1"); //Адрес!
    Serial.print(">");
    Mirf.send((uint8_t *)buff);
    while(Mirf.isSending()){
    }
    Serial.println(buff);
  }
  delay(10);
  //receiving  
  if(Mirf.dataReady()) {
    Mirf.getData((uint8_t *)buff);
    Serial.print("<");
    Serial.println(buff);
  }
  delay(100);
}

 

было выясненно, что когда отправляешь сообщения с уно, на мегу все доходит. Наоборот отправляешь, доходит очень мало сообщений. Когда я запитал передачики с противоположных ардуин, то ситуация поменялась. Отправляешь с меги все доходит, а с уны нет. Что бы не набирать текст залил скетчи пинг клиент и сервер. Теряется каждое 3,4 сообщение, но когда я запитал оба передачика от меги с помощью макетной платы, то пинг стал идеальным!! Как так?? Если на меги говорят проседает питание и из за этого сбои, а тут два передачика запитаны на одной меги и все нормально работает! И как правильно запитать передачики с внешнего питания? Я подцеплял батарейку от телефона, там напряжение показывало 3,7 в. Но передачик не работал((

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

многим помогает припайка электролитического конденсатора к пинам питания непосредственно на модуль nrf24

Casper17
Offline
Зарегистрирован: 21.06.2013

Пробовал, не помогает. Припаивал 10мкф 25в, 47мкф35в, 47мкф 16в, ничего не помогает...

Тима
Тима аватар
Offline
Зарегистрирован: 11.04.2013

а в идеале что должно выводиться? как работают эти скетчи? 

Библиотеку с примерами скачал с англоязычного сайта, а я на нем не балакаю.

з.Ы. просба сильно не пинать все еще актуальна...

Casper17
Offline
Зарегистрирован: 21.06.2013

Как правильно подключить LCD и nrf24l01 вместе?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Casper17 пишет:

Как правильно подключить LCD и nrf24l01 вместе?

ну попробуйте подключить проводами!

предлагаете пойти заварить кофе и по кофейной гуще догадыватся какой LCD и какая дуинка? и каким образом вы все это пытаетесь соединять?

Casper17
Offline
Зарегистрирован: 21.06.2013

Просто LCD и nrf24l01 работают по SPI, получается что у них miso, mosi, csk, будут общими, а ss(ce) разные, они и будут задавать какое устройство будет работать, да? И подскажите пожалуйста как правильно работать с библиотекой Mirf. Как правильно записывать данные в буфер и их отправлять. Пытаюсь сделать счетчик и что бы он отправлял значения счетчика с интервалом с 1с. При таком коде

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#define MAX_BUFF 32 //Буфер приёма-передачи

void setup(){
  Serial.begin(9600);
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
 
  Mirf.setRADDR((byte *)"app2"); //Хдесь задаём адрес
  Mirf.payload = MAX_BUFF; //Здесь задаём буфер
  Mirf.channel = 10;
//Это канал приёма-передачи - должен
//быть одинаковым у устройств.
  Mirf.config();
 
  Serial.println("Start..");
}

char buff[MAX_BUFF];
int s=0;

void loop(){
    
    s=s+1;
    buff[0] = s;
    Serial.println(s);
    Mirf.setTADDR((byte *)"app1"); //Адрес!
    Serial.print(">");
    Mirf.send((uint8_t *)buff);
    Serial.println(buff);
 
  delay(1000);

}

Он выводит таблицу аски как я понял)) Буквы, цифры, знаки по порядку.

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

Casper17 пишет:

Просто LCD и nrf24l01 работают по SPI

вовсе не обязательно LCD работает ао SPI - зависит от LCD

в случае с SPI все верно - MOSI/MISO/SCK ко всем устройствам SPI подключаются паралелльно, а выводы CE (chip enable) долджны подключаться к каждому устройству индивидуально

но есть нюансы, некоторые SPI устройства не переходсят в высокоипедансное состояние при отсутствии активирующего сигнала на CE - тогда такое устройство будет мешать другим. Если не заработает - надо смотреть нет ли такой проблемы с контроллером, который стоит на SPI устройстве

maksim
Offline
Зарегистрирован: 12.02.2012

У интерфейса SPI нет линии CE, а есть линия SS (Slave Select) или CS (Chip Select).
И вроде бы можно было бы сказать "да это одно и тоже", "придираетесь", НО вот только у 
nRF24L01 есть вывод CE и он отвечает за режим передачи/приема. А CS (SS) это вывод CSN. Так что если вы вместо CSN подключите CE, то у вас ничего не заработает.

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

maksim пишет:

У интерфейса SPI нет линии CE, а есть линия SS (Slave Select) или CS (Chip Select).

спасибо за корректировку )) у меня все еще путаница с этими абревиатурами

 

Casper17
Offline
Зарегистрирован: 21.06.2013

Спасибо! А по поводу работы с библиотекой Mirf, может кто то помочь?

.c8r
.c8r аватар
Offline
Зарегистрирован: 15.11.2011

maxim и axill, я извеняюсь за оффтоп, но тут я поднял тему, которую Вы затронули. Не могли бы Вы помочь мне с моей проблемой?

Спасибо!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

.c8r пишет:

maxim и axill, я извеняюсь за оффтоп, но тут я поднял тему, которую Вы затронули. Не могли бы Вы помочь мне с моей проблемой?

Спасибо!

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

kui
Offline
Зарегистрирован: 09.10.2012

у кого проблемы с модулем или затык в обще с его работой купите или сами соберите переходник

STC15F204+NRF24L01

заработает через TX/RX (название нпрогоните через тот же ебей, там модуль плюс переходник 180) р стоит

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

Casper17 пишет:

Спасибо! А по поводу работы с библиотекой Mirf, может кто то помочь?

лучше используйте http://maniacbug.github.io/RF24/index.html вместо mirf

исторически это самая старая библиотека для модуля и как я понял ее никто уже очень давно не доводил до ума

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

kui пишет:

у кого проблемы с модулем или затык в обще с его работой купите или сами соберите переходник

STC15F204+NRF24L01

заработает через TX/RX (название нпрогоните через тот же ебей, там модуль плюс переходник 180) р стоит

у кого проблемы с получением результата от микроконтроллеров лучше купить смапт ТВ и управлять им с помощью голоса и жестов ( из свежей рекламы ))))))

нормально модуль работает по SPI, STC15F204 другой МК, как-то криво решать проблему одного МК путем встраивания посредником другого

kui
Offline
Зарегистрирован: 09.10.2012

axill пишет:

kui пишет:

у кого проблемы с модулем или затык в обще с его работой купите или сами соберите переходник

STC15F204+NRF24L01

заработает через TX/RX (название нпрогоните через тот же ебей, там модуль плюс переходник 180) р стоит

у кого проблемы с получением результата от микроконтроллеров лучше купить смапт ТВ и управлять им с помощью голоса и жестов ( из свежей рекламы ))))))

нормально модуль работает по SPI, STC15F204 другой МК, как-то криво решать проблему одного МК путем встраивания посредником другого

тема посвящена этому модулю, на мой взгляд моё сообщение с указанием инфы о девайсе, который позволяет использовать UART (эекономя ножки МК и оставляя свободным SPI) вместо SPI вполне относится к теме. К чему Ваши умствования не совсем понятно. Ах да возвысится над якобы над нубами, высмеять чужую безграмотность и подчеркнуть свою осведомлённость, и это на форуме посвященному ардуино - самим то не смешно? )))) да и криво не криво - не вам решать,  предложите своё прямое решение общения данного модуля по UART без помощи другого МК ибо это глупо с Ваших слов, а пока не предложите - вы нуб))

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

не принимайте близко к сердцу - ничего личного, сам над собой смеюсь)) у меня с модулем пока тоже не очень получается (со стабильностью передачи), но это только укрепляет веру в то, что SPI это правильный выбор))

использовать ваш вариант для смены SPI на UART - идея вполне хорошая наверно для каких-то задач, но вы это предложили не как альтернативу SPI, а как решение проблем. Вот с последним собственно я и не согласился. Все нормально работает по SPI, нужно только правильно подключить провода и правильно использовать библиотеки. Если что-то не так - не повод переключаться на UART.

Casper17
Offline
Зарегистрирован: 21.06.2013

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

maksim
Offline
Зарегистрирован: 12.02.2012

Какой вам мануал нужен? Перечитайте ветку с начала - уже все обмусолили до некуда. Как перечитаете, подключите, все заработает не пропадайте, а напишите/нарисуйте мануал и выложите сюда.

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

сделал свой шил (шилдик) для установки модуля на мегу + встроил туда же часики ds1307 с батарейкой. немного накосячил при разводке, но это решилось не сложно. Шилд сделал для установки позади ethernet шилда, чтобы не вести отдельные провода к пину 3.3в для питания модуля - поставил отдельную микросхему 1117-3.3. К модулю подключен железный SPI (пины 50-MISO, 51-MOSI, 52-SCK), CE - 48, CS - 49, IRQ - 53 (он же INT0 чтобы если что использовать работу по прерываниям)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

получил вот сегодня чипы в коробке с огромной надписью ВСТРЫВАТЬ ТОЛЬКО В ПОМЕЩЕНИИ ЗАЩИЩЕНОМ ОТ СТАТИКИ! ( долго чесал лысину).... жду когда платы приедут....

.c8r
.c8r аватар
Offline
Зарегистрирован: 15.11.2011

ВАС справшивали?! Все уже видели чего умного Вы мне насоветовали.

Casper17
Offline
Зарегистрирован: 21.06.2013

axill пишет:

лучше используйте http://maniacbug.github.io/RF24/index.html вместо mirf

исторически это самая старая библиотека для модуля и как я понял ее никто уже очень давно не доводил до ума

А как правильно заносить значение переменной в буфер(data), для ее передачи?

arturmon
Offline
Зарегистрирован: 02.07.2011

Может и мне поможете )

собрал два девайса один мега с кодом

RF24 radio(40,53);

// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };// адреса каналов приема и передачи

//создаём структуру для передачи значений---------------------------------------------------------

typedef struct{
  int identifier;
  int Rele_1_duine2; //Команда на переключение реле duine2
  int Rele_2_duine2;
  int Rele_3_duine2;
  int Rele_4_duine2;
}
A_t;
 
typedef struct{
  int identifier;// этот номер передатчика для идентификации в принятом пакете данных
  int light_Sensor;//Датчик BH1750
  float temperature_Sensor;// передаём температуру )
  int Analog_sensor_A0;//еще датчик
  int Analog_sensor_A1;//еще датчик
  int Analog_sensor_A2;//еще датчик
  int Analog_sensor_A3;//еще датчик  
  int Digital_sensor_D3;  
  int Digital_sensor_D4;
  boolean Rele_1;  
  boolean Rele_2;
  boolean Rele_3;
  boolean Rele_4;
  int Error_Message;  
  long count;
}
B_t;
 
A_t duino1_Mega; 
B_t duino2;  


int count;    //переменная для счётчика циклов

void setup ()
{
  count = 0;
  
  radio.begin();

  // Скорость передачи
    radio.setDataRate(RF24_250KBPS); 

  radio.setRetries(15,15);


  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(76);
  radio.setCRCLength(RF24_CRC_16);


  radio.openWritingPipe(pipes[1]);
  radio.openReadingPipe(1,pipes[0]);

  radio.startListening();
}

void loop(){

  duino1_Mega.identifier = 250;
  duino1_Mega.Rele_1_duine2 = OFF;
  duino1_Mega.Rele_2_duine2 = ON;
  duino1_Mega.Rele_3_duine2 = OFF;
  duino1_Mega.Rele_4_duine2 = ON;

  // radio stuff
  if ( radio.available() )
  {
    bool done = false;
    while (!done)
    {
      done = radio.read( &duino2, sizeof(duino2) );
    }
    delay(20);
    radio.stopListening();
    radio.write( &duino1_Mega, sizeof(duino1_Mega) );
    radio.startListening();
  }
}

код для uno

RF24 radio(9,10);


// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0F1LL, 0xF0F0F0F0D2LL }; // адреса каналов приема и передачи


typedef struct{
  int identifier;
  int Rele_1_duine2; //Команда на переключение реле duine2
  int Rele_2_duine2;
  int Rele_3_duine2;
  int Rele_4_duine2;
  long count_Mega;
}
A_t;

typedef struct{
  int identifier;// этот номер передатчика для идентификации в принятом пакете данных
  int light_Sensor;//Датчик BH1750
  float temperature_Sensor;// передаём температуру )
  int Analog_sensor_A0;//еще датчик
  int Analog_sensor_A1;//еще датчик
  int Analog_sensor_A2;//еще датчик
  int Analog_sensor_A3;//еще датчик  
  int Digital_sensor_D3;  
  int Digital_sensor_D4;
  boolean Rele_1;  
  boolean Rele_2;
  boolean Rele_3;
  boolean Rele_4; 
  int Error_Message; 
  long count;// счетчик передач используется для контроля качества канала  
}
B_t;
 
A_t duino1_Mega; 
B_t duino2; 

int count;    //переменная для счётчика циклов

void setup()
{
}
void loop()
{
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(76);
  radio.setCRCLength(RF24_CRC_16);
  radio.setRetries(15,15);

radio.openWritingPipe(pipes[1]); // Открываем канал передачи
radio.openReadingPipe(1,pipes[0]); // Открываем один из 6-ти каналов приема  


  // Заполнение структуры данными
  duino2.identifier = 11;// этот номер передатчика для идентификации в принятом пакете данных
  duino2.light_Sensor = val;//Датчик BH1750
  duino2.temperature_Sensor = Get_18B20_Data(); //DS18B20
  duino2.Analog_sensor_A0 = analogRead(A0)/102.3;
  duino2.Analog_sensor_A1 = analogRead(A1)/102.3;
  duino2.Analog_sensor_A2 = analogRead(A2);
  duino2.Analog_sensor_A3 = analogRead(A3);
  duino2.Digital_sensor_D3 = digitalRead(3);
  duino2.Digital_sensor_D4 = pirState; 
  duino2.Rele_1 = digitalRead(RELE_1); 
  duino2.Rele_2 = digitalRead(RELE_2);
  duino2.Rele_3 = digitalRead(RELE_3);
  duino2.Rele_4 = digitalRead(RELE_4);
if (duino2.count <= 2147483646)  duino2.count++;      // счетчик передач используется для контроля качества канала
  else
    duino2.count = 0;
  // Заполнение структуры данными
   
  // radio stuff
  radio.stopListening();
  bool ok = radio.write( &duino2, sizeof(duino2) );
    if (ok)
      printf("ok...");
    else
      printf("failed.\n\r");

  radio.startListening();
 
  unsigned long started_waiting_at = millis();
  bool timeout = false;
  while ( ! radio.available() && ! timeout )
    if (millis() - started_waiting_at > 250 )
      timeout = true;
 
  if ( timeout )
  {
    Serial.println("Failed, response timed out.");
     duino2.Error_Message++;
  }
  else
  {
    radio.read( &duino1_Mega, sizeof(duino1_Mega) );
  }
}

так вот в чем вопрос, наверное заметили странность в "трубах" канала

radio.openWritingPipe(pipes[1]); // Открываем канал передачи
radio.openReadingPipe(1,pipes[0]); // Открываем один из 6-ти каналов приема

они одинаковые! и что самое странное в таком состоянии все работает обе структуры наполняются и видятся на обоих устройствах.

как только ставишь нормально:

мега:

  radio.openWritingPipe(pipes[0]);
  radio.openReadingPipe(1,pipes[1]);

uno:

radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);

то все заглот... полная тишина. использую бибилотеку от manyaca

может кто сталкивался с таким? подскажите где закралась ошибка

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

Casper17 пишет:

axill пишет:

лучше используйте http://maniacbug.github.io/RF24/index.html вместо mirf

исторически это самая старая библиотека для модуля и как я понял ее никто уже очень давно не доводил до ума

А как правильно заносить значение переменной в буфер(data), для ее передачи?

буфер - любые данные размером до 32 байт. размер должен совпадать с payloadsize - это размер пакета для обмена данными

// CE - 48, CSN - 49
RF24 radio(48, 49);

void setup(void) {
  Serial.begin(57600);
  Serial.println("started");
   
  radio.begin();

  // размер пакета для обмена
  radio.setPayloadSize(32);
  
 // адрес этого устройства
  radio.openReadingPipe(1, 0x1111111111);  
  
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

У меня глупый вопрос наверно.. а почему вы просто не возмете библиотеку в которой уже все доведено до ума?

берем например RF24Network

и завязываем возится с трубами и изобретать лисапед

ну например я вынес в отдельную функцию передачу

void net_radio_send(){

  network.update();

    Serial.print("Sending...");

    RF24NetworkHeader header(/*to node*/ other_node);
    bool ok = network.write(header,&payload,sizeof(payload));
    if (ok)
      Serial.println("ok.");
    else
      Serial.println("failed.");
	}
}

 

arturmon
Offline
Зарегистрирован: 02.07.2011

все разобрался, ошибка закралась подлая, ошибся в одной букве канала передачи.

только я и так пользуюсь бибилотекой доведенной до ума )

#include "nRF24L01.h"
#include "RF24.h"

у меня обмен пока происходит постоянно. без header.

а например как сделать двухсторонний обмен в этой бибилотеке RF24Network?

с возможностью расширения колличества нод ), буду признателен если подскажете куда копать

mihart
Offline
Зарегистрирован: 14.05.2013

STC15F204+NRF24L01

учитывая что STC15F204 это 8051 чип, лучше тогда сразу использовать NRF24LE.

Скорее бы приехали, уже полтора месяца жду.

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

mihart пишет:

STC15F204+NRF24L01

учитывая что STC15F204 это 8051 чип, лучше тогда сразу использовать NRF24LE.

Скорее бы приехали, уже полтора месяца жду.

ко мне приехали, правда руки не доходят

Casper17
Offline
Зарегистрирован: 21.06.2013

Организовал передачу данных, а точнее пока что просто счетчик с интервалом в 1с. Una посылает данные, mega принимает. Использовал библиотеку rf24. Решил это дело вывести на дисплей, стандартный 16х2.

/* Подключаем библиотеку для работы с LCD */
#include <LiquidCrystal.h>
/* Создаём объект LCD-дисплея, используя конструктор класса LiquidCrystal
* с 6ю аргументами. Библиотека по количеству аргументов сама определит,
* что нужно использовать 4-битный интерфейс.
* Указываем, к каким пинам Arduino подключены выводы дисплея:
*   RS(MISO), E(MOSI), DB4, DB5, DB6, DB7
*/
LiquidCrystal lcd(50, 51, 5, 4, 3, 2);

#include <SPI.h>

#include "RF24.h"
RF24 radio(8, 7);

const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; // адреса каналов приема и передачи

void setup(){
  Serial.begin(9600);
  
  /* Инициализируем дисплей: 2 строки по 16 символов */
 lcd.begin(16, 2);
 /* Выводим на дисплей  фразу  */
 lcd.print("Temperatura!");
 
  radio.begin();
  radio.setPayloadSize(32);  
  radio.setDataRate(RF24_250KBPS); // Скорость передачи
  radio.setChannel(10); // Номер канала от 0 до 127
  //radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[1]);  // Открываем канал передачи
  radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
}

void loop(){
int data=0;
  
  if(radio.available()){
    //char data[32] = "";
    
    radio.read(&data, 32);
    Serial.println(data);
    }
    
  /* Устанавливаем курсор в 1 столбец 2й строки. Нумерация идёт с нуля,
  * первым аргументом идёт номер столбца.
  */
 lcd.setCursor(0, 1);
 
 lcd.print(data);
  
  
  
  
}

И как результат ничего не работает. Вторая строка вообще не выводится, хоть стандартную надпись, хоть данные которые приходят. Первая строчка искажается в хаотичном порядке при запуске скетча, и со временем все стирается от туда. В мониторинге все хорошо, все приходит. Выводы Miso и Mosi я объеденил. Остальное не трогал. Такое начинается когда вставляешь код настроики радио в setup

А это выводится если инициализацию диспле прописать после настроек радио, т.е. в конце setup-а

Кто что подскажет?

kui
Offline
Зарегистрирован: 09.10.2012

Casper17 пишет:

 

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

Кто что подскажет?

если все приходит в "мониторинге" - значит в lcd проблема. попробуйте использовать lcd.clear()/ В скетче где  lcd.print("Temperatura!"перед этим то же необходимо установить курсор lcd.setCursor 

/* Подключаем библиотеку для работы с LCD */
#include <LiquidCrystal.h>
/* Создаём объект LCD-дисплея, используя конструктор класса LiquidCrystal
* с 6ю аргументами. Библиотека по количеству аргументов сама определит,
* что нужно использовать 4-битный интерфейс.
* Указываем, к каким пинам Arduino подключены выводы дисплея:
*   RS(MISO), E(MOSI), DB4, DB5, DB6, DB7
*/
LiquidCrystal lcd(50, 51, 5, 4, 3, 2);

#include <SPI.h>

#include "RF24.h"
RF24 radio(8, 7);

const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; // адреса каналов приема и передачи

void setup(){
  Serial.begin(9600);
  
  /* Инициализируем дисплей: 2 строки по 16 символов */
 lcd.begin(16, 2);
 /* Выводим на дисплей  фразу  */
 
lcd.setCursor(1, 1);
lcd.print("Temperatura!");
 
  radio.begin();
  radio.setPayloadSize(32);  
  radio.setDataRate(RF24_250KBPS); // Скорость передачи
  radio.setChannel(10); // Номер канала от 0 до 127
  //radio.setRetries(15,15); // Кол-во попыток и время между попытками
  radio.openWritingPipe(pipes[1]);  // Открываем канал передачи
  radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир
}

void loop(){
int data=0;
  
  if(radio.available()){
    //char data[32] = "";
    
    radio.read(&data, 32);
    Serial.println(data);
    }
    
  /* Устанавливаем курсор в 1 столбец 2й строки. Нумерация идёт с нуля,
  * первым аргументом идёт номер столбца.
  */
 lcd.setCursor(0, 1);
 
 lcd.print(data);
  delay (1000); // - может и не нужно
  
  
  
}
arturmon
Offline
Зарегистрирован: 02.07.2011

объясните пожалуйста не понимющему, а зачем при передачи пытаться все запихнуть в массив? когда мне кажется проще передавать структурой, да и рабоать со структурой поудобней т.к. можно хранить данные с разных датчиков и в разных форматах( int, float и т.д.) в отличии от массива?

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

arturmon пишет:

объясните пожалуйста не понимющему, а зачем при передачи пытаться все запихнуть в массив? когда мне кажется проще передавать структурой, да и рабоать со структурой поудобней т.к. можно хранить данные с разных датчиков и в разных форматах( int, float и т.д.) в отличии от массива?

вы правы - структурой удобнее и понятней, но не принципиально, все равно фактическая передача идет байтами от 1 до 32.

maksim
Offline
Зарегистрирован: 12.02.2012

Casper17 пишет:

*   RS(MISO), E(MOSI), DB4, DB5, DB6, DB7
*/
LiquidCrystal lcd(50, 51, 5, 4, 3, 2);

И как результат ничего не работает.

SPI: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS). 

И кстати, а где мануал?

arturmon
Offline
Зарегистрирован: 02.07.2011

axill пишет:

arturmon пишет:

объясните пожалуйста не понимющему, а зачем при передачи пытаться все запихнуть в массив? когда мне кажется проще передавать структурой, да и рабоать со структурой поудобней т.к. можно хранить данные с разных датчиков и в разных форматах( int, float и т.д.) в отличии от массива?

вы правы - структурой удобнее и понятней, но не принципиально, все равно фактическая передача идет байтами от 1 до 32.

а я уже было испугался что делаю не по феншую )

тогда значит мой пример очень даре рабочий ( только заменить нужноconst uint64_t pipes[2] = { 0xF0F0F0F0F1LL, 0xF0F0F0F0D2LL }; чтоб одинаковые адреса были)

внесу разнообразие в обсуждение )

и еще заметил странность, скорее даже не странность, а нужно похоже переходить на прерывания т.к. с сетевым шилдом, когда по веб интерфейсу лазищь, пакеты теряются (

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

я так понял что дисплей тоже на SPI

не можно ничего пихнуть в дисплей. потому что SPI занята прослушиванием эфира :)

там выше в теме уже обсуждалось. почему rf24 и Ethernet ловят глюки и не инициализуются... 

вы должны закончить с одним прибором на SPI и переключится на другой... вы не можете в процессе прыгать туда сюда...

и очень сложно слушать эфир и тут же пытатся чего то пихать на дисплей :) 

про ноды, смотрите мой пример... задаеш ноду куда шлеш все и отсылаеш :)

Casper17
Offline
Зарегистрирован: 21.06.2013

Проблемма решилась путем изменения пинов miso и mosi у LCD на любые другие, в моем случае на 43, 44. И все заработало))

LiquidCrystal lcd(43, 44, 5, 4, 3, 2);

 

arturmon
Offline
Зарегистрирован: 02.07.2011

Модет кто подскажет как нормально реализовать прием и в тоже время нормальную работу ethernet шилда? А то пакеты теряются зараза. Прерывания использовать для nf думаю будет не лучшее решение. Как думаете?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

это все тут уже обсуждалось в этой ветке...

какая у вас клева SPI раз и на другие пины переназначил... вот бы мне где такую найти...

Casper17
Offline
Зарегистрирован: 21.06.2013

Puhlyaviy пишет:

это все тут уже обсуждалось в этой ветке...

какая у вас клева SPI раз и на другие пины переназначил... вот бы мне где такую найти...

Факт в том что работает. Может в библиотеке как-то програмно заменяется... И если не переназначать, то как можно реализовать правильно?