nRF24L01+ : побеждаем модуль.

Тема в разделе "Проводная и беспроводная связь", создана пользователем ИгорьК, 19 июн 2014.

  1. parovoZZ

    parovoZZ Гуру

    Сразу после подачи питания необходимо выждать 100 мс перед общением.
     
  2. Олег_Э

    Олег_Э Нуб

    добрый день, подскажите что это значит, при компиляции кода ошибка

    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <Servo.h>
    Servo myservo;
    Servo myservo2;
    #define CE_PIN 9
    #define CSN_PIN 10
    int pwm = 0;
    const uint64_t pipe = 0xE8E8F0F0E1LL;
    RF24 radio(CE_PIN, CSN_PIN);
    int joystick[4];
    void setup()
    {

    delay(1000);

    radio.begin();
    radio.openReadingPipe(1,pipe);
    radio.startListening();;
    myservo.attach(4);
    myservo2.attach(8);
    pinMode(2, OUTPUT);
    }
    void loop()
    {
    if ( radio.available() )
    {
    bool done = false;
    while (!done)
    {
    done = radio.read( joystick, sizeof(joystick) );
    myservo.write(joystick[0]);
    myservo2.write(joystick[2]);
    digitalWrite(2, !joystick[3]);
    if(joystick[1]==512)
    }
    { analogWrite(3,0);
    analogWrite(5,0);
    }

    if(joystick[1]>524)
    { pwm = map(joystick[1], 524,1024,10,255);
    analogWrite(5,0);
    analogWrite(3,pwm);
    }
    if(joystick[1]<500)
    { pwm = map(joystick[1],500,0,10,255);
    analogWrite(3,0);
    analogWrite(5,pwm);
    }

    }
    }
    else
    {

    }
     

    Вложения:

  3. ImrDuke

    ImrDuke Гик

    вместо
    done = radio.read( joystick, sizeof(joystick) );
    надо написать
    radio.read( joystick, sizeof(joystick) );
     
  4. Олег_Э

    Олег_Э Нуб

  5. ImrDuke

    ImrDuke Гик

    Была другая библиотека, 5 лет прошло...
     
  6. Ну может простой вопрос, керамическая антенна и печатная - какие различия?
    Хоть конечно я по NRF24LE1
     
  7. Стабильность и дальность интересует...
     
  8. Ghosty

    Ghosty Нерд

    Ребята помогите пожалуйста.
    Модули работают все настроено. НО принимаются только первые данные массива, а вторых не принимается.
    На порте (или в порту) передатчика все в норме - [0],[1] массива есть значения. уходят
    В приемник приходят только данные с [0] массива

    Код (C++):
    передатчик:

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

    RF24 radio(9, 10);

    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
    byte transmit_data[2];

    void setup() {
      Serial.begin(9600);

      radio.begin();
      radio.setAutoAck(0);  
      radio.setRetries(0, 15);
      radio.enableAckPayload();
      radio.setPayloadSize(8);

      radio.openWritingPipe(address[0]);
      radio.setChannel(0x60);

      radio.setPALevel (RF24_PA_MAX);
      radio.setDataRate (RF24_250KBPS);
      radio.powerUp();
      radio.stopListening();
    }

    void loop() {

      int ster = analogRead(5);
       if (2005< ster <2018) transmit_data[0] = 105;
       if (ster >2020) transmit_data[0] = 250;
       if (ster <2000) transmit_data[0] = 25;
     
      int vpera = analogRead(1);
       if (1990< vpera <2020) transmit_data[1] = 50;
       if (vpera >2020) transmit_data[1] = 60;
       if (vpera <1990) transmit_data[1] = 200;
      Serial.print("Sent: ");
      Serial.println(transmit_data[1]);
      Serial.println(vpera);
      radio.write(transmit_data, sizeof(transmit_data));
      }

    приемник:

    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <Servo.h>
    Servo ster;

    RF24 radio(9,10);

    byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  //возможные номера труб
    byte recieved_data[2];

    void setup(){
      ster.attach(5);
      Serial.begin(9600);
      radio.begin();
      radio.setAutoAck(0);
      radio.setRetries(0,15);
      radio.enableAckPayload();
      //radio.setPayloadSize(8);  

      radio.openReadingPipe(1,address[0]);
      radio.setChannel(0x60);

      radio.setPALevel (RF24_PA_MAX);
      radio.setDataRate (RF24_250KBPS);
      radio.powerUp();
      radio.startListening();
    }

    void loop() {
        byte pipeNo;
        while( radio.available(&pipeNo)){  
          radio.read( &recieved_data, sizeof(recieved_data) );
       
          ster.write(recieved_data[0]);
          Serial.print("first: ");
          Serial.println(recieved_data[0]);
          Serial.print("second: ");
          Serial.println(recieved_data[1]);
          delay(200);
            }
    }
    на предыдущих страницах читал про вроде как такую же проблему, но решения не нашел, говорили про какие то реестры, файл вроде недавно выкладывали - но что это и как пользоваться не знаю.
    Помогите что не так со скетчем почему не весь массив принимается. Спасибо
     
    Последнее редактирование: 7 фев 2019
  9. parovoZZ

    parovoZZ Гуру

    Так не бывает. Передатчик считает байты и их количество заносит в специальное поле в пакете. Приемник же принимает пакет такой длины, на которую настроен, либо весь, если настроена динамическая длина пакета. Тут два варианта - либо не весь массив уходит, либо не весь массив вычитываешь.
     
  10. Доброе уже утро, я надеюсь мы тут побеждаем сам радиомодуль, ни всякие его примочки как к примеру в в LE1 МК. Но интересует такое, как выставить именно в LE1 свои трубы, и их длину, мне нужна в три байта...
    Или придётся создавать новую тему?
     
  11. ImrDuke

    ImrDuke Гик

    В приемнике закомментирована строчка
    должна быть одинакова на обоих сторонах
     
  12. Faig

    Faig Нерд

    Всем здрасти,
    По причине давления чувства лени на мою силу воли спрашиваю (не охота проверять экспериментально):
    Если использовать прерывания только для RX событий будет ли модуль дергать IRQ пин и в случаее Acknowledge? Или же IRQ пин делгается только если пришло новое сообщение?
    Короче, будет ли мой буфер принятых сообщений загрязняться акновледжами? Если да то, как вы избавляетесь от этого мусора в буфере приема?

    P.S: Почти написал(с БОжъей помощью), протокол для отправки-получения многострочных сообщений как в TCP, с контролем целестности и переотправкой потерянных фреймов.
     
  13. parovoZZ

    parovoZZ Гуру

    выше уже писал - передатчику оно ни к чему. Он сам считает. На приемнике, если длина сообщения не совпадает, пакет будет отброшен.
     
  14. Ghosty

    Ghosty Нерд

    Коментил - проверял с ней и без нее на приемнике и передатчике, но изменений нет
    вот скрин портов(не синхронный) - передатчик слева у него и [0] и [1] меняются как надо, но вот приемник меняет только [0] данные массива, а [1] всегда равны каким то 16, WTF ?
     

    Вложения:

    • порт.jpg
      порт.jpg
      Размер файла:
      93,9 КБ
      Просмотров:
      220
  15. Ghosty

    Ghosty Нерд

    Не догоняю, как это выяснить\проверить, данные с порта не показатель ?
    Может что то с типами данных что то напутал ? массив byte а данные int, так можно ?
    p.s. Я Нубоват в програмировании.
     
  16. Faig

    Faig Нерд

    Напиши вопрос в форуме - почувствуй себя невидимкой!...
     
  17. Ghosty

    Ghosty Нерд

    Привет, что то подобное и у меня, принимает только первое значение массива и все. Решение не нашлось ?
     
  18. Faig

    Faig Нерд

    Вы когда считываете, размер переменной какой выставляете? Он постоянно говорит что есть сообщение даже если считаешь его? Так?
     
  19. Faig

    Faig Нерд

    У вас массив, а вы sizeof только одной его ячейки написали.
    Надо:
    sizeof(recieved_data)*2 //ну или вместо "2" указывайте размер своего массива.
    Вывв не весь буфер считываете он их не удаляет поэтому. Вот он и говорит что в нем все еще есть данные.
     
  20. Faig

    Faig Нерд

    Update: Я оказался не прав, такое происходит только если не указать "dynamicPayloadSize" и не изменить "default payload size".
    Поправьте пожалуйста если я не прав, а лев.
    А вообще в библиотеке RF24.h написано что вы можете выставить любой размер payload (макс 32 байта = 256 бит = 32 char символа)
    но... НО! Если вы укажете меньше 32-х модуль всеравно заполнит оставшееся место нолями. Так что какой смысл уменьшать payload?
    При приеме можете смело передавать 32-х символьный массив и указывать 32 как размер переменной (или sizeof(char)*32. ] В нее сядет только то что вам нужно:
    Код (C++):
    byte newMessage[33]; //leave one инеу for null termination '\0'
    radio.read(newMessage, 32);
     
    Последнее редактирование: 9 фев 2019