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

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

  1. Syberon

    Syberon Нерд

    Такой вариант не пробовал, но даже не знаю как его реализовать, учитывая, что до "зависания" модуль может проработать пару часов, а держать всё это время щуп прижатым перспектива та ещё:) Можно было бы конечно крючками, но они пока ещё едут ко мне "скоростной" почтой России)
     
  2. tgwt

    tgwt Нерд

    Пока вы мне не ответили, попробовал через булеву переменную сделать, типа bool ok = radio.write(). Если ok, то увеличиваем data.

    А вот то, что сделал сейчас:

    Приемник
    Код (C++):
    #include <SPI.h>
    #include <RF24.h>
    // Настройка пинов для CE, CSN
    const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
    const uint64_t pipe1 = 0xF0F1F2F3F5LL;
    bool done;
    RF24 radio(40, 53); // CE, CSN

    void setup() {
      Serial.begin(57600);
      pinMode(2, OUTPUT);
      radio.begin();
      delay(2);
      radio.setChannel(9); // канал (0-127)
      radio.setAutoAck(false);
      //radio.enableAckPayload();
      radio.setDataRate(RF24_250KBPS);
      radio.setPALevel(RF24_PA_HIGH);
      radio.openReadingPipe(1, pipe); // открываем первую трубу с идентификатором "pipe"
      radio.openWritingPipe(pipe1);
      radio.startListening(); // включаем приемник, начинаем слушать трубу
    }

    // radio.stopListening(); // останавливает приём (нужно перед началом передачи)

    void loop()
    {
      uint32_t data;
      uint32_t message = 111;
      //radio.writeAckPayload(1, &message, sizeof(message));
      if (radio.available()) // проверяем не пришло ли чего в буфер.
      {
        done = false;
        while (!done)
        {
          done = radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
          Serial.print("data: ");
          Serial.println(data);
        }
        digitalWrite(2, HIGH);
      }
      else
      {
        digitalWrite(2, LOW);
      }

      radio.stopListening();
      bool ok = false;
      while(!ok)
      {
        ok = radio.write(&message, sizeof(message));
      }
      radio.startListening();
    }
     

    Передатчик
    Код (C++):
    #include <SPI.h>
    #include <RF24.h>

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

    RF24 radio(40, 53); // CE, CSN
    bool done;
    uint32_t message;
    uint32_t data = 1;
    void setup()
    {
      Serial.begin(57600);
      radio.begin();
      delay(2);
      radio.setChannel(9); // канал (0-127)
      radio.setAutoAck(false);
      //radio.enableAckPayload();
      radio.setDataRate(RF24_250KBPS);
      radio.setPALevel(RF24_PA_HIGH);
      radio.openWritingPipe(pipe); // открываем трубу на передачу.
      radio.openReadingPipe(1, pipe1);
    }

    void loop()
    {
      bool ok = false;
      while(!ok)
      {
        ok = radio.write(&data, sizeof(data));
      }

      radio.startListening();
      if (radio.available())
      {
        done = false;
        while(!done)
          done = radio.read(&message, sizeof(message));
        Serial.println("________");
        Serial.println(message);
        Serial.println("--------");
      }
      radio.stopListening();
     
      if (message == 111 && ok)
      {
        data++;
      }
    }
     
    И все равно что то не хочет пахать. Заранее прошу прощения, если код покажется кривым, или будут какие то слишком очевидные ошибки. Просто я уже не вижу текста на экране, забилась голова информацией.
     
  3. Syberon

    Syberon Нерд

    А зачем у вас приемник постоянно, не зависимо от того принял он что-то или нет все время, на каждом цикле loop шлет ответ "111"? Мне кажется логичнее здесь будет так:
    Код (C++):
    void loop()
    {
      uint32_t data;
      uint32_t message = 111;
      //radio.writeAckPayload(1, &message, sizeof(message));
      if (radio.available()) // проверяем не пришло ли чего в буфер.
      {
        done = false;
        while (!done)
        {
          done = radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
          Serial.print("data: ");
          Serial.println(data);
        }
        digitalWrite(2, HIGH);
        radio.stopListening();
        bool ok = false;
        while(!ok)
        {
          ok = radio.write(&message, sizeof(message));
        }
        radio.startListening();
      }
      else
      {
        digitalWrite(2, LOW);
      }
    }
    т.е. отправлять ответ только тогда когда что-то было получено, а не спамить в эфир без повода этими единичками.

    И ещё вот тут:
    Код (C++):
      if (message == 111 && ok)
      {
        data++;
      }
    После первого принятого ответного пакета message примет значение 111 и при следующем прохождении цикла это условие всегда будет выполняться, даже если ничего не получено.
    Лучше тогда уж так:
    Код (C++):
      if (message == 111 && ok)
      {
        data++;
        message = 0;
      }
     
  4. Mishytka

    Mishytka Нуб

    Здравствуйте,Господа.
    Есть две Arduino Mega 2560,2x NRF24l01+(вроде бы плюс).
    Подключал к мегам так: Vcc,Gnd. CE - 8. 50-MISO. 51- MOSI. 52 - SCK. 53-SS(он же CSN).
    На обоих модулях кондеры на питании припаяны.
    Использовал библиотеку RadioHead, которая была найдена fandm на 14-ой странице.
    И коды,соответственно,оттуда: nrf24_client и nrf24_server(это их название в папке с примерами).

    результат сего горя примерно получается такой.
    Что означает "яяяяяяяяяяяяя"?
    И так ли вообще все должно работать?
    upload_2016-5-10_22-39-54.png
     
  5. sergey-fedor

    sergey-fedor Нерд

    Наконец то!!!! заработало , вставил строчку (паузу) эту, правда еще от безысходности , в пару электролитам на 100 мкФ , напаял 0,1 мкф керамику параллельно! Теперь получает отправляет нормально все, питаю от Ардуин уно (2шт), которые в свою очередь запитаны от Малины пи3

    p/s две!!! недели потратил на перечитывание всей ветки форума еще раз, на разного рода эксперименты.
     
  6. tgwt

    tgwt Нерд

    Сделал как вы сказали, но все равно не получается. Приемник все время выводит "1", счетчик на передатчике не увеличивается, и передатчик не выводит message. :( Попробую кондер напаять. А если просто оставить вот так?

    Код (C++):
    bool ok = false;
      while(!ok)
      {
        ok = radio.write(&data, sizeof(data));
      }
     
  7. ИгорьК

    ИгорьК Гуру

    Напомните, что за паузу Вы вставили - вынесу в заголовок. Тема уже слишком большая для новичков.
     
  8. ИгорьК

    ИгорьК Гуру

    Забавно. Я в первом посте об этом уже все уши прожужжал, и все бестолку.
    Потому и перестал эту тему читать.
    Все, в конце концов, заканчивается питанием и одинаковыми настройками приёмника и передатчика с выключением подтверждения приема.
    Вот какая-то пауза появилась, которая, по сути, тоже есть питание - дополнительное время на зарядку конденсатора.
    Это все, если исключить непонимание юзером происходящего или особые запросы к коду. Но тема то о запуске модуля, а не о программировании устройств на нем.
     
  9. tgwt

    tgwt Нерд

    Данные с передатчика всегда доходят до приемника, но функция write всегда возвращает false. Как это можно решить?
     
  10. ИгорьК

    ИгорьК Гуру

    Начать с питания. Модуль в режиме приема потребляет электричества больше чем в режиме передачи. Левый он. Как и 95% его собратьев.
    Пока питание модуля не "устаканено" - разговора нет.

    И, честно говоря, я действительно не читаю эту тему. Из страницы в страницу повторяется одно и то же.
     
  11. tgwt

    tgwt Нерд

    Нашел у себя кондер. Он круглый керамический, на нем написано 10 и подчеркнуто. Не подскажете на сколько он? В интернете пока не нашел ничего, но продолжаю искать.
     
  12. Mishytka

    Mishytka Нуб

    Пожалуйста,не оставляйте без внимания сообщение #824
     
  13. ИгорьК

    ИгорьК Гуру

    Судя по общей картинке - прием/передача ИНОГДА проходят.
    Но проходят с мусором "яяяяя". Кто его генерит - понять сложно. Может передатчик, может - приемник. Так быть не должно.
    Это поведение характерно для (ничего нового) проблем с питанием. Значит конденсатор не помогает - питать оба модуля от НАДЕЖНЫХ, мощных источников.
     
  14. sergey-fedor

    sergey-fedor Нерд

    В Файл RF24.cpp вставить строку delayMicroseconds(100);
    Файл RF24.cpp

    void RF24::csn(int mode)
    {
    // Minimum ideal SPI bus speed is 2x data rate
    // If we assume 2Mbs data rate and 16Mhz clock, a
    // divider of 4 is the minimum we want.
    // CLK:BUS 8Mhz:2Mhz, 16Mhz:4Mhz, or 20Mhz:5Mhz
    #ifdef ARDUINO
    SPI.setBitOrder(MSBFIRST);
    SPI.setDataMode(SPI_MODE0);
    SPI.setClockDivider(SPI_CLOCK_DIV4);
    #endif
    digitalWrite(csn_pin,mode);
    delayMicroseconds(100);
    }
     
    ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Гуру

    Что за библиотека из трех возможных?
     
  16. Mishytka

    Mishytka Нуб

    Мощных источников - насколько мощных? На сколько подойдут блоки питания для подобного дела,чтобы не было подобного больше?
     
  17. ИгорьК

    ИгорьК Гуру

    В пике модуль потребляет 13.5 ма. Но это ТХ оригинального модуля. стр.14.
    По ТХ проходит даже питание от Меги, но на практике все не так. Мы же все имеем дело с жестокими подделками.
    Я не знаю ответа на Ваш вопрос. Чем больше - тем лучше. И чтобы пульсаций не было.
     
  18. sergey-fedor

    sergey-fedor Нерд

    Вроде бы с вашей первой страницы изначально брал, вот что в ней написано :

    Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    version 2 as published by the Free Software Foundation.
     
    ИгорьК нравится это.
  19. ИгорьК

    ИгорьК Гуру

    Ясно. Спасибо. Обязательно вынесу в заголовок чуть позже.
     
  20. Здраствуйте, подскажите пожалуйста, мне нужно расположить устройство рядом, почти вплотную в одном корпусе с батарейками АА 8 штук, могут ли они плохо сказаться на работе модуля или нет?