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

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

  1. ИгорьК

    ИгорьК Гуру

    И я не шучу. Вынес в заголовок - смотрите первый пост.
     
    ostrov нравится это.
  2. ostrov

    ostrov Гуру

    Да, и полный текст инициализации тогда бы в первый заголовок, чтобы народ не искал по всем 50 страницам.
     
  3. ИгорьК

    ИгорьК Гуру

    Не. Объяснение всего идет на первых двух страницах. Все остальные 46 страниц - убеждение припаять конденсатор. Сопротивляются. Я уже особо и не слежу за этой темой - все одно и то же.
     
  4. sergey-fedor

    sergey-fedor Нерд

    а как подключить этот модуль напрямую к raspberry pi3 ? нашел библиотеку для python3 , но не смог пока подружить ардуино и распбери через nrf24l01 именно хотелось бы на питоне сделать ту часть которая на малинке , чтобы без котсылей :) . Видел реализацию вроде бы как на С++ работает, кладутся в файл данные, а уж потом из файла можно читать данные любым другим языком и использовать дальше , но это как то не шибко красиво выглядит
     
  5. Actinium

    Actinium Нуб

    Господа, выручайте, уже неделю пытаюсь подружить 2 ардуинки по радиоканалу, перебрал кучу библиотек, на руках 7 модулей nrf24l01+, стоит отдельное питание и кондеры на 10мкф, все вроде работает, а ловит только 0 и помехи, пробовал с нано и уно, никак
    был бы осциллограф хоть проверить идет ли отправка
    код взял здесь http://arrduinolab.blogspot.com/2014/12/nrf24l01-arduino.html
     
  6. ostrov

    ostrov Гуру

    Первые две страницы этой темы читали?
     
  7. Actinium

    Actinium Нуб

    а также последующие 25
     
  8. sergey-fedor

    sergey-fedor Нерд

    можно еще 100500 страниц написать про то что питание должно быть стабильным, что контакт всех проводов должен быть хорошим, кто как из этого выходит , можно лабораторным блоком питания подавать напряжение можно через плату переходник запитать от 5 в , способы есть, главное прочитать и выбрать для себя. Вот удобные библиотеки для разных языков программирования - это да. Точнее их отсутствие ! только на с++ норм
     
  9. ИгорьК

    ИгорьК Гуру

    И что еще кроме напайки конденсатора Вы сделали?
     
  10. ИгорьК

    ИгорьК Гуру

    ... и это будет бестолку - каждый раз очередной юзер будет это игнорировать до последнего.
    А что, у нас уже МК на разных языках программируют? Вот Iskra JS на JS - там есть. Видел где-то на Python для Малины. На PHP, Perl и Ruby не хватает? :)
     
  11. ostrov

    ostrov Гуру

    Судя по вашим ссылкам на готовые примеры (лишенные инициаливции), вы таки не читали первые две страницы.
     
  12. sergey-fedor

    sergey-fedor Нерд

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

    AlexVS Гик

    Победителям модулей и побежденным.
    Нашел и выкладываю русскоязычное описание чипа nRF24. Просто для информации.
     

    Вложения:

  14. sergey-fedor

    sergey-fedor Нерд

    Продолжаем побеждать!!! Кому может будет интересно запустить Nrf24L01+ на Raspberry Pi B+/2/3 , под python3 ! нашел библиотеку работающую, без бубнов с обертыванием с++ в python, это уже сделано! между двумя малинами работает замечательно! передает - отправляет . Теперь осталось все собрать с малиной и ардуино :). В общем модуль забавный оказался :)) разминка для ума и для пальцев! ну и там английский где то подтянуть даташиты почитать - для саморазвития :))
    p/s в архиве - библиотека под python2/3 , я запускал под python3 , и примеры один пример для virtualGPIO его не пробовал , а вот второй пример, под реальный GPIO - все работает замечательно
     

    Вложения:

    Un_ka, BreakFaster и ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Гуру

    Выношу в шапку темы.
     
  16. lavAzza

    lavAzza Нерд

    Добрый день.

    UPD Остальное можно читать только чтобы попытаться помочь мне понять почему с одним и тем же кодом иногда работает, а иногда нет.))) Ибо сейчас все отлично передается и принимается.

    Может быть кто подскажет по проблеме.
    Есть ардуино с nrf24l01+ (экспериментировал с разными конденсаторами и без)
    С ардуино через модуль должны передаваться данные на распбери с таким же модулем.
    Так вот, в loop radio.write срабатывает только один раз (при этом на распбери получаю почему-то предыдущий пакет). После этого передача данных, да и вывод данных через Serial.print прекращается. Если закрыть монитор порта и снова открыть, то снова radio.write срабатывает один раз.
    Если из кода убрать radio.write , то вывод данных через Serial.print продолжается нормально.

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

    Вкратце: к ардуине подключен dht21 и китайский счетчик Гейгера, их данные передаются на распберри.

    Raspberry code
    Код (C++):

    #include <cstdlib>
    #include <iostream>
    #include "/home/pi/RF24/RF24.h"
    #include <fstream>
    using namespace std;

    // spi device, spi speed, ce gpio pin
    //RF24 radio("/dev/spidev0.0",8000000,25);
    RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);//знач$

    void setup(void)
    {
        // init radio for reading
        radio.begin();
        radio.enableDynamicPayloads();
        radio.setAutoAck(1);
        radio.setRetries(15,15);
        radio.setDataRate(RF24_250KBPS);
        radio.setPALevel(RF24_PA_MAX);
        radio.setChannel(76);
        radio.setCRCLength(RF24_CRC_16);
        radio.openReadingPipe(1,0xF0F0F0F0E1LL);
        radio.startListening();
    }

    void loop(void)
    {
    char receivePayload[64];
        while (radio.available())
        {
    uint8_t len = radio.getDynamicPayloadSize();
    radio.read(receivePayload, len);
    // Костыль для создания промежуточного файла.
    //ofstream out("/dev/nrf24");
    //out << receivePayload << "\n";
    //out.close ();
    cout<<"\n Data="<<receivePayload;
    delay(200);
        }
    delay(20);
    }

    int main(int argc, char** argv)
    {
    cout << "Driver initialized, please check values of /dev/nrf24" << endl;
        setup();
        while(1)
            loop();

        return 0;
    }
     
    Arduino code
    Код (C++):
    #include <SPI.h>
    //#include "DHT.h"
    #include "RF24.h"
    #include <printf.h>
    #include "DHT.h"

    #define LOG_PERIOD 5000  //Logging period in milliseconds, recommended value 15000-60000.
    #define MAX_PERIOD 60000  //Maximum logging period without modifying this sketch

    #define DHTPIN 3

    #define DHTTYPE DHT21

    RF24 radio(7,8);
    unsigned long counts;     //variable for GM Tube events
    unsigned long cpm;        //variable for CPM
    unsigned int multiplier;  //variable for calculation CPM in this sketch
    unsigned long previousMillis;  //variable for time measurement

    unsigned long count = 0;
    int sensor1 = 2;

    const uint64_t pipes[2] = {0xF0F0F0F0E2LL, 0xF0F0F0F0E1LL};


    DHT dht(DHTPIN, DHTTYPE);

    void tube_impulse(){       //subprocedure for capturing events from Geiger Kit
      counts++;
    }

    void setup(){             //setup subprocedure
      counts = 0;
      cpm = 0;
      multiplier = MAX_PERIOD / LOG_PERIOD;      //calculating multiplier, depend on your log period
      Serial.begin(9600);
      attachInterrupt(0, tube_impulse, FALLING); //define external interrupts
      printf_begin();


      radio.begin();
      radio.setDataRate(RF24_250KBPS);
      radio.setPALevel(RF24_PA_MAX);
      radio.setChannel(76);
      radio.openWritingPipe(pipes[1]);
      radio.openReadingPipe(1, pipes[0]);
      radio.enableDynamicPayloads();
      radio.powerUp();
      //radio.setAutoAck(0);
      pinMode(sensor1, INPUT);
      pinMode(3, OUTPUT);
    radio.startListening();
    delay(1000);
      radio.printDetails();
      radio.stopListening();
      delay(20);
      dht.begin();

    }

    void loop(){                                 //main cycle


      //Получаем температуру и влажность, выводим
      float h = dht.readHumidity();
      float t = dht.readTemperature();
    if (isnan(t) || isnan(h)) {
        Serial.println("Failed to read from DHT");
      } else {
        Serial.print("Humidity: ");
        Serial.print(h);
        Serial.print(" %\t");
        Serial.print("Temperature: ");
        Serial.print(t);
        Serial.println(" *C");
      }
      delay(2000);

      //получаем cpm
      unsigned long currentMillis = millis();
      if(currentMillis - previousMillis > LOG_PERIOD){
        previousMillis = currentMillis;
        cpm = counts * multiplier;
      counts = 0;  
        Serial.println(cpm);

        char outBuffer[32]= "";

        char buffer[10];
        String outr = dtostrf(cpm,3,1,buffer);
        String outt = dtostrf(t,3,1,buffer);
        String outh = dtostrf(h,3,1,buffer);
        String out = outr+" "+outt+" "+outh;
        out.toCharArray(outBuffer, 32);

        radio.write(outBuffer, 32);
     
      }
    }
     
    Последнее редактирование: 29 июн 2016
  17. sergey-fedor

    sergey-fedor Нерд

    без скетча (на обоих устройствах) наверно только телепат вам сможет помочь
     
  18. lavAzza

    lavAzza Нерд

    Спасибо за совет, добавил.
     
  19. ostrov

    ostrov Гуру

    Не глядя пока в программу могу высказать совет перепроверить все контакты и питание. Этот модуль очень капризный и не переносит малейшего оскорбления или намек на таковое. Я сам убил не одну ночь пытаясь найти зависимость работы и отказов, пока что нашел их в плохих (по мнению NRF) контактах, причем многие другие устройства в тех же условиях работают нормально. Часто помогает простое облужение ножек, если вы его не припаиваете намертво.
     
    ИгорьК нравится это.
  20. woow

    woow Гик

    -- вот тут непонятно как?

    1. Не надо бросаться читать эту тему. -что поделать, я бросился
    2. Запитайте модуль от отдельного источника 3.3 вольта мощностью не менее 300 ма - и будет вам счастье. Нет? -сделано, но счастье нет
    Припаяйте конденсатор 2-10 мкф между плюсом и минусом на модуле. Нет? сделано, но счастье нет
    У вас Arduino Mega? Еще раз читаем и перечитываем этот пункт!- у меня UNO и MICRO PRO
    Нет? Смотрим дальше...- дальше нет не Мега , тогда дальше это куда?
    3. Есть серьезные основания полагать, что у Вас лично, да-да, у Вас, не настоящий модуль, а его клон- верю на слово идем дальше
    Клоны, при инициализации,
    (1) требуют установления абсолютно всех возможных параметров идентичными. - так эсли загрузить один и тотже скеч на обе ардуинки значение будут одинаковыми или что то не так расуждаю?
    Решение, оказывается, простое - разобраться с каждой настройкой, которая автором библиотеки указана дефолтной и необязательной.
    У меня, например, модули устойчиво заработали, когда была выполнена одинаковая установка функции setCRCLength(). -это где (понимаю, что здесь дискутируют или знатоки или счасливчики которым хватило лиш подпоять кондеры)?
    (2) лучше устанавливать в скорость передачи 1 Мбит--а это как? После заливки скеча бывает иногда разный вариант (объяснений тому не имею) - плавает не всегда 1 Мбит.
    3) менять параметры ASK на удачу. перепробовал и true и false.
    (4) проверять работу при подтяжке CS к питанию.- я так понимаю что речь идёт о CSN соединить с VCC.

    Запустил вами обработанный скетч с библиотекой от сюда http://maniacbug.github.io/RF24/classRF24.html .

    1-true.jpg false.jpg false-1.jpg true.jpg