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

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

  1. Lagvin

    Lagvin Нерд

    Получилось запустить, но только до первой перезагрузки уно, и больше не работает
    Код передатчика
    Код (Text):


    #include <SPI.h>
    #include "RF24.h"
    #include "nRF24L01.h"
    int msg[1];

    RF24 radio(9,53);


    const uint64_t pipe = 0xE8E8F0F0E1LL ;
    int LED = 5;
    int buttonPin1 = 2;
    int buttonPin2 = 3;

    void setup(void)
    {

    radio.begin();
    radio.powerUp();
    radio.setDataRate(RF24_1MBPS);
    radio.setChannel(120);
    radio.setRetries(15,15);
    radio.setPayloadSize(1);
    radio.openWritingPipe(pipe);
    pinMode(LED, OUTPUT);
    }

    void loop(void)
    {


    if (digitalRead(buttonPin1) == HIGH){
    msg[0] =111;
    digitalWrite(LED,HIGH);
    radio.write(msg, 1);
    }
    if (digitalRead(buttonPin2) == HIGH){
    msg[0] =112;
    digitalWrite(LED,HIGH);
    radio.write(msg, 1);
    }
    }

     
    приемник

    Код (Text):



    #include <SPI.h>
    #include "RF24.h"
    #include "nRF24L01.h"
    int msg[1];

    RF24 radio(9,10);

    int LEDpin1 = 2;
    int LEDpin2 = 3;
    int LEDpin3 = 5;
    const uint64_t pipe = 0xE8E8F0F0E1LL ;



    void setup(void)
    {

    radio.begin();
    radio.setDataRate(RF24_1MBPS);
    radio.setChannel(120);
    radio.setRetries(15,15);
    radio.setPayloadSize(1);
    radio.openReadingPipe(1,pipe);
    radio.startListening();
    pinMode(LEDpin1, OUTPUT);
    pinMode(LEDpin2, OUTPUT);
    pinMode(LEDpin3, OUTPUT);
    }

    void loop(void)
    {

    digitalWrite(LEDpin3, HIGH);
    if (radio.available()) {
    bool done = false;
    while (!done){
    done = radio.read(msg,1);
    if(msg[0] == 111){
    delay(10);
    digitalWrite(LEDpin1, HIGH);
    }
    else {
    digitalWrite(LEDpin1, LOW);
    }
    delay(10);
    if(msg[0] == 112){
    delay(10);
    digitalWrite(LEDpin2, HIGH);
    }
    else {
    digitalWrite(LEDpin2, LOW);
    }
    delay(10);
    }
    }
    }

     
     
    Последнее редактирование: 1 апр 2015
  2. zaynus

    zaynus Нерд

    дык тут 2 передатчика
     
  3. Lagvin

    Lagvin Нерд

    Исправил
     
  4. zaynus

    zaynus Нерд

    Для начала, кидаете int а размер пакета 1 байт.
    Что будет если кнопка в low, передатчик ничего не передаст.
     
  5. zaynus

    zaynus Нерд

    Код (Text):
    //#include <printf.h>

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

    int msg = 0;

    RF24 radio(7,8);


    const uint64_t pipe = 0xE8E8F0F0E1LL ;
    //int LED = 5;
    int buttonPin1 = 3;
    int buttonPin2 = 4;

    void setup(void)
    {

    radio.begin();
      // optionally, increase the delay between retries & # of retries
      radio.setRetries(15, 15);
      radio.setChannel(120);
      radio.setPayloadSize(12);
        printf_begin();
        //radio.enableDynamicPayloads();

      radio.powerUp();
    // radio.startListening();
      radio.setPALevel(RF24_PA_MAX);
      radio.setDataRate(RF24_2MBPS);
      radio.enableAckPayload();
    //radio.setPayloadSize(1);
    radio.openWritingPipe(pipe);
    //pinMode(LED, OUTPUT);
    Serial.begin(115200);
      radio.printDetails();

    }

    void loop(void)
    {


    if (digitalRead(buttonPin1) == HIGH){
    msg =111;
    //digitalWrite(LED,HIGH);
    radio.write(&msg,sizeof( msg));
    }
    if (digitalRead(buttonPin2) == HIGH){
    msg =112;
    //digitalWrite(LED,HIGH);
    radio.write(&msg,sizeof( msg));
    }
    }

     
    Код (Text):
    #include <SPI.h>
    #include "RF24.h"
    #include "nRF24L01.h"

    int msg=0;

    RF24 radio(9,10);

    //int LEDpin1 = 2;
    //int LEDpin2 = 3;
    //int LEDpin3 = 5;
    const uint64_t pipe = 0xE8E8F0F0E1LL ;



    void setup(void)
    {

    radio.begin();
      // optionally, increase the delay between retries & # of retries
      radio.setRetries(15, 15);
      radio.setChannel(120);
      radio.setPayloadSize(12);
        //radio.enableDynamicPayloads();

      radio.powerUp();
      radio.startListening();
      radio.setPALevel(RF24_PA_MAX);
      radio.setDataRate(RF24_2MBPS);
      radio.enableAckPayload();
      //radio.openReadingPipe(1, pipe1);
      radio.openReadingPipe(1, pipe);
      Serial.begin(115200);
    //pinMode(LEDpin1, OUTPUT);
    //pinMode(LEDpin2, OUTPUT);
    //pinMode(LEDpin3, OUTPUT);
    }

    void loop(void)
    {

    //digitalWrite(LEDpin3, HIGH);
    if (radio.available())
    //Serial.println("LreadinH");

    {
      radio.read(&msg,sizeof( msg));
    if(msg == 111)
    {
    delay(10);
    Serial.println("LEDpin1, HIGH");
    }
    else {
    Serial.println("LEDpin1, LOW");
    }
    delay(10);
    if(msg == 112){
    delay(10);
    Serial.println("LEDpin2, HIGH");
    }
    else {
    Serial.println("LEDpin2, LOW");
    }
    delay(10);
    }
    }
     


    Попробуйте эти(проверьте пины ce i csn я их поменял под свои платы)
    остальное printf(у меня виснет через день, если он включен но пишет вникуда), DataRate and payloadsize поменяете по вкусу когда запустите
    ледов у меня нет, так что ловил показания в сериал порте
    связку
    Код (Text):
    bool done = false;
    while (!done){
    done = radio.read(msg,1);
    тоже зачем то выкинул, без нее тоже ловит(вокруг 2 шкета крутятся, работать не дают совершенно)
     
    Последнее редактирование: 1 апр 2015
  6. Инженер

    Инженер Нерд

    По моему категорически неверная философия. У вас передатчик засыпает посылками приемник без всяких тормозов пока нажата кнопка а приемник получает одну посылку и уходит в паузу на 10мс тем временем передатчик что делает? Он еще посылок 10 отправить успеет (или нет... лень считать сколько времени он потратит на авто повторы) Короче делай так код передатчика
    Код (Text):
    #include <SPI.h>
    #include "RF24.h"
    #include "nRF24L01.h"
    int msg[1];

    RF24 radio(9,53);


    const uint64_t pipe = 0xE8E8F0F0E1LL ;
    int LED = 5;
    int buttonPin1 = 2;
    int buttonPin2 = 3;

    void setup(void)
    {

    radio.begin();
    radio.powerUp();
    radio.setDataRate(RF24_1MBPS);
    radio.setChannel(120);
    radio.setRetries(15,15);
    radio.setPayloadSize(1);
    radio.openWritingPipe(pipe);
    pinMode(LED, OUTPUT);
    }

    void loop(void)
    {


    if (digitalRead(buttonPin1) == HIGH){
    msg[0] =111;
    digitalWrite(LED,HIGH);
    radio.powerUp(); // разбудить передатчик
    delay(2); // Чтобы передатчик успел проснуться
    radio.write(msg, 1); // да тут предатчик тоже разбудят но пауза после сна слишком мала и передатчик может чудить
    delay(20); // ибо нефиг засыпать спамом приемник
    }
    if (digitalRead(buttonPin2) == HIGH){
    msg[0] =112;
    digitalWrite(LED,HIGH);
    radio.powerUp(); // разбудить передатчик
    delay(2); // Чтобы передатчик успел проснуться
    radio.write(msg, 1); // да тут предатчик тоже разбудят но пауза после сна слишком мала и передатчик может чудить
    delay(20); // ибо нефиг засыпать спамом приемник
    }
    }
    Код приемника можешь тот оставить но я бы задержки там стер

    вообще код кривой. нужно определять момент первого нажатия и момент отпускания и только тогда команды слать. таким образом будет 2 команды на каждую кнопку - кнопка нажата кнопка отпущена. но для теста и этот код сгодится
    А еще лучше определить состояние кнопок, сохранить в регистре и каждый раз проверять изменилось состояние, если изменилось отправлять это состояние. Например data=0 если нажата кнопка 1 data+_BV(1); если нажата кнопка 2 data+_BV(2) если data!=prev отправить data и prev=data. А на приемнике если msg[0]&_BV(1)==1 зажечь светодиод иначе потушить. для второй кнопки условие msg[0]&_BV(2)==1
     
    Последнее редактирование: 2 апр 2015
    Lagvin нравится это.
  7. zaynus

    zaynus Нерд

    честно сказать не заморачивался о логике работы всего кода, собрал лишь бы чтото сыпалось.
    сразу вопросик
    int msg[1]; и radio.setPayloadSize(1); конфликтовать не будут?
    вроде инт 2 байта, а посылку кидаем 1 байт?
     
  8. Инженер

    Инженер Нерд

    Вроде не должно а проблема то в чем, сделай Char, byte или как там у вас обозначается, вообще не понимаю зачем вы int везде написали...

    Кто нибудь с majordomo работал?
     
    Последнее редактирование: 2 апр 2015
  9. zaynus

    zaynus Нерд

    тоже собираюсь, пока думаю, что выбрать majordomo, openhab или чтото еще
     
  10. Lagvin

    Lagvin Нерд

    Победа! работает без проблем на старом коде.
    Причина неисправности была в железе использовал стабилизатор напряжения
    [​IMG]
    вход 5в с планшетного зарядника 2А., выход отрегулировал на 3,3В. Тестером померял - и точно DC -3,3в.
    AC - 1.5В добавил конденсатор 0,5мФ. - АС вышло в ноль. Все вроде нормально, но на тесте плата nRF24L01+ выдавала POWER LOW. под рукой батареек не оказалось, кроме CR2032, но ее не хватает. Запитал с ардуиновских выходов 3,3В. и все заработало. Четкий и стабильный сигнал. Без антены уходил через два здания метров на 100. сбоя не было. Проверю на максимальное расстояние отпишусь, СПАСИБО всем, кто откликнулся, Инженеру отдельно, попробую все что накидал.
    Все ухожу разбираться с SIM800L GSM
     
  11. Stanik

    Stanik Нуб

    Всем привет! При тестировании nRF24L01+ выдает это:
    скрин.jpg
    Регистры вообще не програмируются. Подключено все правильно несколько раз перепроверял.
    Питание пробовал различное, от дуины, батареек, стабилизатора внешнего. Результат один.
    В чем может быть причина?
     
  12. zaynus

    zaynus Нерд

    А скетч можно глянуть?
     
  13. Stanik

    Stanik Нуб

    Код (Text):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"

    RF24 radio(9, 10); // Для Уно
    //RF24 radio(9,53);// Для Меги
    const uint8_t num_channels = 128;
    uint8_t values[num_channels];
    void setup(void)
    {
      Serial.begin(9600);
      printf_begin();
      radio.begin();
      radio.setAutoAck(false);
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_MAX);
      radio.setChannel(100); //тут установка канала
      radio.setCRCLength(RF24_CRC_16);
      radio.setRetries(15,15);
      radio.openWritingPipe(0xF0F0F0F0E1LL);
      radio.openReadingPipe(1,0xF0F0F0F0D2LL);
      radio.startListening();

      radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
      delay(5000);              // И посмотрим на это пять секунд.

      radio.stopListening();
      int i = 0;    // А это напечатает нам заголовки всех 127 каналов
      while ( i < num_channels )  {
        printf("%x", i >> 4);
        ++i;
      }
      printf("\n\r");
      i = 0;
      while ( i < num_channels ) {
        printf("%x", i & 0xf);
        ++i;
      }
      printf("\n\r");
    }
    const int num_reps = 100;

    void loop(void)
    {
      memset(values, 0, sizeof(values));
      int rep_counter = num_reps;
      while (rep_counter--) {
        int i = num_channels;
        while (i--) {
          radio.setChannel(i);
          radio.startListening();
          delayMicroseconds(128);
          radio.stopListening();
          if ( radio.testCarrier() )
            ++values[i];
        }
      }
      int i = 0;
      while ( i < num_channels ) {
        printf("%x", min(0xf, values[i] & 0xf));
        ++i;
      }
      printf("\n\r");
    }
    int serial_putc( char c, FILE * ) {
      Serial.write( c );
      return c;
    }

    void printf_begin(void) {
      fdevopen( &serial_putc, 0 );
    }
     
  14. zaynus

    zaynus Нерд

    duino_rf24.PNG
    Моя вот что выдает с вашим скетчем
     
  15. Stanik

    Stanik Нуб

    Из-за бракованного nRF24L01+ может такое быть? Или в таком случае она вообще не должна ничего отвечать?
     
  16. zaynus

    zaynus Нерд

    Чип точно nrf выше в ветке были разговоры про подделку выглядит так же но чип другой.
    Printf полюбому будет чтото выводить
    (тот же скетч, но без ce and csn pin, физически отключены)
    duino_rf24_2.PNG
     
  17. Stanik

    Stanik Нуб

    чип я проверил на нем точно написано nRF24L01+. Нужно будет прикупить новый и проверить((
     
  18. AlR46

    AlR46 Нуб

    Плиз подскажите, что я делаю не так.
    Имеется 2 штуки арудино DUE и несколько модулей NRF24, подключал два к разным дуинам, библиотека эта https://github.com/tmrh20/RF24
    Подключено к аппаратному SPI
    Передатчик
    Код (Text):
    #include <SPI.h>
    #include "RF24.h"

    RF24 radio(12,11);

    const uint64_t pipe00 = 0xE8E8F0F0E2LL;
    const uint64_t pipe01 = 0xE8E8F0F0A2LL;

    int out = 5;
    int sz = 2;

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

      Serial.println("START");
      radio.begin();

      radio.setDataRate(RF24_250KBPS);
      radio.setPayloadSize(sz);

      radio.openWritingPipe(pipe00);
      radio.stopListening();
    }

    void loop() {
      // put your main code here, to run repeatedly:
      radio.write(&out, sizeof(out));
    }
    Приемник
    Код (Text):
    #include <SPI.h>
    #include "RF24.h"

    RF24 radio(12,11);

    const uint64_t pipe00 = 0xE8E8F0F0E2LL;
    const uint64_t pipe01 = 0xE8E8F0F0A2LL;

    int in;
    int sz = 2;
    void setup() {
      Serial.begin(57600);

      Serial.println("START");
      radio.begin();

      radio.setDataRate(RF24_250KBPS);
      radio.setPayloadSize(sz);

      radio.openReadingPipe(1,pipe01);
      radio.startListening();
    }


    void loop() {
                      //Переменная для приема информации;
        if( radio.available()){
          radio.read(&in,sizeof(in));            // по адресу переменной in функция записывает принятые данные;
          Serial.println(in);
          Serial.println(radio.getPayloadSize());
      }
    }
    Уже всю голову сломал. Кондер подпаивал на 100 микрофарат 16 вольтовый.
    на выходе в приемнике выдает такую картинку

    32512эSTART
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    32768
    2
    128
     
    Последнее редактирование: 11 апр 2015
  19. geher

    geher Гуру

    Может быть слишком быстро данные отправляются в передатчик?
    Если поставить в коде передатчика в loop небольшую задержку, чтобы гарантировать, что передатчик успел все отправить?

    Помнится, с другим приемопередатчиком (APC 220) тоже словил непонятное функционирование, когда случайно начал загонять в него данные со слишком большой скоростью.
     
  20. zaynus

    zaynus Нерд

    Мне кажется, что передатчик пишет не в ту трубу, которую читает приемник.
    Зачем Вам Serial.println(radio.getPayloadSize());, мне кажется строка должна возвращать текущий размер буфера, а не его содержимое. Хватает radio.read(&in,sizeof(in));
    Некоторые девайсы могут не работать на 256 kB
    Мне все кажется....(с вашей библиотекой не работал)