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

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

  1. parovoZZ

    parovoZZ Гуру

    У меня работает. У меня два варианта - с экраном и без. Оба передают, оба принимают. Тут надо искать причину в другом - во внешних условиях и в программе.
     
  2. Ivanii

    Ivanii Нуб

    Скетчи тестовые GettingStarted от RF24.h.
    Без усилителя и внешней антенны вроде работают нормально а вот с усилителем колбасит все.
    Методом перестановок выяснил, что глючит модуль ответчик(R) и только если с усилителем...

    Пошел либы и тесты из под видео смотреть.
     
    Последнее редактирование: 8 дек 2018
  3. parovoZZ

    parovoZZ Гуру

    там фуфло все. При иниицилизации необходимо прописывать абсолютно все регистры.
     
  4. Ivanii

    Ivanii Нуб

    А либа этого по умолчанию не делает???
     
  5. А либо рассчитана на настоящий nrf24, а не китайский.
     
    parovoZZ нравится это.
  6. parovoZZ

    parovoZZ Гуру

    мы говорили про примеры, не? Либа сюда как приросла?
     
  7. Ivanii

    Ivanii Нуб

    Пример без либ работает? Нормальная библиотека должна не заданные параметры инициализировать значениями по умолчанию иначе при реинициализации в регистрах останутся неизвестные значения.
     
  8. parovoZZ

    parovoZZ Гуру

    ничего она не должна
    кто такое сказал?
    поэтому их и надо вручную инициализировать. Китайские клоны nRF не содержат в регистрах значения по умолчанию. В этой ветке это обсуждалось. Это не то место, где надо экономить на коде. Если хочется экономить на коде, то прямой путь к отказу от всяких абдурин. У меня инициализация выглядит примерно так:
    Код (C++):

     uint8_t nRF_Dummy_Init(uint8_t channel)
     {
        uint8_t Buf[5];

        nRF_CE_DDR |= (1<<nRF_CE);// | (1<<PINB2);
        nRF_CE_PORT |= (0<<nRF_CE);// | (1<<PINB2);


        Buf[0] = (0<<nRF_PRIM_RX) | (1<<nRF_EN_CRC) | (0<<nRF_CRCO) | (0<<nRF_PWR_UP);    // Проверка CRC разрешена, 1 байт CRC, режим передачи
        SPI_WriteArray(nRF_WR_REG(nRF_CONFIG), 1, Buf);

        nRF_SELECT();                            // Инициируем общение - держим пин CSN весь сеанс общения,
                                        // иначе трансивер всегда будет возвращать регистр статуса
        SPI_WriteByte(nRF_RD_REG(nRF_CONFIG));                    // Читаем, что записали
        Buf[1] = SPI_ReadByte(nRF_NOP);

        nRF_DESELECT();


        if (!(Buf[0] == Buf[1]))                        // Если не совпадает
        {
            return 1;                            // то выходим из функции
        }

        Buf[0] = channel;
        SPI_WriteArray(nRF_WR_REG(nRF_RF_CH), 1, Buf);            // Установка частоты канала передачи

        Buf[0] = nRF_SEND_LEN;
        SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P0), 1, Buf);        // Длина передаваемых данных

        SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P1), 1, Buf);

        Buf[0] = 0;
        SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P2), 1, Buf);
        SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P3), 1, Buf);
        SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P4), 1, Buf);
        SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P5), 1, Buf);

        Buf[0] = (0<<nRF_RF_DR) | ((0x03)<<nRF_RF_PWR0);            // Скорость передачи 1 Mbps, мощность: 0dbm
        SPI_WriteArray(nRF_WR_REG(nRF_RF_SETUP), 1, Buf);

        Buf[0] = (1<<nRF_ENAA_P0)|(1<<nRF_ENAA_P1)|(0<<nRF_ENAA_P2)|(0<<nRF_ENAA_P3)|(0<<nRF_ENAA_P4)|(0<<nRF_ENAA_P5);
        SPI_WriteArray(nRF_WR_REG(nRF_EN_AA), 1, Buf);          

        Buf[0] = (1<<nRF_ERX_P0)|(1<<nRF_ERX_P1)|(0<<nRF_ERX_P2)|(0<<nRF_ERX_P3)|(0<<nRF_ERX_P4)|(0<<nRF_ERX_P5);
        SPI_WriteArray(nRF_WR_REG(nRF_EN_RXADDR), 1, Buf);        // Разрешаем RX адреса

        //Buf[0] = (0x04<<nRF_ARD0)|(0x0F<<nRF_ARC0);                // Автоповтор:  15 попыток через 1000 us;
        //SPI_WriteArray(nRF_WR_REG(nRF_SETUP_RETR), 1, Buf);

        Buf[0] = (0<<nRF_DPL_P0)|(0<<nRF_DPL_P1)|(0<<nRF_DPL_P2)|(0<<nRF_DPL_P3)|(0<<nRF_DPL_P4)|(0<<nRF_DPL_P5);
        SPI_WriteArray(nRF_WR_REG(nRF_DYNPD), 1, Buf);

        Buf[0] = 0x11;                                //адрес канала
        Buf[1] = 0x11;
        Buf[2] = 0x11;
        Buf[3] = 0x11;
        Buf[4] = 0x11;
        SPI_WriteArray(nRF_WR_REG(nRF_RX_ADDR_P0), 5, Buf);//адрес канала для приема ответа

        SPI_WriteArray(nRF_WR_REG(nRF_TX_ADDR), 5, Buf);    // Адрес канала для передачи
         
        Buf[0] = nRF_REPEAT_INTERVAL | nRF_REPEAT_MAX;        //интервал автоповтора и количество попыток
        SPI_WriteArray(nRF_WR_REG(nRF_SETUP_RETR), 1, Buf);

        return 0;
    }
     
     
    Последнее редактирование: 9 дек 2018
  9. Ivanii

    Ivanii Нуб

    Спасибо, буду разбираться.
     
  10. Wolferio

    Wolferio Нуб

    Добрый вечер. Тему читал правда не всю. Есть 3 передатчика и 1 приемник (NRF24L01) (реализовал беспроводные сигнализаторы поклевки на рыбалку)- все работает данные передаются и принимаются. Но есть одно "НО" - сигнал работает в пределах 5-10 метров, дальше практически все 3 передатчика не тянут (тем более на открытой местности, где нет никаких помех). Подскажите как увеличить дистанцию сигнала, в чем может быть причина?, знаю что для таких передатчиков это ничтожно малое расстояние. Заранее благодарен.
     
    Последнее редактирование: 20 дек 2018
  11. parovoZZ

    parovoZZ Гуру

    Ну ты же купил отбраковку по дешману на али по цене оригинальной микросхемы. У оригинальной микры выходная мощность 1 мВт. Какая мощность у отбраковки - только гадать. Ну и наверняка с питанием касяки))
     
  12. ImrDuke

    ImrDuke Гик

    Конденсаторы на входе по питанию припаивали?
    Модули к МК припаяны или на разъемах?
     
  13. Wolferio

    Wolferio Нуб

    Конденсаторы на входе по питанию припаивали? - да конденсаторы припаяны.
    Модули к МК припаяны или на разъемах? - все 3 паяные, кроме приемника, приемник вместе с ардуиной на плате на разъемах.
    Питание там и там отдельное не от ардуины.
     
    Последнее редактирование: 20 дек 2018
  14. Eduard-VIII

    Eduard-VIII Нуб

    Ребят, подскажите инвалиду элементарный код. В теме нашел примерно похожий, но не получается.
    Приёмник nRF1 принимает из гаража integer от такой же nRF2-передатчика. Выводит на LCD1602 значение 0-1023, и состояние двух реле (на .nRF2). Это получается.
    Один раз в неделю нужно приёмник перевести на передачу, а передатчик на приём, изменить состояние реле и снова встать на приём первой НРФкой. Это никак не выходит. Может мозги совсем вытекли после инсульта?
     
  15. parovoZZ

    parovoZZ Гуру

    а есть что-то, что сможет отсчитать 604 800 секунд?
     
  16. Eduard-VIII

    Eduard-VIII Нуб

    Вы немного не поняли. Перевести приёмник в режим передатчтка, а передатчик в приёмник нужно вручную.
    Короче, приёмник, помимо основной задачи (приёма переменной) - это дистанционный тумблер.
    Т.е. включил тумблер на приёмнике (ON) - реле на передатчике влючилось и остаётся включенным, пока на приёмнике тумблер не выключу. Выключил в хате на приёмнике тумблер (OFF) -на передатчике реле выключилось - ждёт сигнала на включение, а приёмник переменную принимает постоянно.
     
  17. ImrDuke

    ImrDuke Гик

    Я сделал что все устройства приемники. Когда надо, один что то передает, остальные слушают и если в пакете находят свой ID, то выполняют инструкцию.
     
  18. Eduard-VIII

    Eduard-VIII Нуб

    Если НРФка умеет и принимать и передавать, неужели для моей задачи - дистанционный тумблер на приёмнике и передача переменной с передатчика - нужно 4 модуля?
    Если задача для Вас смешная - не смейтесь, подскажите, пожалуйста.
     
  19. parovoZZ

    parovoZZ Гуру

    В регистре CONFIG необходимо установить бит PRIM_RX. После поднятия ноги CE трансивер переходит в режим приемника. О полученном пакете можно узнать по выставленному биту RX_DR в регистре STATUS. Вычитывается полученный пакет командой R_RX_PAYLOAD.
     
  20. Eduard-VIII

    Eduard-VIII Нуб

    Сформулирую понятнее. С ардуиной недавно, в программировании слаб.
    Хлопнул инсульт. В гараж ходить тяжело. Делаю дистанционный тумблер, включающий-выключающий 2 контактора в гараже. Приёмник дома. На него приходит переменная. Этот же приёмник должен на мгновение переключится в режим передачи, а передатчик превратить в приёмник, назначить состояние пинов и вернуться в режим приёма
    Нужен кусочек кода, который при условии на приёмнике
    if(digitalRead(aPin) == LOW)
    выполнит условии на передатчике
    digitalWrite(Relay1, LOW);
    а потом вернуть приёмник на приём, а передатчик на передачу.
    Одной рукой и оставшейся после ОНМК частью мозгов сделал себе на ардуине такой электрокар без посторонней помощи


    а такую фигню никак...
    Подскажите, пожалуйста.