Nrf24l01+

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а как узнать на передующей стороне что пакет дошел?

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

Еще раз

передающая сторона получает статус доставки как возвращаемое значение функции write в том случае если включен Ack

 

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

... а в библиотеке RF24 по умолчанию он включен.

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

maksim пишет:

... а в библиотеке RF24 по умолчанию он включен.

уже радует что хоть кто то читает документацию, а не просто вопросы задает)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вы наверно про даташит на модуль. но что это даст? в библиотеке для этого функция есть и соответственно пришлось бы хорошенько порыться в ней чтобы понять как ее использовать. поэтому и спросил

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

Нет, мы про функцию write из стандартных примеров к библиотеке.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

предполагаю что вы про 

radio.write(msg, 1);

но каким образом из функции передачи данных извлеч данные о передаче так и не понял. объясните непонимающему

maksim
Offline
Зарегистрирован: 12.02.2012
if(radio.write(msg, 1) == 1) 
{
    то значит доставлено
}
else 
{
    не доставлено
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

maksim пишет:

if(radio.write(msg, 1) == 1) 
{
    то значит доставлено
}
else 
{
    не доставлено
}

 

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

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

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

jeka_tm пишет:

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

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

при создании экземпляра класса указываюися пины CS и CSN, все остальные обязаны соотвествовать железному SPI. вывод модуля IRQ в библиотеке никак не используется

http://code.mios.com/trac/mios_arduino-sensor/wiki/ConnectingRadioModule

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

железному. блин. но все равно спасибо.

а библиотека с софтварным существует?

 

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

тут гуляли ссылки на измененную RF24 с софтверным SPI. я их не помню, поищите

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

значит есть что поискать. спасибо

а где гуляли? в этой теме?

+ нашел где об этом говорилось. но саму библиотеку не нашел. короче проще кинуть 3 перемычки. затупил, уже привык править выводы в библиотеках и тут по привычке подцепил пины которые возможно было подцепить

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

я находил ее. но может не так перевел переводчик. с английским туго

"Встроенный против Software SPI, чтобы поместиться на iTeadStudio iBoard с нестандартным связь" я подумал в нем как раз железный. спасибо

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Добрый день!

Возникла проблема с приемником.



//приёмник

#include <SPI.h>

#include "RF24.h" // Подключаем скачанную библиотеку RF24. для работы с радио модулем NRF24L01+

//Контакты от радио модуля NRF24L01+ подключаем к pins -> Arduino

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9,10);

int pipe = 0xE8E8F0F0E1LL; // адрес радио канала

int LED_bufer;

void setup()

{

Serial.begin(9600);

radio.begin();

radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема

radio.startListening(); // Начинаем слушать эфир

}

void loop()

{
if(radio.available()){
    radio.read(&LED_bufer, 4);
    Serial.println (LED_bufer);
  }
}

Передатчика нет, а сериал прилетает мусор в виде переменной int от -32 768 до 32 767.

Ошибка в коде?

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

ingener.solovyev пишет:

Добрый день!

Возникла проблема с приемником.



//приёмник

#include <SPI.h>

#include "RF24.h" // Подключаем скачанную библиотеку RF24. для работы с радио модулем NRF24L01+

//Контакты от радио модуля NRF24L01+ подключаем к pins -> Arduino

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9,10);

int pipe = 0xE8E8F0F0E1LL; // адрес радио канала

int LED_bufer;

void setup()

{

Serial.begin(9600);

radio.begin();

radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема

radio.startListening(); // Начинаем слушать эфир

}

void loop()

{
if(radio.available()){
    radio.read(&LED_bufer, 4);
    Serial.println (LED_bufer);
  }
}

Передатчика нет, а сериал прилетает мусор в виде переменной int от -32 768 до 32 767.

Ошибка в коде?

Проблему решил. Виноват, как обычно, сам. Перепутал местами CSN и CE.

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

ingener.solovyev пишет:

Добрый день!

Возникла проблема с приемником.





//приёмник

#include <SPI.h>

#include "RF24.h" // Подключаем скачанную библиотеку RF24. для работы с радио модулем NRF24L01+

//Контакты от радио модуля NRF24L01+ подключаем к pins -> Arduino

//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9,10);

int pipe = 0xE8E8F0F0E1LL; // адрес радио канала

int LED_bufer;

void setup()

{

Serial.begin(9600);

radio.begin();

radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема

radio.startListening(); // Начинаем слушать эфир

}

void loop()

{
if(radio.available()){
    radio.read(&LED_bufer, 4);
    Serial.println (LED_bufer);
  }
}

Кстати , pipe 64 битная переменная,и должен соотвественно объявлен как uint64_t ,иначе она обрезается до 16 битной ( int)..

Конечно может и работать будет,если ошибка будет на обеих сторонах,но все же..

VLADONix
Offline
Зарегистрирован: 11.06.2013

Помогите пожалуйста!!!

Пытаюсь передать показания двух потенциометров. Библиотека - Mirf. Ни чего не получается=((т.е данные приходят через раз или в раздробленном виде. Помогите с кодом, желательно чтобы два показания были в одном пакете. Кстати, передаю текст - приходит нормально.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если испльзовать библиотеку RF24 вот как:

http://arduino.ru/forum/programmirovanie/nrf24l01?page=7#comment-40323

VLADONix
Offline
Зарегистрирован: 11.06.2013

 

VLADONix
Offline
Зарегистрирован: 11.06.2013

СПАСИБО огромное. Если честно, ты мне жизнь спас. Завтра НПК, а я на этом застрял

gsv
Offline
Зарегистрирован: 23.01.2014

Спасибо всем, кто поделился опытом, и я в ответ немного расскажу о граблях, на которые наступил при попытках соединить Arduino pro mini и GBoard. Pro mini известна всем, а вот Gboard более редкий зверь.  Была эта железка куплена в первую очередь из-за GSM модуля SIM900, который я благополучно испытал и занялся более насущными делами.

Gboard

Для радиомодуля на плате имеется специальное гнездо, так что с этим проблем быть не должно, но чтобы присоединить аналогичным образом pro mini пришлось немного повозится. В частности CE и CS на Gboard присоединены, как оказалось, к 8 и 9 выводам, а все примеры используют другие выводы (RF24 radio(9,10). На сайте производителя, благо, выложены и схема и даташит, так что после тяжких раздумий всё заработало. Почти. Pingpair сначала ругался на тайм-аут, но я заметил,что реакция  всё же есть - при выключении ардуины сообщения о посылке и ответе стали располагаться в разных строчках, а при включении печатались в одну и если набраться терпения то можно было дождаться почти правильного ответа - посланное число не соответствовало принятому, и тайм-аут получался громадным. Оказалось,что ножку 7, которая определяет роль (пинг или понг), вопреки комментарию в тексте скетча, нужно было цеплять на +, а не на землю. То есть у меня обе ардуины считали себя главными. После исправления этой ошибки ардуинки стали спариваться как кролики и тайм-аут стал в среднем 20-40 в зависимости от расстояния. Я, правда не исключаю, что ошибка всё же во мне, но так заработало.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

gsv пишет:

а вот Gboard более редкий зверь

Вы ее через FOCA плату прогаммируете? У меня периодически на данной плате подвисает COM порт. Подвисает до такой степени, что не удаляется из системы без перезагрузки. И среда в это время COM порт найте не может. Может дровишки гдето на нее отдельные лежат?

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

sav13 пишет:

Вы ее через FOCA плату прогаммируете? У меня периодически на данной плате подвисает COM порт. Подвисает до такой степени, что не удаляется из системы без перезагрузки. И среда в это время COM порт найте не может. Может дровишки гдето на нее отдельные лежат?

програмировать ее можно через любой переходник USB<->UART

обычно они делаются на чипах FTDI или Prolific. И для того и для того есть драйверы на официальных сайтах производителей самих чипов. Выясните что у вас за чип и поставьте драйвера с официального сайта производителя чипа

gsv
Offline
Зарегистрирован: 23.01.2014

Фока эта - обычный переходник, как уже было сказано. У меня установлен Archlinux и он сразу подхватывает устройство (у меня на cp2102). Проверьте соответствие выводов, поскольку на фоке их 5, а на гбоард 7 в месте подключения. По схеме проверьте правильность установки перемычек. их должно быть 4, а у меня было 2. Попробуйте другой переходник, если не поможет.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

[quote=gsv]

Фока эта - обычный переходник, как уже было сказано. У меня установлен Archlinux и он сразу подхватывает устройство (у меня на cp2102). Проверьте соответствие выводов, поскольку на фоке их 5, а на гбоард 7 в месте подключения. По схеме проверьте правильность установки перемычек. их должно быть 4, а у меня было 2. Попробуйте другой переходник, если не поможет.

 

/quote]

Спасибо. Попробую простой, которым я Mini Pro шью. ФОКА тоже оаботает нормально, но периодически COM gjldbcftn? rfr z e;t ujdjhbk

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

Подниму старую тему.

Использую RF24.h и обертку от maniacbug.

Все бы ничего и работает (один main и 3 подчиненных, если можно их так назвать - понимаю, что в принципе, они равны). На мэйне сверху висит ethernet, который вещает в локалку (GET-запросами, но не в этом суть).

Так вот, данная связка может очень ставбильно работать на протяжении долгого врени (каждые 10 минут идет опрос датчиков на кадом устройстве) - может и неделю, а может и через каждые 10 минут отваливаться по одному устройсву. То есть, в текущем опросе устройств нет ответа от 2-го, через 10 минут - от 2-го есть, зато от третьего нет, и т.д. - может по кругу идти.

Понимаю, что проблема где-то в пакетах "летающих". Прикрутил что-то вроде программного вачдога (нет пакета более 10 минут - ребут - void(* resetFunc) (void) = 0;) - помогает, но не всегда. Расстояние междук устройствами не более 5 метров (1 стена на пути).

В общем, к чему я. Полагаю, после ребута не очищается аппаратный кэш модуля NRF24L01+ (могу быть неправ). В описании класса, maniac пишет о необходимости постоянного вызова RF24Network::update(void), мол потеряются пакеты. Не подскажет ли всезнающий олл, как можно программно очистить аппаратный буфер микрухи? И как долго и сколько в этом буфере может лежать?

Может я не в ту сторону копаю. Но вот от этого "глюка" никак не могу избавиться. Может сталкивался кто с подобным? Код не привожу - слишком он большой и ИМХО никому не нужный.

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

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

железо:

- не забываем про конденсатор по питанию

- пин SS железного SPI лучше не использовать, его не аккуратное использование приведет к сбоям работы модуля и библиотеки, фишка в том, что изменение направление вход/выход этого пина автатом меняет master/slave железного SPI

- лучше на шину SPI ничего кроме радиомодуля не ставить, иначе нужно аккуратно продумать отсутствие конфликтов

- без четкого понимания не стоит трогать ни модуль ни (если все таки естдругие устройства на шине SPI) другие устройства на SPI в прерываниях

- очень полезно использовать чтение сообщений в прерываниях, но требует вдумчивому выбору того, что делать в прерывании

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

программа:

- нужно аккуратно соблюдать последовательность вызова функций библиотеки при переключении режима прием/передача

- режим передача рекомендуется включать только на время отправки и потом снова вызывать startListening()

- вдумчиво програмировать работу с передаваемыми/принятыми данными, не забывая что размер передаваемых данных ограничен, особенно актуально при использовании текстовых строк - следим за тем как передаем.принимаем терминатор строки (символ '\0x00')

- решаем осознанно использовать или нет auto ack. далеко не всегда если write возвращает 0 сообщение не доставлено

- логику программы строим так, чтобы потеря одного сообщения не рушило логимку работы (например не стоит передавать инкремент какой-то величины чтобы на приемнике копить сумму, лучше передавать готовую сумму)

Цитата:
В общем, к чему я. Полагаю, после ребута не очищается аппаратный кэш модуля NRF24L01+

не нужно его чистить. сообщение в буфере хранится до тех пор пока его не прочитают. часами не пробовал, но несколько минут точно можно в основной прамме заняться чем-то другим, НО! радиомодуль должен быть в режиме startListening() чтобы принять сообщение в буфер. Есди режим не включен - сообщения будут потеряны и буфер не спасет

 

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

axill, огромное спасибо за развернутый ответ.

Теперь по пунктам что у меня:

-Кондеры (даже керамика на всякий) висят;

- На железном SPI (пине SS, в крайнем случае) висит W5100. Им, собственно включаю и выключаю сам шилд. На остальных ногах - да - шилд теснится с NRF, но переключаю чипселект (они, конечно же разнесены) и выключаю ненужные программно - там ошибки быть не может.

- Вроде как "конфликты" продуманы включением/выключением разных устройств программным включением (знаю об инверсии - все нормально) чипселект одного устройства и выключением остальных (каждое выключаю отдельно).

- Прерывания не использую пока вообще. В дальнейшем будут использоваться совсем не для этих целей.

- Сканнер - это хорошо, однако, дом "забит" (читай - в каждой квартире) DSL-модемами, у которых дефолтом активирован вайфай и с плавающим выбором канала. то есть, получается, что там NRF-ке негде упасть :) Пока отнес насколько мог подальше от модемов на 125-й канал (2525 MHz). Однако, независимо от выбронного канала прием очень хороший - повторюсь - очень маленькое расстояние, мало того, на "головном" установлен усиленный модуль (это который NRF24L01+PA+LNA с антенной внешней), посему, практически исключаю наличие помех как фактор "неприема" кучи пачек именно с конкретного подчиненного.

startListening() как таковой у меня нет. Писал, что использую обертку от маньяка - там есть network.update(); - полагаю, что это что-то примерно тоже самое и есть network.write - полагаю, что из лиснинг в режим передачи включается только в процессе этого network.write (не ковырял библу, но это логично).

- За передачу данных и выходы за пределы тоже не волнуюсь - лично у меня передается структура из переменных (все, в принципе, целочисленные) размером 16 байт (то есть до 32 - ровно половина, которую в дальнейшем планирую использовать для передачи в составе вышеназванной структуры, char[16] - массива, но это пока в планах).

- Про ack знаю. Как правиль у меня всегда он приходит. Но бывают случаи когда и не доходит - программно повторяю отправку не более 5 раз. Если б здесь была проблема - была бы всегда, но как правило (смотрю в сериал-мониторе), когда не дошло, проходит повторная отправка и все ок. "Клиент" тоже нормально данную ситуацию отрабатывает даже если пришли 2 или 3 одинаковых пакета.

- Конечно же, никаких инкрементов и ничего подобного не передается - это было бы слишком глупо :)

Про буфер и режим startListening() спасибо за наводку - буду копать библу маньяка - посмотрим где и как там идет это переключение.

Сегодня появилось очень большое подозрение, что все это дело зависит очень сильно от источника питания. "Головное" устройство питается по USB от работающего сервера (небольшого). На выходных "помер" БП. Поставил более мощный. И вот после этого и начали творится странные вещи и пакеты хорошо если на 50% доходят. Сегодня вечером подкину внешнее питание, отключу от сервака - посмотрим, что имзенится.

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

CityCat пишет:

ребут - void(* resetFunc) (void) = 0;)

согласно рекомендациям атмела ребутить МК лучше через железный вачдог

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

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

axill, самое интересное, что МК не виснет (т.е. локальные датчики опрашивает и через w5100 успешно отдает серваку запрос), но вот по NRF передача как-то сбоит в это время. Про железный вачдог в курсе, но пока не могу осуществить - отбабахался с ним полнедели - ну не могу я, блин, прошить бут в ардуину - как это не стыдно признавать. Может у кого есть линк есть с толковым описнием?

P.S. Про эти линки в курсе: http://habrahabr.ru/post/189744/http://arduino.ru/forum/programmirovanie/programmnyi-reset - не помогло

P.P.S. All, Сорри за оффтоп :(

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

что именно не удалось с вачдогом?

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

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

axill пишет:

что именно не удалось с вачдогом?

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

Да прошить бут не удалось. Не имею ISP отдельного, а из ардуины ну никак не получается его сделать - не шьёт, собака.

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

P.S. дабы не плодить оффтоп, предлагаю связаться мылом (citycat2{at}mail{dot}ru) - думаю, есть что сказать друг другу. Спасибо.

BelkinVadim
Offline
Зарегистрирован: 09.12.2013

С помощью данного модуля, как я понял,  можно осуществить подключение до 6 устройств (используя библиотеку RF24, со всеми её стандартными возможностями). Тут http://electronix.ru/forum/lofiversion/index.php/t71190.html  предложили для увеличения кол-ва устройств все клиенты (датчики) посадить на 1 адрес, но задать каждому свой уникальный идентификатор.  Так у нас получается структура "звезда". А можно посадить на 1 адрес и клиентов и сервера? То есть у всех адрес передачи и приёма будет одинаковый, общаться между собой будут через идентификаторы.

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

Легко все делается на одном адресе , первый байт пакета(в видеструктуры) как идентификатор.Сервер принимает пакет,смотрит первый байт,и на основе его копирует пакет в ту структуру данных,которая относится к этому удаленному клиенту . Вот так : http://homes-smart.ru/index.php/oborudovanie/bez-provodov-2-4-ggts/shlyuz-ethernet-nrf24l01-w5100-na-baze-arduino-dlya-obmena-dannymi-s-nrf24l01-i-nrf24le1

 

BelkinVadim
Offline
Зарегистрирован: 09.12.2013

а как в этом случае (если все устройства сидят на одном адресе) узнать состояние передачи? как понимаю такой вариант уже не подходит?

if(radio.write(msg, 1) == 1) 
{
    то значит доставлено
}
else 
{
    не доставлено
}

 

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

Да вроде тут ничего не меняется в этом.. Вообще в примере имеется счетчик передач и счетчик ошибок - можно по ему отслеживать состояние..

BelkinVadim
Offline
Зарегистрирован: 09.12.2013

Для меня пример сложноват, но поразбираюсь (в программирование не силён, но быстро учусь).

Я просто подумал что способ 

if(radio.write(msg, 1) == 1)

подходит если используются разные адреса, и состояние передачи по данному адресу отслеживается.

А если у нас все устр-ва на одном адресе, то тут по любому какое-то устройство примет его, и отправитель получит отчет о доставке, но тому ли доставленно узнать не получится

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

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

BelkinVadim
Offline
Зарегистрирован: 09.12.2013

ustas пишет:

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

Попробовал, но запутался))) Устройство посылает информацию, содержащую свой id, id получателя и какое-то сообщение. Отправляет до тех пор пока не получит отчет либо не выйдет время выделеное на отправку например. Примут это все устройства, так как все сидят на одном адресе, извлекут оттуда id получателя и сравнят со своим, если это сообщение предназначено этому устройству, то оно должно отправить ответное сообщение, о том что сообщение получено. И опять же, получатель отправит ответ, но он должен опять же получить ответ о том что доствленно, иначе ответ может опять же не дойти. И вот получается бесконечная последовательность. Как можно по другому выстроить логику?

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

BelkinVadim пишет:

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

Не нужно получателю знать дошел ответ или нет.

BelkinVadim пишет:

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

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

BelkinVadim
Offline
Зарегистрирован: 09.12.2013

maksim пишет:

Не нужно получателю знать дошел ответ или нет.

если так то получается, получатель отправляет ответ и переключается на чтение. а если первый передатчик не получит этот ответ?

 

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

BelkinVadim пишет:

если так то получается, получатель отправляет ответ и переключается на чтение. а если первый передатчик не получит этот ответ?

maksim пишет:

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

...что означет, что если отправитель не получает ответ от получателя, то отправитель еще раз отправляет данные.

BelkinVadim
Offline
Зарегистрирован: 09.12.2013

maksim пишет:

...что означет, что если отправитель не получает ответ от получателя, то отправитель еще раз отправляет данные.

что-то сразу не додумался, спасибо за объяснение)

А кто-нибудь может рассказать про библиотеку RF24Network.h. Как понял, с её помощью можно что-то вроде сети сделать. Тут http://maniacbug.github.io/RF24Network/index.html с переводчиком толком не понял ничего. Насколько она полезна при использование библиотеки RF24.h? В случае с устр-вами на одном адресе есть ли смысл и толк от её использования?

pmaster
Offline
Зарегистрирован: 23.05.2011

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

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

Подскажите как передать сообщение(слово).


​const int id_devais = 11;
int kol_sensor = 2;
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

char *name_id[]={"Banya","tBanya"}; 

RF24 radio(8,7);
RF24Network network(radio);
const uint16_t this_node = 1; //Адрес данного модуля(баня)
const uint16_t other_node = 0; //Адрес другого модуля(сервер)

struct load{
  int id_sens;
  String name_sens; // Имя датчика
};
load Load;

void init_devais(){//Инициализация устройства
  byte otvet;
  Serial.println("Otpravka zaprosa");
  Serial.println(id_devais);
  int x=0;
  do{
    
  RF24NetworkHeader header(/*to node*/ other_node);
  bool ok = network.write(header,&id_devais,sizeof(id_devais));
    if (ok){
      Serial.println("ok.");
      x=5;
    }
    else{
      Serial.println("failed1.");
      x++;
      delay(250);
    }
  }while(x<5); 
 x=0; 
  while(x<1){
    Serial.println("Cikl while");
    network.update();
    while ( network.available() ){       
    int otvet;
    RF24NetworkHeader header;
    network.read(header,&otvet,sizeof(otvet));
      if (otvet == 1){// Устройство уже инициализированно
       Serial.println("Ustroistvo uzhe zaregistrirocvano");
       x=1;
      }
      else{//Устройство необходимо зарегистрировать
        Serial.println("Ustroistvo neobhodimo zaregistrirovat");
        for (int i=0; i < kol_sensor;i++){
          Load.id_sens=i;
          Load.name_sens=name_id[i];
          RF24NetworkHeader header(/*to node*/ other_node);
          bool ok = network.write(header,&Load,sizeof(Load));
          if (ok){
            Serial.println("Otpravlena informaciya ob ustroistve");
            Serial.println(Load.id_sens); 
            Serial.println(Load.name_sens);
            Serial.println(sizeof(Load));
          }
          else Serial.println("Oshibka otpravki informacii");
        }
        x=1;
      }
  
    }
    
  }
  
}

void setup(){
  Serial.begin(9600);
  SPI.begin();
  radio.begin();
  network.begin(/*канал*/ 90, /*Адрес данного устройства*/ this_node);
  
}

void loop(){
network.update();  
  if (Serial.available()) {         
    int val = Serial.read();            
    if (val == 'H') {  
      Serial.println("Zashli v funkciu");
      init_devais();
      Serial.println("Vishli iz funkcii");




      
      
    }
    
  }
  
}

На этом модуле выводится те слова что отправляю строка 60, 61. А на принимающей стороне толькоLoad.id_sens прилетает, а Load.name_sens нет((( В чем проблемма?

Translator
Offline
Зарегистрирован: 03.02.2014

Добрый день. Приобрел модули NRF24L01, подключил их как указано здесь, залил скетчи в приемник и передатчик, но соединения так и не дождался. Всё время "No radio available". Вроде все подключено нормально. Может я что-то упустил?

sdvdio
Offline
Зарегистрирован: 15.04.2014

Прошу прощения если задал вопрос не в той ветке ! Нужна помощь ! Хочу собрать следующую конструкцию: PROCESSING берёт некую информацию из виртуального midi порта и отправляет её в serialport

//Import libraries
import processing.serial.*;
import promidi.*;

Serial myPort;
MidiIO midiIO;
//Message to be sent
int message=0;

void setup() {  
  myPort = new Serial(this, "COM4", 9600);
  midiIO = MidiIO.getInstance(this);
  //Line that prints I/O devices in console
  midiIO.printDevices();
  //Receive input from Virtual MIDI Ports
  midiIO.openInput(0,0);
}

void draw() {}
void noteOn(Note note, int deviceNum, int midiChan){
  int vel = note.getVelocity();
  int pitch = note.getPitch();
  if(vel>0){ // If velocity > 0 set message value to note's pitch
   if(pitch==60){ message=1; } else 
   if(pitch==62){ message=2; } else 
   if(pitch==64){ message=3; } else 
   if(pitch==65){ message=4; } else 
   if(pitch==67){ message=5; } else message=0;
    } else { message=0;}
  //Send message to Arduino
  myPort.write(message);
}

arduino с радио модулем NRF24I01+ на борту подключенная к ПК слушает serialport получает данные { message=1; }{ message=2; }{ message=3; }.... и отправляет их следующей arduino с такой же конструцией. Она получает данные и выполняет определённое действие (вкл/выкл LED).

Теперь вопрос если не использовать радиомодуль а работать непосредственно напрямую через serialport  всё отлично работатет "PROCESSING ---->>> ARDUINO " (код arduino):

 // Data received from the serial port
 int val; 
 //LEDs are connected to the following pins
 int pins[] = {2,3,4,5,6}; 
 
 void setup() {
   for(int i=0; i<5; i++){
   pinMode(pins[i], OUTPUT); // Set pins as OUTPUTs
   }
   Serial.begin(9600); // Start serial communication at 9600 bps
 }
 
 void loop() {
 if (Serial.available()) { // If data is available to read,
 val = Serial.read(); // read it and store it in val
 // Turn on LEDs, depending on pitches received
  if (val == 1) { digitalWrite(pins[0],HIGH); } else
  if (val == 2) { digitalWrite(pins[1],HIGH); } else
  if (val == 3) { digitalWrite(pins[2],HIGH); } else
  if (val == 4) { digitalWrite(pins[3],HIGH); } else
  if (val == 5) { digitalWrite(pins[4],HIGH); } else
  if (val==0) { resetLEDs(); }
 }
 }
 //Function that turns all the LEDs off
 void resetLEDs(){
  for(int i=0; i<5; i++){
   digitalWrite(pins[i],LOW);
  } 
 }

Тперь цепляю NRF24I01+ получаю следующую конструкцию "PROCESSING-->>ARDUINOпередаёт---->>ARDUINOпринимает" код processing оставляю тот же код ARDUINOперед:

#include <SPI.h>
#include "RF24.h"
RF24 radio(9, 10);
const uint64_t pipe= {
0xF0F0F0F000LL};// адреса каналов приема и передачи
void setup(){
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_250KBPS); // Скорость передачи
radio.setChannel(100); // Номер канала от 0 до 127
radio.setRetries(15,15); // Кол-во попыток и время между попытками
radio.openWritingPipe(pipe); // Открываем канал передачи
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); //и отправляем их в Arduino №2
radio.startListening();
}
}

код ARDUINOприемнка:

#include <SPI.h>
#include "RF24.h"
RF24 radio(9, 10);
//пины куда подключены светодиоды
int pins[] = {1,2,3,4,5,6,7,8}; 
const uint64_t pipe = {
0xF0F0F0F000LL};// адреса каналов приема и передачи

void setup(){
  for(int i=0; i<8; i++){
  pinMode(pins[i], OUTPUT); // Set pins as OUTPUTs
  }
radio.begin();
radio.setDataRate(RF24_250KBPS); // Скорость передачи
radio.setChannel(100); // Номер канала от 0 до 127
radio.setRetries(15,15); // Кол-во попыток и время между попытками
radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема
radio.startListening(); // Начинаем слушать эфир
}

void loop(){
if(radio.available()){
char data[32] = "";
radio.read(&data, 32); //принимает пакет с Arduino №1
//Если пришла цифра 1 включаем светодиод
if (data[0] == '1') { digitalWrite(pins[0],HIGH); } else
if (data[0] == '2') { digitalWrite(pins[1],HIGH); } else
if (data[0] == '3') { digitalWrite(pins[2],HIGH); } else
if (data[0] == '4') { digitalWrite(pins[3],HIGH); } else
if (data[0] == '5') { digitalWrite(pins[4],HIGH); } else
if (data[0] == '6') { digitalWrite(pins[5],HIGH); } else
if (data[0] == '7') { digitalWrite(pins[6],HIGH); } else
if (data[0] == '8') { digitalWrite(pins[7],HIGH); } else
if (data[0] == '0') { resetLEDs(); }
}
}

void resetLEDs(){
for(int i=0; i<8; i++){
digitalWrite(pins[i],LOW);
  } 
 }

Запускаю и на приёмнике тишина. Работает только когда данные передаешь сам через 

Подскажите где ошибка в чем не прав ???? по возможности исправить код !

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вы без рф сравнивает правильно, val== 1, а с рф вдруг data[0] == '1'