Nrf24l01+

tika
Offline
Зарегистрирован: 22.07.2015

А самое интересное- что ни где и не кто не показал работу в скетче обмена NRF24L01+  между собой не команд ни информации именно между 2х блоков-(обмена). Я не прав? Только прием и передачу.

Кто- запускал трансиверы на NRF24L01+?

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

да сколько можно одно и тоже в разных темах. тут вроде не было

a5021
Offline
Зарегистрирован: 07.07.2013

tika пишет:
А самое интересное- что ни где и не кто не показал работу в скетче обмена NRF24L01+  между собой не команд ни информации именно между 2х блоков-(обмена).

Что вы называете "обменом" ? Передающий выплюнул пакет в эфир. Принимающий его принял и выслал обратно подтверждение. Это подтверждение увидел передающий и отрапортовал в статусе, что передача завершена успешно. Вот и весь обмен. Чего тут нужно показывать? Так будут работать любые исправные модули в режиме "с подтверждением". Еще есть режим, когда к подтерждению подцепляется дополнительный блок данных. Так можно организовать почти что полудуплекс.

Цитата:
Кто- запускал трансиверы на NRF24L01+?

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

pastry777
Offline
Зарегистрирован: 16.01.2014

smesharik,ваши примеры должно быть рабочие,только вот данные летят как с пулемета,такой подход нигде в проекте вы не внедрите,порпробуйте,например,передавать данные раз в секунду...у вас там в передатчике даже закоментированно delay(1000); раскоментируйте..ну как,работает?)))

pastry777
Offline
Зарегистрирован: 16.01.2014

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

я недавно тоже пример в другой теме выкладывал,может кому поможет...как раз для tika

http://arduino.ru/forum/programmirovanie/ne-mogu-zastavit-nrf24l01-rabotat#comment-171858

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

https://www.mysensors.org я просто оставлю это тут.

все сделано на nrf24 и работает.

pastry777
Offline
Зарегистрирован: 16.01.2014

сайт,конечно,красивый..но что именно ты хотел нам на нем показать?

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

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

tika
Offline
Зарегистрирован: 22.07.2015

Да нет там примерев. Там отдельно приёмник отдельно передатчики только.

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

чё серьезно?!

https://www.mysensors.org/build/serial_gateway - приемник / передатчик (должен быть 1)

https://www.mysensors.org/build/light - приемник / передатчик (может быть много)

причем сенсоры исполнители могут общаться между собой "aka mesh-сеть"

Вы бы хоть видео посмотрели ...

tika
Offline
Зарегистрирован: 22.07.2015

Я вас такими нарезками завалю- Вы пробовали запустить NRF24L01+ как трансивер (прием- передачик)?  Вам удалось?Да их может быть много но где - пример .

tika
Offline
Зарегистрирован: 22.07.2015

А в качесте примера - вот это пример -а не мультяжки. И попродуйте решить мелоч в #639


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

у меня дома 10 сенсоров УЖЕ работают с год, недавно сделал чтоб с сигнализации снимать данные через mysensor. Так что да,  это работает.

 

http://arduino.ru/forum/proekty/umnyi-dom-s-tsentralnym-kontrollerom-ot-...

std
Offline
Зарегистрирован: 05.01.2012

tika пишет:
Да их может быть много но где - пример

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(8,9);
byte data[4];
const uint64_t pipes[2]={0xFFFFFFFF00LL,   // remote
                         0xFFFFFFFF01LL};  // local
unsigned long timestamp;

void setup(){ 
  radio.begin();
  radio.setDataRate(RF24_250KBPS);         // payload=4, power=max, sens=max, ch=1
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(1);
  radio.setRetries(15,15);
  radio.setPayloadSize(4);
  radio.openWritingPipe(pipes[1]);
  radio.openReadingPipe(1,pipes[0]);
  radio.startListening();
  timestamp=millis();
}

void loop(){
  if(radio.available()){
    radio.read(&data,4);
    if(data[0]==5){} // do something
    if(data[1]==6){} // do something
    if(data[2]==7){} // do something
    if(data[3]==8){
      // do something
      delay(300);    // wait to prevent collision
      data[0]=9;     // fill some data
      data[1]=1;
      data[2]=1;
      data[3]=1;
      radio.stopListening();      // go sending
      for(byte i=0;i<5;i++) radio.write(&data, 4);     // 4=payload, 5=rep
      radio.startListening();     // go receive
    }
  }
  if(millis()-timestamp>=1000){  // maybe send something each second
    data[0]=7;     // fill some data
    data[1]=2;
    radio.stopListening();      // go sending
    for(byte i=0;i<5;i++) radio.write(&data, 4);     // 4=payload, 5=rep
    radio.startListening();     // go receive
    timestamp=millis();
  }
}

 

tika
Offline
Зарегистрирован: 22.07.2015

Спасибо. Вот конкретика, а не есть -да у меня  работает. Мы не в метро едем - а просим помощи или подсказок. 

pastry777
Offline
Зарегистрирован: 16.01.2014

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

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

2pastry777, это бессмысленно, коллега. он/она/оно думать не хочет. проще не реагировать

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

tika
Offline
Зарегистрирован: 22.07.2015

Я некого не хотел,  обидел. Эта страница для чего - библиотека или для конкретной помощи.  Если вы все знаете, разбираетесь  в этом и не хотите помочь,   поделится с такими как я.  Для чего все это? 

Спасибо кто откликнулся  о крике, о помощи.

tika
Offline
Зарегистрирован: 22.07.2015

mitekg пишет:

2pastry777, это бессмысленно, коллега. он/она/оно думать не хочет. проще не реагировать

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

Так и хочется спросить. Уважаемый Вы на каком авто ездите?

anth2222
Offline
Зарегистрирован: 17.02.2016

Так и не удалось завести модули. Пробовал рекомендованные конденсаторы и примеры. Безуспешно

Просьба глянуть статусы девайсов. Вот в этом сообщении приводил:

http://arduino.ru/forum/programmirovanie/nrf24l01?page=12#comment-171586

Может кто сразу скажет в чем проблема.

smesharik
Offline
Зарегистрирован: 31.01.2016

Статусы вполне рабочие выдает у вас

модули получается разные у вас что ли? Один с + второй без +

http://forum.amperka.ru/threads/nrf24l01-побеждаем-модуль.3205/

тут можите порыться

anth2222
Offline
Зарегистрирован: 17.02.2016

Вроде они совместимы между собой. Или ошибаюсь?

4 штуки есть. Пробовал разные комбинации.

 

 

anth2222
Offline
Зарегистрирован: 17.02.2016

Так и не удалось заставить работать :(

Есть вероятность, что все 4 имеющихся модуля битые. Жду новую партию.

Попутно вопрос. Какие преимущества у nrf24l01 перед rf433?

То, что nrf - приемник/передатчик в одном флаконе, понятно. Что еще?

rf433 завелись с полоборота. С самодельной антенной пробивают три стены в квартире. Добьюсь ли таколь дальнобойности с NRF?

 

Megawollt
Offline
Зарегистрирован: 06.12.2015

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

Kuponnn
Offline
Зарегистрирован: 08.03.2016

Добрый вечер, сопрягаю две ардуинки с помощью Этого вай фай модуля, когда заливаю скетч в "передатчик" - все хорошо, но когда загружаю на "приемник", выдает ошибку на этой строке: http://joxi.ru/krDlpGps0B5yYr     . Пробовал брать скетч из разных источников - всегда одинаковая ошибка. В чем причина? Заранее благодарен)

spa-sam
Offline
Зарегистрирован: 14.12.2012

Кто-то пробовал подключать две  nrf24l01+ к одной ардуине? Как правильно подключить?

pastry777
Offline
Зарегистрирован: 16.01.2014

вы не внимательно используете примеры....

done = radio.read(&joystick, sizeof(joystick);

virf
Offline
Зарегистрирован: 16.03.2016

Всем здрасте, я тут потихоньку разбираюсь с этими радиомодулями (да и честно говоря программирование только осваиваю)

Не могу понять как идентифицировать наличие связи?

То есть как корректно сказать "при потере связи выполнить ..."

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

a5021
Offline
Зарегистрирован: 07.07.2013

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

virf
Offline
Зарегистрирован: 16.03.2016

a5021 пишет:

А там нет наличия связи.

А как... кажеться спать пора (мозги уже не фурычат)

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

а как это по умному сделать... в голову приходит только раз в секунду запоминать значение и через секунду сравнить с нынешним (но кажеться это тупая идея)

 

Megawollt
Offline
Зарегистрирован: 06.12.2015

spa-sam пишет:

Кто-то пробовал подключать две  nrf24l01+ к одной ардуине? Как правильно подключить?

А зачем?

a5021
Offline
Зарегистрирован: 07.07.2013

virf пишет:

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

Шлите значение шима периодически. Считайте время, прошедшее с момента прихода последнего. Если времени прошло много, а больше никаких значений не пришло, значит связь потеряна.

tika
Offline
Зарегистрирован: 22.07.2015

Народ кто сможет соеденить в одно целое. Приемник и передатчик на NRF24L01+

зделайте чудо.

Приемник

#
tika
Offline
Зарегистрирован: 22.07.2015

Может это поможет.

#include*<SPI.h>
#include*"nRF24L01.h"
#include*"RF24.h"
#include*"printf.h"

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

RF24*radio(9,10);

//
//*Topology
//

//*Radio*pipe*addresses*for*the* 2*nodes*to*communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
//
int msg[1];
//
//*Role*management
//
//*Set*up*role.**This*sketch*use s*the*same*software*for*all*th e*nodes
//*in*this*system.**Doing*so*gre atly*simplifies*testing.**
//

//*The*various*roles*supported*b y*this*sketch
typedef*enum*{*role_ping_out*= *1,*role_pong_back*}*role_e;

//*The*debug-friendly*names*of*those*roles
const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"};

//*The*role*of*the*current*runni ng*sketch
role_e*role*=*role_pong_back;

void setup(void)
{
**
**pinMode(SW1, INPUT);//
**// Print preamble
**//

**Serial.begin(57600);
**printf_begin();
**printf("\n\rRF24/examples/GettingStarted/\n\r");
**printf("ROLE: %s\n\r",role_friendly_name[role]);
**printf("*** PRESS 'T' to begin transmitting to the other node\n\r");

**//
**// Setup and configure rf radio
**//

**radio.begin();

**// optionally, increase the delay between retries & # of retries
**radio.setRetries(15,15);

**// optionally, reduce the payload size. seems to
**// improve reliability
**//radio.setPayloadSize(8);

**//
**// Open pipes to other nodes for communication
**//

**// This simple sketch opens two pipes for these two nodes to communicate
**// back and forth.
**// Open 'our' pipe for writing
**// Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)

**//if ( role == role_ping_out )
**{
****//radio.openWritingPipe(pipes[0]);
****radio.openReadingPipe(1,pi pes[1]);
**}
**//else
**{
****//radio.openWritingPipe(pipes[1]);
****//radio.openReadingPipe(1,pipes[0]);
**}

**//
**// Start listening
**//

**radio.startListening();

**//
**// Dump the configuration of the rf unit for debugging
**//

**radio.printDetails();
}

void loop(void)
{
**//
**// Ping out role. Repeatedly send the current time
**//

**if (role == role_ping_out)
**{
****// First, stop listening so we can talk.
****radio.stopListening();

****// Take the time, and send it. This will block until complete
****unsigned long time = millis();
****printf("Now sending %lu...",time);
****msg[0]*=*111;
****bool*ok*=*radio.write(msg, 1);
****

****if (ok)
******printf("ok...");
****else
******printf("failed.\n\r");

****// Now, continue listening
****radio.startListening();

****// Wait here until we get a response, or timeout (250ms)
****unsigned long started_waiting_at = millis();
****bool*timeout*=*false;
****while ( ! radio.available() && ! timeout )
******if (millis() - started_waiting_at > 200 )
********timeout*=*true;

****// Describe the results
****if ( timeout )
****{
******printf("Failed, response timed out.\n\r");
****}
****else
****{
******// Grab the response, compare, and send to debugging spew
******unsigned long got_time;
******radio.read( &got_time, sizeof(unsigned long) );

******// Spew it
******printf("Got response %lu, round-trip delay: %lu\n\r",got_time,millis()-got_time);
****}

****// Try again 1s later
****delay(1000);
**}

**//
**// Pong back role. Receive each packet, dump it out, and send it back
**//

**if ( role == role_pong_back )
**{
****// if there is data ready
****if ( radio.available() )
****{
******// Dump the payloads until we've gotten everything
******unsigned long got_time;
******bool*done*=*false;
******while (!done)
******{
********// Fetch the payload, and see if this was the last one.
********done*=*radio.read( &got_time, sizeof(unsigned long) );

********// Spew it
********printf("Got payload %lu...",got_time);

// Delay just a little bit to let the other unit
// make the transition to receiver
delay(20);
******}

******// First, stop listening so we can talk
******radio.stopListening();

******// Send the final one back.
******radio.write( &got_time, sizeof(unsigned long) );
******printf("Sent response.\n\r");

******// Now, resume listening so we catch the next packets.
******radio.startListening();
****}
**}

**//
**// Change roles
**//

**if ( Serial.available() )
**{
****char c = toupper(Serial.read());
****if ( c == 'T' && role == role_pong_back )
****{
******printf("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK\n\r");

******// Become the primary transmitter (ping out)
******role*=*role_ping_out;
******radio.openWritingPipe(pi pes[0]);
******radio.openReadingPipe(1, pipes[1]);
****}
****else if ( c == 'R' && role == role_ping_out )
****{
******printf("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK\n\r");
******
******// Become the primary receiver (pong back)
******role*=*role_pong_back;
******radio.openWritingPipe(pi pes[1]);
******radio.openReadingPipe(1, pipes[0]);
****}
**}
}
//*vim:cin:ai:sts=2*sw=2*ft=cpp

 

Cheb
Offline
Зарегистрирован: 27.04.2016

Народец, эта тема еще жива?)

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015

Делали с сыном танк на радиоуправлении.

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

Замечания:

1. У меня идентичные модули и потому частичная инициализация.

2. Пришлось припаять конденсатор 220Мф, а то без него UNO не хотел работать на прием.

3. Две линии перенес на А0 и А1.

Слушать через COM порт



Этот скетч надо залить без изменений на две Ардуинки.

#include<SPI.h>
#include<nRF24L01.h>
#include<RF24.h>
const uint64_t pipe= {0xF0F0F0F0E1LL};
RF24 radio(A0,A1); //Обратите внимание тут другое подключение
byte message = 1;
byte red;
unsigned long CTime01;
unsigned long LTime01;
void setup()
{
  Serial.begin(9600);
  radio.begin();
  delay(100);
  radio.enableDynamicPayloads();
  radio.openReadingPipe(1,pipe);
  radio.openWritingPipe(pipe); //Открывем трубу для отправки
  radio.startListening();

}
void loop()
{
  if ( radio.available() ) {
       radio.read( &red,sizeof(red) );
       Serial.println(String(red));
      };

    CTime01 = millis();
    if (CTime01 >= (LTime01 +100)) //Периодичность отправки пакетов
    {
       Serial.println("----------write------------");
       radio.stopListening();  //Перестаем слушать
       radio.write(&message, sizeof(message)); // Отправляем ответ
       radio.startListening();
       LTime01 = CTime01;
       message++;
    }
}

 

virf
Offline
Зарегистрирован: 16.03.2016

Столкнулся с такой интересной проблемой, радиомодули Nrf24l01 которые с внешней антенной и усилителем. (С внешней антенной на передатчике, с печатной антенной на приемнике.)

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

Суть в том что теряется очень много пакетов, причем это зависит от положения антенны, когда антенна согнута под 90 градусов (на штатной антенке имеется поворотная головка) я добился приемлемой передачи за счет навешивания кучу кондеров (керамика на выходе питания + керамика и электролиты на входе и выходе ams1117 + керамика на самих ножках модуля).

Но вот когда антенна прямая много пакетов все равно теряется.
Разъем антенны целый, питание импульсное (дс-дс преобразователь + литиевый акк)

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

spa-sam
Offline
Зарегистрирован: 14.12.2012

Какой именно дс-дс преобразователь стоит?

virf
Offline
Зарегистрирован: 16.03.2016

spa-sam пишет:

Какой именно дс-дс преобразователь стоит?

MT3608 выставлен на 5 вольт ровно и от него питается мк и нрфка через ams1117

Но пробовал и от юсб компа, от нескольких повербанков - особых изменений не заметил.

zaynus
Offline
Зарегистрирован: 18.12.2012

Попробуйте статические пакеты слать, разница есть?

spa-sam
Offline
Зарегистрирован: 14.12.2012

Проблема в DC-DC преобразователе. У них есть один недостаток, который я заметил - чем меньше "падение напряжения" на них, тем хуже по характеристикам на выходе "напруга" (простите за колхозный язык ). Кондёры плохо помогают в этом случае! Для проверки попробуйте запитать dc-dc преобразователь большим напряжением, либо исключите из схемы его.

P.S. Хотя, если запитывали от usb проблем не должно было быть, тогда возможно проблема в самом nrf

virf
Offline
Зарегистрирован: 16.03.2016

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

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

Там в роди еще по стандарту установлена длина пакета 32 байта (библиотека RF24.h)
Если уменьшить пакет меньше пакетов будет теряться? Какой функцией устанавливается длина пакета?

P.S. Сейчас собрал светодиодную портативную шкалу из 10ти светодиодов по которой наглядно видно качество сигнала.

Оказывается множество нюансов накладываются (в том числе и некачественное питание от DC преобразователе) и в финале жуткие потери пакетов.

Cheb
Offline
Зарегистрирован: 27.04.2016

Доброго времени суток!

Зантоки, прошу Вашей помощи... Задача в следующем - сделать машинку на модулях Nrf24l01 с двусторонней связью, камерой(отдельно от ардуины). На машинке будет стоять два датчика - расстояние до объекта, датчик температуры и влажности. На пульте - экранчик на который выводятся данные с датчиков на машинке, джойстик, кнопки включения и выключения лампочек на машине и тд., экран камеры (отдельно от ардуины).

На данный момент получилось следующее - две меги, модули работают исправно. Моторы через мотор шилд на машинке (в скетче для них пока ничего не прописано). На одной меге(пульт) - джойстик, два потенциометра, экран. Джойстиком управляются серва на машинке (поворотная каретка) и моторы, одним из потенциометров крутится серва с камерой (беспроводной) на машинке, вторым потенциометром необходимо запустить процесс приема данных с датчиков на машинке (кнопки все сломались, что нашел запилил).

Проблема в двусторонней передаче... Все, кроме старта передачи данных с датчиков на машинке - работает как часы. Но как только начинаю процесс передачи данных с датчиков - нихрена не работает. Происходит след. образом - при значении потенциометра равном Х посылается запрос на мегу машинки; та его принимает, закрывает прием и открывает трубу на передачу. Мега пульта соответственно после отправки запроса данных переключается в режим приема.

Прошу помочь в решении этой задачи.. Пробовал уже и массивами трубы открывать разные, и открывать оба канала сразу в setup-е и переключаться в void-ах - ничего не помогает =(
Скетчи ниже-

Мега пульт

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24

#include <dht11.h>
  
const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"

dht11 sensor;
RF24 radio(8, 53); // CE, CSN
int Button = A6;
int buttonState = 0;
int msg[4]; 
int data[3];
int potpin_1 = A5; 
int val_1; 
int potpin_2 = A4; 
int val_2; 
int analogPin = 0;
long int x;  
unsigned int impulseTime=0; 
unsigned int distance_sm=0; 

void setup(){
  
  Serial.begin(9600);
  pinMode(potpin_1,INPUT);
  pinMode(Button, INPUT);
  pinMode(potpin_2, INPUT);
  radio.begin();
  delay(2);
  radio.setChannel(9); // канал (0-127)
  radio.setDataRate(RF24_1MBPS); 
  radio.setPALevel(RF24_PA_HIGH);
  radio.startListening();
  radio.openReadingPipe(1,pipe);
  delay(1000);
} 

void loop()   
{
x =  analogRead(analogPin) / 5;

buttonState = analogRead(Button);
buttonState = map(buttonState, 0, 1023, 0, 10);



  //движение//

val_2 = analogRead(potpin_2);
val_2 = map(val_2, 0, 1023, 128, 250);
val_1 = analogRead(potpin_1);
val_1 = map(val_1, 0, 1023, 0, 127);
msg[0] = val_1;
radio.stopListening();
radio.openWritingPipe(pipe);
radio.write(msg, sizeof(msg));
msg[0] = val_2;
radio.write(msg, sizeof(msg));
radio.startListening();

//поворот камеры//

if (x>1){
msg[1] = x;
radio.stopListening();
radio.openWritingPipe(pipe);
radio.write(msg, sizeof(msg));
Serial.println("Cam rotate");
Serial.println(msg[1]);
radio.startListening();

}

//передача данных по дальности до объекта//

if (buttonState == 5 ){

msg[2]=999;
radio.stopListening();
radio.write(msg, sizeof(msg));
radio.startListening();
getSignal();
}

else{
  msg[2]=500;
  radio.stopListening();
  radio.write(msg, sizeof(msg));
  radio.startListening();
}
}

void getSignal()
{
  
  if (radio.available()) {
    radio.stopListening();
    bool done = false;
    while (!done){       
    done = radio.read(msg, sizeof(msg));  
    Serial.println("Signal got");
    Serial.println(msg[3]);
    radio.startListening();
    }
  }
}

Мега машинка

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
#include <Servo.h>
#include <AFMotor.h>
#include "Ultrasonic.h"
#define Trig 4
#define Echo 5
Servo servo1;
Servo servo2;

const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"

RF24 radio(8, 53); // CE, CSN

int msg[4];
int data[2];
int pos;
int posit;

AF_DCMotor motor1(1, 64);
Ultrasonic ultrasonic(4, 5);
unsigned int impulseTime=0; 
unsigned int distance_sm=0; 

void setup(){
  
  Serial.begin(9600);
  servo1.attach(10);
  servo2.attach(9);
  Serial.println("Robot active");
  motor1.setSpeed(255);
  motor1.run(RELEASE);
  radio.begin();  
  delay(2);
  radio.setChannel(9); // канал (0-127)
  
    // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
    // RF24_250KBPS на nRF24L01 (без +) неработает.
    // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS);     
  
    // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);   
   radio.startListening(); 
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
    // включаем приемник, начинаем слушать трубу
//  radio.stopListening(); // останавливает приём (нужно перед началом передачи) 
Serial.println("Chanel active");

}
 
void loop()   
{
  

if (radio.available()){

 bool done = false;
while (!done){       
 
done = radio.read(msg, sizeof(msg));      
     
if (msg[0] <127 && msg[0] >-1){
 radio.stopListening();  
  posit = msg[0];
    pos = map(posit, 0, 127, 0, 90);
    servo1.write(pos);
    radio.startListening(); 
}  
  
if (msg[0] >=128 && msg[0] <=181 ){
  radio.stopListening();
  backward();
  radio.startListening();
}

if (msg[0] >=201 && msg[0] <=255){
  radio.stopListening();
  forward();
  radio.startListening();
}


}
//поворот камеры//

if (msg[1]>20){
radio.stopListening();
Serial.println("Cam rotating");
Serial.println(msg[1]);
servo2.write(msg[1]);
radio.startListening();

}

//передача данных по дальности до объекта//

if (msg[2]==999) {
  radio.stopListening();
  Serial.println("Got request");
  do {sendData();} while (msg[2]==500);
  radio.startListening();
} 
}
}


void sendData(){
  
    
  radio.openWritingPipe(pipe);
  delay(500);
  digitalWrite(Trig, HIGH); 
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(10); // равный 10 микросекундам 
  digitalWrite(Trig, LOW); // Отключаем 
  impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса 
  distance_sm=impulseTime/58; // Пересчитываем в сантиметры 
  msg[3] = distance_sm;
  radio.write(msg, sizeof(msg));
  delay(100);
  Serial.println("Distance send is - ");
  Serial.println(msg[3]);
  
 }


void forward()
{
  
 Serial.println("forward");
}

void backward()
{
  
 Serial.println("backward");
}












 

a5021
Offline
Зарегистрирован: 07.07.2013

virf пишет:
Собственно вопрос - почему такая большая разница прямой и согнутой антенны?

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

zaynus
Offline
Зарегистрирован: 18.12.2012
  radio.setPayloadSize(32);(максимальный пакет)
пробовал   radio.setPayloadSize(3);(вроде работало)
чем легче посылка тем меньше потерь
есть такие размеры при которых не работает
 
 
zaynus
Offline
Зарегистрирован: 18.12.2012

Шлите данные из машинки в пакете auto ask

в сетапе чтото типа

// radio.setAutoAck(true);

цитата из комментов  к библиотеке

/*
Пакеты АСК
 
Великие умы, спроектировавшие nRF2401. предусмотрели особый режим подтверждения. Так как радиоприемник после приема должен отправить пакет назад, чтобы подтвердить получение данных (если вы не отключили эту возможность), почему бы не записать что-нибудь в этот пакет? Если определить одиночный пакет для возврата, он будет отправлен и и декодирован обычным образом.
Один из вариантов применения этой схемы - удаленный датчик. Вместо того, чтобы писать код для отправки назад значения при каждом запросе на него, можно просто сохранить текущее значение датчика в пакете АСК, и оно будет возвращено автоматически - и это освобождает вас от необходимости выключать режим прослушивания, чтобы отправить ответ. Вы просто записываете данные в пакет таким образом
radio.writeAckPayload( 1, &data, sizeof(data));
Впрочем, в определенный момент нужно очистить буфер FIFO, считав из него принятые пакеты, иначе он переполнится и перестанет выдавать подтверждения для принимаемых данных.
*/
Cheb
Offline
Зарегистрирован: 27.04.2016

Большое спасибо за информацию!! Попробую этот вариант, отпишусь =)

virf
Offline
Зарегистрирован: 16.03.2016

Блин история повторяется...

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

Питание от юсб компа, установка статичных пакетов не как не влияет.
Причем такая ситуация не всегда - бывает по несколько часов все ок.

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

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Может и провода, а может антенна такая?

Было такое, но не с nRF, а с экраном: руку подношу - работает, нубираю - перестаёт. Земля в воздухе болталась...

smesharik
Offline
Зарегистрирован: 31.01.2016

virf пишет:

При прямой антенне большая задержка,

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

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

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

я так понял что у вас модель с усилителем мощности еще и внешней антенной?!

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