вы наверно про даташит на модуль. но что это даст? в библиотеке для этого функция есть и соответственно пришлось бы хорошенько порыться в ней чтобы понять как ее использовать. поэтому и спросил
if(radio.write(msg, 1) == 1)
{
то значит доставлено
}
else
{
не доставлено
}
о спасибо. значит добавлю индикатор подсоеденения в пульт для машинки.
но появился еще вопрос. 2 раза смотрел библиотеку RF24 для модуля, не смог найти настройку выводов подключения. может уже поздно и проглядел. подскажите пожалуйста. очень надо
о спасибо. значит добавлю индикатор подсоеденения в пульт для машинки.
но появился еще вопрос. 2 раза смотрел библиотеку RF24 для модуля, не смог найти настройку выводов подключения. может уже поздно и проглядел. подскажите пожалуйста. очень надо
при создании экземпляра класса указываюися пины CS и CSN, все остальные обязаны соотвествовать железному SPI. вывод модуля IRQ в библиотеке никак не используется
+ нашел где об этом говорилось. но саму библиотеку не нашел. короче проще кинуть 3 перемычки. затупил, уже привык править выводы в библиотеках и тут по привычке подцепил пины которые возможно было подцепить
//приёмник
#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.
//приёмник
#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.
//приёмник
#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)..
Конечно может и работать будет,если ошибка будет на обеих сторонах,но все же..
Пытаюсь передать показания двух потенциометров. Библиотека - Mirf. Ни чего не получается=((т.е данные приходят через раз или в раздробленном виде. Помогите с кодом, желательно чтобы два показания были в одном пакете. Кстати, передаю текст - приходит нормально.
Спасибо всем, кто поделился опытом, и я в ответ немного расскажу о граблях, на которые наступил при попытках соединить Arduino pro mini и GBoard. Pro mini известна всем, а вот Gboard более редкий зверь. Была эта железка куплена в первую очередь из-за GSM модуля SIM900, который я благополучно испытал и занялся более насущными делами.
Для радиомодуля на плате имеется специальное гнездо, так что с этим проблем быть не должно, но чтобы присоединить аналогичным образом pro mini пришлось немного повозится. В частности CE и CS на Gboard присоединены, как оказалось, к 8 и 9 выводам, а все примеры используют другие выводы (RF24 radio(9,10). На сайте производителя, благо, выложены и схема и даташит, так что после тяжких раздумий всё заработало. Почти. Pingpair сначала ругался на тайм-аут, но я заметил,что реакция всё же есть - при выключении ардуины сообщения о посылке и ответе стали располагаться в разных строчках, а при включении печатались в одну и если набраться терпения то можно было дождаться почти правильного ответа - посланное число не соответствовало принятому, и тайм-аут получался громадным. Оказалось,что ножку 7, которая определяет роль (пинг или понг), вопреки комментарию в тексте скетча, нужно было цеплять на +, а не на землю. То есть у меня обе ардуины считали себя главными. После исправления этой ошибки ардуинки стали спариваться как кролики и тайм-аут стал в среднем 20-40 в зависимости от расстояния. Я, правда не исключаю, что ошибка всё же во мне, но так заработало.
Вы ее через FOCA плату прогаммируете? У меня периодически на данной плате подвисает COM порт. Подвисает до такой степени, что не удаляется из системы без перезагрузки. И среда в это время COM порт найте не может. Может дровишки гдето на нее отдельные лежат?
Вы ее через FOCA плату прогаммируете? У меня периодически на данной плате подвисает COM порт. Подвисает до такой степени, что не удаляется из системы без перезагрузки. И среда в это время COM порт найте не может. Может дровишки гдето на нее отдельные лежат?
програмировать ее можно через любой переходник USB<->UART
обычно они делаются на чипах FTDI или Prolific. И для того и для того есть драйверы на официальных сайтах производителей самих чипов. Выясните что у вас за чип и поставьте драйвера с официального сайта производителя чипа
Фока эта - обычный переходник, как уже было сказано. У меня установлен Archlinux и он сразу подхватывает устройство (у меня на cp2102). Проверьте соответствие выводов, поскольку на фоке их 5, а на гбоард 7 в месте подключения. По схеме проверьте правильность установки перемычек. их должно быть 4, а у меня было 2. Попробуйте другой переходник, если не поможет.
Фока эта - обычный переходник, как уже было сказано. У меня установлен Archlinux и он сразу подхватывает устройство (у меня на cp2102). Проверьте соответствие выводов, поскольку на фоке их 5, а на гбоард 7 в месте подключения. По схеме проверьте правильность установки перемычек. их должно быть 4, а у меня было 2. Попробуйте другой переходник, если не поможет.
/quote]
Спасибо. Попробую простой, которым я Mini Pro шью. ФОКА тоже оаботает нормально, но периодически COM gjldbcftn? rfr z e;t ujdjhbk
Все бы ничего и работает (один main и 3 подчиненных, если можно их так назвать - понимаю, что в принципе, они равны). На мэйне сверху висит ethernet, который вещает в локалку (GET-запросами, но не в этом суть).
Так вот, данная связка может очень ставбильно работать на протяжении долгого врени (каждые 10 минут идет опрос датчиков на кадом устройстве) - может и неделю, а может и через каждые 10 минут отваливаться по одному устройсву. То есть, в текущем опросе устройств нет ответа от 2-го, через 10 минут - от 2-го есть, зато от третьего нет, и т.д. - может по кругу идти.
Понимаю, что проблема где-то в пакетах "летающих". Прикрутил что-то вроде программного вачдога (нет пакета более 10 минут - ребут - void(* resetFunc) (void) = 0;) - помогает, но не всегда. Расстояние междук устройствами не более 5 метров (1 стена на пути).
В общем, к чему я. Полагаю, после ребута не очищается аппаратный кэш модуля NRF24L01+ (могу быть неправ). В описании класса, maniac пишет о необходимости постоянного вызова RF24Network::update(void), мол потеряются пакеты. Не подскажет ли всезнающий олл, как можно программно очистить аппаратный буфер микрухи? И как долго и сколько в этом буфере может лежать?
Может я не в ту сторону копаю. Но вот от этого "глюка" никак не могу избавиться. Может сталкивался кто с подобным? Код не привожу - слишком он большой и ИМХО никому не нужный.
из моего опыта устройства могут работать без сбоев: но нужно не накосячить ни в железе ни в программе, общие рекомендации:
железо:
- не забываем про конденсатор по питанию
- пин SS железного SPI лучше не использовать, его не аккуратное использование приведет к сбоям работы модуля и библиотеки, фишка в том, что изменение направление вход/выход этого пина автатом меняет master/slave железного SPI
- лучше на шину SPI ничего кроме радиомодуля не ставить, иначе нужно аккуратно продумать отсутствие конфликтов
- без четкого понимания не стоит трогать ни модуль ни (если все таки естдругие устройства на шине SPI) другие устройства на SPI в прерываниях
- очень полезно использовать чтение сообщений в прерываниях, но требует вдумчивому выбору того, что делать в прерывании
- используем сканнер чтобы убедиться/подобрать что на выбранном радио канале нет/мало помех
программа:
- нужно аккуратно соблюдать последовательность вызова функций библиотеки при переключении режима прием/передача
- режим передача рекомендуется включать только на время отправки и потом снова вызывать startListening()
- вдумчиво програмировать работу с передаваемыми/принятыми данными, не забывая что размер передаваемых данных ограничен, особенно актуально при использовании текстовых строк - следим за тем как передаем.принимаем терминатор строки (символ '\0x00')
- решаем осознанно использовать или нет auto ack. далеко не всегда если write возвращает 0 сообщение не доставлено
- логику программы строим так, чтобы потеря одного сообщения не рушило логимку работы (например не стоит передавать инкремент какой-то величины чтобы на приемнике копить сумму, лучше передавать готовую сумму)
Цитата:
В общем, к чему я. Полагаю, после ребута не очищается аппаратный кэш модуля NRF24L01+
не нужно его чистить. сообщение в буфере хранится до тех пор пока его не прочитают. часами не пробовал, но несколько минут точно можно в основной прамме заняться чем-то другим, НО! радиомодуль должен быть в режиме startListening() чтобы принять сообщение в буфер. Есди режим не включен - сообщения будут потеряны и буфер не спасет
- На железном 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, самое интересное, что МК не виснет (т.е. локальные датчики опрашивает и через w5100 успешно отдает серваку запрос), но вот по NRF передача как-то сбоит в это время. Про железный вачдог в курсе, но пока не могу осуществить - отбабахался с ним полнедели - ну не могу я, блин, прошить бут в ардуину - как это не стыдно признавать. Может у кого есть линк есть с толковым описнием?
у меня тоже есть не вылеченые проблемы. есть центральное устройство и 4 дочерних. два дочерниъ всегда на связи, а два то теряют связь, то находят. Пока не понимаю в чем фишка
у меня тоже есть не вылеченые проблемы. есть центральное устройство и 4 дочерних. два дочерниъ всегда на связи, а два то теряют связь, то находят. Пока не понимаю в чем фишка
Да прошить бут не удалось. Не имею ISP отдельного, а из ардуины ну никак не получается его сделать - не шьёт, собака.
Про потерю и нахождение связи - в дочерних тоже использую принцип: нет ни одной посылки в течение 11 минут (у меня опрос идет минимум раз в 10мин.) - ребут. Помогает, но это, конечно же не панацея.
P.S. дабы не плодить оффтоп, предлагаю связаться мылом (citycat2{at}mail{dot}ru) - думаю, есть что сказать друг другу. Спасибо.
С помощью данного модуля, как я понял, можно осуществить подключение до 6 устройств (используя библиотеку RF24, со всеми её стандартными возможностями). Тут http://electronix.ru/forum/lofiversion/index.php/t71190.html предложили для увеличения кол-ва устройств все клиенты (датчики) посадить на 1 адрес, но задать каждому свой уникальный идентификатор. Так у нас получается структура "звезда". А можно посадить на 1 адрес и клиентов и сервера? То есть у всех адрес передачи и приёма будет одинаковый, общаться между собой будут через идентификаторы.
Для меня пример сложноват, но поразбираюсь (в программирование не силён, но быстро учусь).
Я просто подумал что способ
if(radio.write(msg, 1) == 1)
подходит если используются разные адреса, и состояние передачи по данному адресу отслеживается.
А если у нас все устр-ва на одном адресе, то тут по любому какое-то устройство примет его, и отправитель получит отчет о доставке, но тому ли доставленно узнать не получится
Можно добавить в логику "однородных" устройств, что надо ответить тому, кто делал запрос.
Попробовал, но запутался))) Устройство посылает информацию, содержащую свой id, id получателя и какое-то сообщение. Отправляет до тех пор пока не получит отчет либо не выйдет время выделеное на отправку например. Примут это все устройства, так как все сидят на одном адресе, извлекут оттуда id получателя и сравнят со своим, если это сообщение предназначено этому устройству, то оно должно отправить ответное сообщение, о том что сообщение получено. И опять же, получатель отправит ответ, но он должен опять же получить ответ о том что доствленно, иначе ответ может опять же не дойти. И вот получается бесконечная последовательность. Как можно по другому выстроить логику?
И опять же, получатель отправит ответ, но он должен опять же получить ответ о том что доствленно, иначе ответ может опять же не дойти. И вот получается бесконечная последовательность. Как можно по другому выстроить логику?
Не нужно получателю знать дошел ответ или нет.
BelkinVadim пишет:
Отправляет до тех пор пока не получит отчет либо не выйдет время выделеное на отправку например.
После того как вышел таймаут ожидания ответа нужно повторить передачу.
...что означет, что если отправитель не получает ответ от получателя, то отправитель еще раз отправляет данные.
что-то сразу не додумался, спасибо за объяснение)
А кто-нибудь может рассказать про библиотеку RF24Network.h. Как понял, с её помощью можно что-то вроде сети сделать. Тут http://maniacbug.github.io/RF24Network/index.html с переводчиком толком не понял ничего. Насколько она полезна при использование библиотеки RF24.h? В случае с устр-вами на одном адресе есть ли смысл и толк от её использования?
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 нет((( В чем проблемма?
Добрый день. Приобрел модули NRF24L01, подключил их как указано здесь, залил скетчи в приемник и передатчик, но соединения так и не дождался. Всё время "No radio available". Вроде все подключено нормально. Может я что-то упустил?
Прошу прощения если задал вопрос не в той ветке ! Нужна помощь ! Хочу собрать следующую конструкцию: 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);
}
}
Запускаю и на приёмнике тишина. Работает только когда данные передаешь сам через
Подскажите где ошибка в чем не прав ???? по возможности исправить код !
а как узнать на передующей стороне что пакет дошел?
Еще раз
передающая сторона получает статус доставки как возвращаемое значение функции write в том случае если включен Ack
... а в библиотеке RF24 по умолчанию он включен.
... а в библиотеке RF24 по умолчанию он включен.
уже радует что хоть кто то читает документацию, а не просто вопросы задает)
вы наверно про даташит на модуль. но что это даст? в библиотеке для этого функция есть и соответственно пришлось бы хорошенько порыться в ней чтобы понять как ее использовать. поэтому и спросил
Нет, мы про функцию write из стандартных примеров к библиотеке.
предполагаю что вы про
но каким образом из функции передачи данных извлеч данные о передаче так и не понял. объясните непонимающему
о спасибо. значит добавлю индикатор подсоеденения в пульт для машинки.
но появился еще вопрос. 2 раза смотрел библиотеку RF24 для модуля, не смог найти настройку выводов подключения. может уже поздно и проглядел. подскажите пожалуйста. очень надо
о спасибо. значит добавлю индикатор подсоеденения в пульт для машинки.
но появился еще вопрос. 2 раза смотрел библиотеку RF24 для модуля, не смог найти настройку выводов подключения. может уже поздно и проглядел. подскажите пожалуйста. очень надо
при создании экземпляра класса указываюися пины CS и CSN, все остальные обязаны соотвествовать железному SPI. вывод модуля IRQ в библиотеке никак не используется
http://code.mios.com/trac/mios_arduino-sensor/wiki/ConnectingRadioModule
железному. блин. но все равно спасибо.
а библиотека с софтварным существует?
тут гуляли ссылки на измененную RF24 с софтверным SPI. я их не помню, поищите
значит есть что поискать. спасибо
а где гуляли? в этой теме?
+ нашел где об этом говорилось. но саму библиотеку не нашел. короче проще кинуть 3 перемычки. затупил, уже привык править выводы в библиотеках и тут по привычке подцепил пины которые возможно было подцепить
https://github.com/andykarpov/iBoardRF24
я находил ее. но может не так перевел переводчик. с английским туго
"Встроенный против Software SPI, чтобы поместиться на iTeadStudio iBoard с нестандартным связь" я подумал в нем как раз железный. спасибо
Добрый день!
Возникла проблема с приемником.
Передатчика нет, а сериал прилетает мусор в виде переменной int от -32 768 до 32 767.
Ошибка в коде?
Добрый день!
Возникла проблема с приемником.
Передатчика нет, а сериал прилетает мусор в виде переменной int от -32 768 до 32 767.
Ошибка в коде?
Проблему решил. Виноват, как обычно, сам. Перепутал местами CSN и CE.
Добрый день!
Возникла проблема с приемником.
Кстати , pipe 64 битная переменная,и должен соотвественно объявлен как uint64_t ,иначе она обрезается до 16 битной ( int)..
Конечно может и работать будет,если ошибка будет на обеих сторонах,но все же..
Помогите пожалуйста!!!
Пытаюсь передать показания двух потенциометров. Библиотека - Mirf. Ни чего не получается=((т.е данные приходят через раз или в раздробленном виде. Помогите с кодом, желательно чтобы два показания были в одном пакете. Кстати, передаю текст - приходит нормально.
если испльзовать библиотеку RF24 вот как:
http://arduino.ru/forum/programmirovanie/nrf24l01?page=7#comment-40323
СПАСИБО огромное. Если честно, ты мне жизнь спас. Завтра НПК, а я на этом застрял
Спасибо всем, кто поделился опытом, и я в ответ немного расскажу о граблях, на которые наступил при попытках соединить Arduino pro mini и GBoard. Pro mini известна всем, а вот Gboard более редкий зверь. Была эта железка куплена в первую очередь из-за GSM модуля SIM900, который я благополучно испытал и занялся более насущными делами.
Для радиомодуля на плате имеется специальное гнездо, так что с этим проблем быть не должно, но чтобы присоединить аналогичным образом pro mini пришлось немного повозится. В частности CE и CS на Gboard присоединены, как оказалось, к 8 и 9 выводам, а все примеры используют другие выводы (RF24 radio(9,10). На сайте производителя, благо, выложены и схема и даташит, так что после тяжких раздумий всё заработало. Почти. Pingpair сначала ругался на тайм-аут, но я заметил,что реакция всё же есть - при выключении ардуины сообщения о посылке и ответе стали располагаться в разных строчках, а при включении печатались в одну и если набраться терпения то можно было дождаться почти правильного ответа - посланное число не соответствовало принятому, и тайм-аут получался громадным. Оказалось,что ножку 7, которая определяет роль (пинг или понг), вопреки комментарию в тексте скетча, нужно было цеплять на +, а не на землю. То есть у меня обе ардуины считали себя главными. После исправления этой ошибки ардуинки стали спариваться как кролики и тайм-аут стал в среднем 20-40 в зависимости от расстояния. Я, правда не исключаю, что ошибка всё же во мне, но так заработало.
а вот Gboard более редкий зверь
Вы ее через FOCA плату прогаммируете? У меня периодически на данной плате подвисает COM порт. Подвисает до такой степени, что не удаляется из системы без перезагрузки. И среда в это время COM порт найте не может. Может дровишки гдето на нее отдельные лежат?
Вы ее через FOCA плату прогаммируете? У меня периодически на данной плате подвисает COM порт. Подвисает до такой степени, что не удаляется из системы без перезагрузки. И среда в это время COM порт найте не может. Может дровишки гдето на нее отдельные лежат?
програмировать ее можно через любой переходник USB<->UART
обычно они делаются на чипах FTDI или Prolific. И для того и для того есть драйверы на официальных сайтах производителей самих чипов. Выясните что у вас за чип и поставьте драйвера с официального сайта производителя чипа
Фока эта - обычный переходник, как уже было сказано. У меня установлен Archlinux и он сразу подхватывает устройство (у меня на cp2102). Проверьте соответствие выводов, поскольку на фоке их 5, а на гбоард 7 в месте подключения. По схеме проверьте правильность установки перемычек. их должно быть 4, а у меня было 2. Попробуйте другой переходник, если не поможет.
[quote=gsv]
Фока эта - обычный переходник, как уже было сказано. У меня установлен Archlinux и он сразу подхватывает устройство (у меня на cp2102). Проверьте соответствие выводов, поскольку на фоке их 5, а на гбоард 7 в месте подключения. По схеме проверьте правильность установки перемычек. их должно быть 4, а у меня было 2. Попробуйте другой переходник, если не поможет.
/quote]
Спасибо. Попробую простой, которым я Mini Pro шью. ФОКА тоже оаботает нормально, но периодически COM gjldbcftn? rfr z e;t ujdjhbk
Подниму старую тему.
Использую RF24.h и обертку от maniacbug.
Все бы ничего и работает (один main и 3 подчиненных, если можно их так назвать - понимаю, что в принципе, они равны). На мэйне сверху висит ethernet, который вещает в локалку (GET-запросами, но не в этом суть).
Так вот, данная связка может очень ставбильно работать на протяжении долгого врени (каждые 10 минут идет опрос датчиков на кадом устройстве) - может и неделю, а может и через каждые 10 минут отваливаться по одному устройсву. То есть, в текущем опросе устройств нет ответа от 2-го, через 10 минут - от 2-го есть, зато от третьего нет, и т.д. - может по кругу идти.
Понимаю, что проблема где-то в пакетах "летающих". Прикрутил что-то вроде программного вачдога (нет пакета более 10 минут - ребут - void(* resetFunc) (void) = 0;) - помогает, но не всегда. Расстояние междук устройствами не более 5 метров (1 стена на пути).
В общем, к чему я. Полагаю, после ребута не очищается аппаратный кэш модуля NRF24L01+ (могу быть неправ). В описании класса, maniac пишет о необходимости постоянного вызова RF24Network::update(void), мол потеряются пакеты. Не подскажет ли всезнающий олл, как можно программно очистить аппаратный буфер микрухи? И как долго и сколько в этом буфере может лежать?
Может я не в ту сторону копаю. Но вот от этого "глюка" никак не могу избавиться. Может сталкивался кто с подобным? Код не привожу - слишком он большой и ИМХО никому не нужный.
из моего опыта устройства могут работать без сбоев: но нужно не накосячить ни в железе ни в программе, общие рекомендации:
железо:
- не забываем про конденсатор по питанию
- пин SS железного SPI лучше не использовать, его не аккуратное использование приведет к сбоям работы модуля и библиотеки, фишка в том, что изменение направление вход/выход этого пина автатом меняет master/slave железного SPI
- лучше на шину SPI ничего кроме радиомодуля не ставить, иначе нужно аккуратно продумать отсутствие конфликтов
- без четкого понимания не стоит трогать ни модуль ни (если все таки естдругие устройства на шине SPI) другие устройства на SPI в прерываниях
- очень полезно использовать чтение сообщений в прерываниях, но требует вдумчивому выбору того, что делать в прерывании
- используем сканнер чтобы убедиться/подобрать что на выбранном радио канале нет/мало помех
программа:
- нужно аккуратно соблюдать последовательность вызова функций библиотеки при переключении режима прием/передача
- режим передача рекомендуется включать только на время отправки и потом снова вызывать startListening()
- вдумчиво програмировать работу с передаваемыми/принятыми данными, не забывая что размер передаваемых данных ограничен, особенно актуально при использовании текстовых строк - следим за тем как передаем.принимаем терминатор строки (символ '\0x00')
- решаем осознанно использовать или нет auto ack. далеко не всегда если write возвращает 0 сообщение не доставлено
- логику программы строим так, чтобы потеря одного сообщения не рушило логимку работы (например не стоит передавать инкремент какой-то величины чтобы на приемнике копить сумму, лучше передавать готовую сумму)
не нужно его чистить. сообщение в буфере хранится до тех пор пока его не прочитают. часами не пробовал, но несколько минут точно можно в основной прамме заняться чем-то другим, НО! радиомодуль должен быть в режиме startListening() чтобы принять сообщение в буфер. Есди режим не включен - сообщения будут потеряны и буфер не спасет
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% доходят. Сегодня вечером подкину внешнее питание, отключу от сервака - посмотрим, что имзенится.
ребут - void(* resetFunc) (void) = 0;)
согласно рекомендациям атмела ребутить МК лучше через железный вачдог
к тому же сам по себеб железный вачдог не помешает, если есть проблемы с питанием МК может просто зависать итогда поможет только железный вачдог
axill, самое интересное, что МК не виснет (т.е. локальные датчики опрашивает и через w5100 успешно отдает серваку запрос), но вот по NRF передача как-то сбоит в это время. Про железный вачдог в курсе, но пока не могу осуществить - отбабахался с ним полнедели - ну не могу я, блин, прошить бут в ардуину - как это не стыдно признавать. Может у кого есть линк есть с толковым описнием?
P.S. Про эти линки в курсе: http://habrahabr.ru/post/189744/, http://arduino.ru/forum/programmirovanie/programmnyi-reset - не помогло
P.P.S. All, Сорри за оффтоп :(
что именно не удалось с вачдогом?
у меня тоже есть не вылеченые проблемы. есть центральное устройство и 4 дочерних. два дочерниъ всегда на связи, а два то теряют связь, то находят. Пока не понимаю в чем фишка
что именно не удалось с вачдогом?
у меня тоже есть не вылеченые проблемы. есть центральное устройство и 4 дочерних. два дочерниъ всегда на связи, а два то теряют связь, то находят. Пока не понимаю в чем фишка
Да прошить бут не удалось. Не имею ISP отдельного, а из ардуины ну никак не получается его сделать - не шьёт, собака.
Про потерю и нахождение связи - в дочерних тоже использую принцип: нет ни одной посылки в течение 11 минут (у меня опрос идет минимум раз в 10мин.) - ребут. Помогает, но это, конечно же не панацея.
P.S. дабы не плодить оффтоп, предлагаю связаться мылом (citycat2{at}mail{dot}ru) - думаю, есть что сказать друг другу. Спасибо.
С помощью данного модуля, как я понял, можно осуществить подключение до 6 устройств (используя библиотеку RF24, со всеми её стандартными возможностями). Тут http://electronix.ru/forum/lofiversion/index.php/t71190.html предложили для увеличения кол-ва устройств все клиенты (датчики) посадить на 1 адрес, но задать каждому свой уникальный идентификатор. Так у нас получается структура "звезда". А можно посадить на 1 адрес и клиентов и сервера? То есть у всех адрес передачи и приёма будет одинаковый, общаться между собой будут через идентификаторы.
Легко все делается на одном адресе , первый байт пакета(в видеструктуры) как идентификатор.Сервер принимает пакет,смотрит первый байт,и на основе его копирует пакет в ту структуру данных,которая относится к этому удаленному клиенту . Вот так : 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
а как в этом случае (если все устройства сидят на одном адресе) узнать состояние передачи? как понимаю такой вариант уже не подходит?
Да вроде тут ничего не меняется в этом.. Вообще в примере имеется счетчик передач и счетчик ошибок - можно по ему отслеживать состояние..
Для меня пример сложноват, но поразбираюсь (в программирование не силён, но быстро учусь).
Я просто подумал что способ
подходит если используются разные адреса, и состояние передачи по данному адресу отслеживается.
А если у нас все устр-ва на одном адресе, то тут по любому какое-то устройство примет его, и отправитель получит отчет о доставке, но тому ли доставленно узнать не получится
Можно добавить в логику "однородных" устройств, что надо ответить тому, кто делал запрос.
Можно добавить в логику "однородных" устройств, что надо ответить тому, кто делал запрос.
Попробовал, но запутался))) Устройство посылает информацию, содержащую свой id, id получателя и какое-то сообщение. Отправляет до тех пор пока не получит отчет либо не выйдет время выделеное на отправку например. Примут это все устройства, так как все сидят на одном адресе, извлекут оттуда id получателя и сравнят со своим, если это сообщение предназначено этому устройству, то оно должно отправить ответное сообщение, о том что сообщение получено. И опять же, получатель отправит ответ, но он должен опять же получить ответ о том что доствленно, иначе ответ может опять же не дойти. И вот получается бесконечная последовательность. Как можно по другому выстроить логику?
И опять же, получатель отправит ответ, но он должен опять же получить ответ о том что доствленно, иначе ответ может опять же не дойти. И вот получается бесконечная последовательность. Как можно по другому выстроить логику?
Отправляет до тех пор пока не получит отчет либо не выйдет время выделеное на отправку например.
Не нужно получателю знать дошел ответ или нет.
если так то получается, получатель отправляет ответ и переключается на чтение. а если первый передатчик не получит этот ответ?
если так то получается, получатель отправляет ответ и переключается на чтение. а если первый передатчик не получит этот ответ?
После того как вышел таймаут ожидания ответа нужно повторить передачу.
...что означет, что если отправитель не получает ответ от получателя, то отправитель еще раз отправляет данные.
...что означет, что если отправитель не получает ответ от получателя, то отправитель еще раз отправляет данные.
что-то сразу не додумался, спасибо за объяснение)
А кто-нибудь может рассказать про библиотеку RF24Network.h. Как понял, с её помощью можно что-то вроде сети сделать. Тут http://maniacbug.github.io/RF24Network/index.html с переводчиком толком не понял ничего. Насколько она полезна при использование библиотеки RF24.h? В случае с устр-вами на одном адресе есть ли смысл и толк от её использования?
есть смысл и толк, если у вас много устройств и каждому хочется дать свой адрес.
Подскажите как передать сообщение(слово).
На этом модуле выводится те слова что отправляю строка 60, 61. А на принимающей стороне толькоLoad.id_sens прилетает, а Load.name_sens нет((( В чем проблемма?
Добрый день. Приобрел модули NRF24L01, подключил их как указано здесь, залил скетчи в приемник и передатчик, но соединения так и не дождался. Всё время "No radio available". Вроде все подключено нормально. Может я что-то упустил?
Прошу прощения если задал вопрос не в той ветке ! Нужна помощь ! Хочу собрать следующую конструкцию: PROCESSING берёт некую информацию из виртуального midi порта и отправляет её в serialport
arduino с радио модулем NRF24I01+ на борту подключенная к ПК слушает serialport получает данные { message=1; }{ message=2; }{ message=3; }.... и отправляет их следующей arduino с такой же конструцией. Она получает данные и выполняет определённое действие (вкл/выкл LED).
Теперь вопрос если не использовать радиомодуль а работать непосредственно напрямую через serialport всё отлично работатет "PROCESSING ---->>> ARDUINO " (код arduino):
Тперь цепляю NRF24I01+ получаю следующую конструкцию "PROCESSING-->>ARDUINOпередаёт---->>ARDUINOпринимает" код processing оставляю тот же код ARDUINOперед:
код ARDUINOприемнка:
Запускаю и на приёмнике тишина. Работает только когда данные передаешь сам через
Подскажите где ошибка в чем не прав ???? по возможности исправить код !
Вы без рф сравнивает правильно, val== 1, а с рф вдруг data[0] == '1'