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

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

  1. Oleg_7

    Oleg_7 Гик

    Любой проект должен в конечном счете стать автономным (в плане питания) . В распоряжении только внешние +5 в. Как безопаснее их подать на ардуинку: через пин+5 (не через vin), или купить usb разъем и через него подавать на ардуинку ?
     
  2. sslobodyan

    sslobodyan Гик

    А в чем разница? Если это точно 5 вольт, то хоть через ЮСБ, хоть напрямую на VCC - одинаково. А вот если больше 5 вольт (несколько батарей последовательно) - то только через VIN.
     
  3. Oleg_7

    Oleg_7 Гик

    через пин+5 -точно минуется стабилизатор (не гуд), а через usb -не знаю, не могу инфу найти. Пробовал подавать на VCC +5 в, нано начинала работать не стабильно, падало напряжение, видимо не просто так в инструкции написано - на VCC подавать от 9 до 16 В.
     
  4. sslobodyan

    sslobodyan Гик

    В какой инструкции написано, что VCC от 9 до 16 вольт? Это сразу смерть контроллеру. Не путайте VIN, который идет на вход стабилизатора, и VCC - прямо на ногу питания контроллера.
    Вот смотрите на схему https://www.arduino.cc/en/uploads/Main/ArduinoNano30Schematic.pdf
    Там +5V это как раз и есть VCC. А с разъема USB питание через диод идет прямиком на VCC, никаких загадок.
    И объясните что значит падало напряжение при подаче +5 на VCC? Что-то я не верю вашим опытам.
     
  5. Oleg_7

    Oleg_7 Гик

    Я прошу прощения, описался: конечно имел в виду не VCC а vin. Опыт был с VIN ! )) " А с разъема USB питание через диод идет прямиком на VCC, никаких загадок." - т.е. получается на ЮСБ подавать можно +5В только стабилизированные, как и на VCC ?!
     
  6. sslobodyan

    sslobodyan Гик

    Естественно. Где вы видели на юсб другое питание? Стандарт же. Только "сверхскоростные" зарядки могут через юсб подавать повышенное напряжение, но только после согласования с подключенным потребителем.
     
  7. доброго времени суток, подключил модуль установил связь, но почему связь работает только когда я держусь за антену?
     
  8. Oleg_7

    Oleg_7 Гик

  9. Oleg_7

    Oleg_7 Гик

  10. sslobodyan

    sslobodyan Гик

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

    Oleg_7 Гик

    цена, это печально....если только -удобство монтажа на плату + габариты без антены
     
  12. vovka1021

    vovka1021 Нерд

    подскажите что не так.
    Код (C++):
    //nRF24L01 - ESP8266 12
    //1 GRND
    //2 VCC
    //3 CE   - GPIO4  D2
    //4 CSN  - GPIO15 D8
    //5 SCK  - GPIO14 D5
    //6 MOSI - GPIO13 D7
    //7 MISO - GPIO12 D6
    //8 IRQ  - NC
    #include <ESP8266WiFi.h>
    #include <WiFiClient.h>
    #include <ESP8266WebServer.h>
    #include <ESP8266mDNS.h>
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <string.h>
    #include <Hash.h>

    #define CE_PIN D2          
    #define CSN_PIN D8
    const uint64_t readingPipe = 0x1234567890LL;
    const uint64_t writingPipe = 0x1234567890LL;

    RF24 radio(CE_PIN, CSN_PIN);

    int ti=0;             //количество отправленных запросов
    const char* www_username = "admin";
    const char* www_password = "admin";
    const char* ssid = "";
    const char* password = "";
    float h, t ;
    const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";

    ESP8266WebServer server(80);
    void handleNotFound(){ //страница ошибок
      String message = "File Not Found\n\n";
      message += "URI: ";
      message += server.uri();
      message += "\nMethod: ";
      message += (server.method() == HTTP_GET)?"GET":"POST";
      message += "\nArguments: ";
      message += server.args();
      message += "\n";
      for (uint8_t i=0; i<server.args(); i++){
        message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
      }
      server.send(404, "text/plain", message);
    }
    void api(){    
        if(!server.authenticate(www_username, www_password))
          return server.requestAuthentication();
    String api = "ESP8266 + NRF2L01  \n\n";
    api += "WiFi RSSI \n";
    api += WiFi.RSSI();
    api += "\n";
    api += "Ram \n";
    api += ESP.getFreeHeap();
    api += "\n";
    api += "Chip ID\n ";
    api += ESP.getChipId();
    api += "\n";
    api += "Sent requests:\n";
    api += ti ;
    api += "\n";
    api += "\n";
       
    api += "DHT\n";
    api += "Temperature:\n";  // Температура BMP180
    api += t ;
    api += "\n";
    api += "Humidity:\n";     // давление BMP180
    api += h ;
    api += "\n";
    api += "\n";
    server.send(200, "text/plain", api);
    };
    void setup(void){
      SPI.setHwCs(true);
      SPI.begin();
      SPI.setDataMode(SPI_MODE0);
      SPI.setBitOrder(MSBFIRST);

        radio.begin();                          // Включение модуля;
        radio.setChannel(0);                    // Установка канала вещания;
        radio.setDataRate(RF24_250KBPS);        // Установка минимальной скорости;
        radio.setPALevel(RF24_PA_MAX);          // Установка максимальной мощности;
        radio.openReadingPipe(1,readingPipe);   // Активация данных для чтения
        radio.startListening();                 // Слушаем эфир.

        Serial.begin(115200);
        WiFi.mode(WIFI_STA); //режим клиент
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
        Serial.println(WiFi.localIP());
    server.on("/", api);
    server.on("/reset", [](){                     // Перезагрузка
         if(!server.authenticate(www_username, www_password))
          return server.requestAuthentication();
        server.send(200, "text/plain", "ok");
        ESP.restart();
         });      
    server.onNotFound(handleNotFound);          //  Cтраница ошибки
    server.on("/test", HTTP_GET, [](){           //   Обновление
           if(!server.authenticate(www_username, www_password))
          return server.requestAuthentication();
          server.sendHeader("Connection", "close");
          server.sendHeader("Access-Control-Allow-Origin", "*");
          server.send(200, "text/html", serverIndex);
        });
        server.on("/update", HTTP_POST, [](){
          server.sendHeader("Connection", "close");
          server.sendHeader("Access-Control-Allow-Origin", "*");
          server.send(200, "text/plain", (Update.hasError())?"FAIL":"OK");
          ESP.restart();
        },[](){
          HTTPUpload& upload = server.upload();
          if(upload.status == UPLOAD_FILE_START){
            Serial.setDebugOutput(true);
            WiFiUDP::stopAll();    
            uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
            if(!Update.begin(maxSketchSpace)){//start with max available size
              Update.printError(Serial);
              }
          } else if(upload.status == UPLOAD_FILE_WRITE){
            if(Update.write(upload.buf, upload.currentSize) != upload.currentSize){
              Update.printError(Serial);
            }
          } else if(upload.status == UPLOAD_FILE_END){
            if(Update.end(true)){ //true to set the size to the current progress      
            } else {
              Update.printError(Serial);
            }
            Serial.setDebugOutput(false);
          }
          yield();
        });
      server.begin();
      }
    void loop(void){
    server.handleClient();
    float data[2];
    if(radio.available()){                                // Если в буфере имеются принятые данные
    radio.read(&data, sizeof(data));                      // Читаем данные в массив data и указываем сколько байт читать
      h=data[0];
      t=data[1];
      ti++;
    }
    }
     
  13. vovka1021

    vovka1021 Нерд

    Код (C++):
    #include <SPI.h>                                            // Подключаем библиотеку для работы с шиной SPI
    #include <nRF24L01.h>                                       // Подключаем файл настроек из библиотеки RF24
    #include "RF24.h"                                           // Подключаем библиотеку для работы с nRF24L01+
    #include "DHT.h"
    #define DHTPIN 4  

    #define DHTTYPE DHT22       // DHT 22  (AM2302), AM2321

    RF24   radio(9, 10);        // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
    DHT dht(DHTPIN, DHTTYPE);

    void setup(){
       Serial.begin(9600);
        dht.begin();
        radio.begin();
        radio.setChannel(0);
        radio.setDataRate(RF24_250KBPS);
        radio.setPALevel(RF24_PA_MAX);                      
        radio.setRetries(15,15);                          
        radio.openWritingPipe (0x1234567890LL);
           
    }
    void loop(){
      float data[2];
      delay(2000);
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      float f = dht.readTemperature(true);
      if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
      }

      data[0] = h; // заполняем массив
      data[1] = t;
      radio.write(&data, sizeof(data));                      // отправляем данные и указываем сколько байт пакет

       Serial.println(data[0]); //выводим данные в сериал порт для проверки.
       Serial.println(data[1]); //выводим данные в сериал порт для проверки.
       Serial.println(); //пробел.
       delay(519); //ждем пол секунды.
      }
    где накосячил. подскажите?
     
  14. Oleg_7

    Oleg_7 Гик

    Добрый всем день! кто нибудь знает, для нрф с антенкой и усилителем что лучше использовать в сетап: radio.setPALevel(RF24_PA_MAX); или RF24_PA_HIGH ?
     
  15. gydota

    gydota Нуб

    Всем привет, специально зарегистрировался чтоб написать. Как большинство здешних, мучаюсь с nrf модулями вторую неделю. Наконец-то смог подружить 2 модуля, а вот подключаю третий и беда.
    Мне нужно сделать так чтоб бьіло несколько передатчиков (pir сенсор с ардуинкой) и один приемник, которьій будет собирать даньіе от всех и сигнализировать на веб сервер, какой конкретно сенсор сработал. Как уже писал с одним получается, а когда подцепляю другой передатчик сразу виснет вся система и больше ничего не работает.
    Ткните пожалуйста где ошибка.
    Передатчик 1:
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"

    RF24 radio(9, 10);
    const uint64_t pipe = 0xE8E8F0F0A1LL;
    byte PIR = 3;
    byte data[1];
    boolean flag;

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

      pinMode(PIR, INPUT);

      radio.begin();
      radio.setAutoAck(1);      
      radio.setRetries(15, 15);  
      radio.enableAckPayload();  
      radio.setPayloadSize(32);  
      radio.openWritingPipe(pipe);
      radio.setChannel(0x60);
      radio.setPALevel (RF24_PA_MAX);
      radio.setDataRate (RF24_1MBPS);
      radio.powerUp();
      radio.stopListening();  /
    }

    void loop() {

      data[0] = digitalRead(PIR);
       flag = 1;
      if (flag == 1) {
        radio.powerUp();
        radio.write(&data, sizeof(data));
        flag = 0;
        radio.powerDown();
      }
    }
    Передатчик 2
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"

    RF24 radio(9, 10);
    const uint64_t pipe = 0xE8E8F0F0B2LL;
    byte PIR = 3;
    byte data[1];
    boolean flag;

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

      pinMode(PIR, INPUT);

      radio.begin();
      radio.setAutoAck(1);      
      radio.setRetries(15, 15);  
      radio.enableAckPayload();  
      radio.setPayloadSize(32);  
      radio.openWritingPipe(pipe);
      radio.setChannel(0x60);
      radio.setPALevel (RF24_PA_MAX);
      radio.setDataRate (RF24_1MBPS);
      radio.powerUp();
      radio.stopListening();  /
    }

    void loop() {

      data[0] = digitalRead(PIR);
       flag = 1;
      if (flag == 1) {
        radio.powerUp();
        radio.write(&data, sizeof(data));
        flag = 0;
        radio.powerDown();
      }
    }
    Приемник:
    Код (C++):
    #include <ESP8266WiFi.h>
    #include <SPI.h>
    //#include <nRF24L01.h>
    #include <RF24.h>
    RF24 radio(4, 15);


    char ssid[] = "*******";
    char pass[] = "*******";
    char server[] = "192.168.1.138";

    byte relay = 2; //d4
    byte relay2 = 4;//d2
    int data[1];

    const uint64_t pipe1 = 0xE8E8F0F0A1LL;
    const uint64_t pipe2 = 0xE8E8F0F0B2LL;


    void setup() {
      Serial.begin(9600);
      pinMode(relay, OUTPUT);
      radio.begin();
      radio.setAutoAck(1);      
      radio.setRetries(15, 15);  
      radio.enableAckPayload();  
      radio.setPayloadSize(32);  
      radio.openReadingPipe(1, pipe1);
      radio.openReadingPipe(2, pipe2);
      radio.setChannel(0x60);
      radio.setPALevel (RF24_PA_MAX);
      radio.setDataRate (RF24_1MBPS);
      radio.powerUp();
      radio.startListening();
    }
    void loop() {
               

    uint8_t pipe1;
    uint8_t pipe2;
      while ( radio.available(&pipe1)) {
        radio.read( &data, sizeof(data) );      
        digitalWrite(relay, data[0]);
        }
      while ( radio.available(&pipe2)) {
        radio.read( &data, sizeof(data) );      
        digitalWrite(relay2, data[0]);
      }
    }
     
    Последнее редактирование: 25 апр 2017
  16. victorv

    victorv Нуб

    Здравствуйте , хочу подключить nRF24L01 к ATMEGA128A подойдут ли стандартные библиотеки ("nRF24L01.h RF24.h") или надо в них что то менять и к каким выводам лучше подключать ?
     
  17. NikZ

    NikZ Нерд

    Приветствую! Просмотрел всю тему, так и не понял, чего мне надо поправить у себя:)
    Есть 2 таких модуля, питание через отдельный стабилизатор, кондер (электролит + керамика) подпаяны, по питанию все чисто. Но стабильная передача идет, только когда я касаюсь пальцем кварца на передающем модуле. Без пальца - потери пакетов. Шаманил с AutoAck, скоростями передачи - без толку. Надо палец:)
     
  18. Radius

    Radius Гик

    Палец выполняет роль антенны. Похоже на данных модулях не очень качественно спроектированы печатные антенны, или что то не так с согласующими индуктивностями и ёмкостями на антенных выходах.
     
    NikZ нравится это.
  19. NikZ

    NikZ Нерд

    Может и так, но два нюанса:
    - модули я использую с внешней антенной, которые до 1100 метров, и кварц далековато там от самого радиотракта
    - тесты идут на расстоянии 50-100 см, там даже без антенны долететь должно хоть что-то:)
     
  20. Radius

    Radius Гик

    Тогда нужно разнести модули. Возможно, что на таком маленьком расстоянии просто перегружен приемник.