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

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

  1. parovoZZ

    parovoZZ Гуру

    Прерывание сбрасывается вычитыванием статус-регистра.
     
  2. zaynus

    zaynus Нерд

    У меня вот так attachInterrupt(0, check_radio, FALLING);
     
  3. Oleg_7

    Oleg_7 Гик

    делаю еще такой сброс
    Код (C++):
    radio.maskIRQ (1,1,1);
    , но не работает...
     
  4. Oleg_7

    Oleg_7 Гик

    и все работает, прерывание перезапускается? а можно код ф-ции прерывания посмотреть?
     
  5. parovoZZ

    parovoZZ Гуру

    Как там в библиотеке устроено не помню, но вот тупо сдернул с малины обработчик
    Код (C++):
    void intHandler()
    {
        uint8_t pipe_num=0;
        uint8_t Buf[nRF_SEND_LEN];
        bool tx_ok, tx_fail, rx;

        radio.whatHappened(tx_ok, tx_fail, rx);

        if (radio.available(&pipe_num)){
            memset(Buf, 0, nRF_SEND_LEN);
            radio.read(Buf, nRF_SEND_LEN);


            switch (Buf[0]){

                case 222:
                getWeather(Buf);
                break;
        }
               
        radio.stopListening();
        radio.startListening();

        }
    }
    Это не сброс. Это установка маски прерываний.
     
  6. Oleg_7

    Oleg_7 Гик

    спасибо, попробую по аналогии сделать
     
  7. parovoZZ

    parovoZZ Гуру

    Это установка прерывания в МК. к nRF не имеет отношения.
     
  8. Добрый вечер всем! Не знаю, может тут уже такое проходили, а вот есть у кого-нибудь пример связи nRF24L01 как передатчик, и nRFLE1 как приёмник? Заранее спасибо.
     
  9. parovoZZ

    parovoZZ Гуру

    здесь никто не работает. Смысла нет - связка дешманский 8 бит МК + nRF24L01 дешевле и функциональнее.
     
  10. Очень жаль что никто не работает, функционала мне как раз от nRF24LE1 хватает, в приёмнике использую его из-за его малых размеров, а передатчик можно и на МК+nRF24L01...
     
  11. parovoZZ

    parovoZZ Гуру

    ну так если разобрались с внутренней периферией, то что мешает самостоятельно написать программу? Регистры трансивера там практически одинаковые.
     
  12. Да вот что-то никак не получается подружить L01 и LE1, уже всё перепробовал. L01 и L01, как и LE1, между собой хорошо работают. Просто может что неправильно делаю, хотя настройки одинаковые. Подскажите, может есть какой нюанс, может правда не заметил чего.
     
  13. parovoZZ

    parovoZZ Гуру

    не, я не работал. Почитал дашик, посмотрел цены - решил, что оно мне не нужно.
     
  14. indevor

    indevor Нуб

    Заметка для победителей: не используйте setCRCLength(RF24_CRC_8), если вам нужно долго передавать последовательно данные, только setCRCLength(RF24_CRC_16) - кому любопытно на передатчике сделайте счетчик unsigned long counter; counter++, на приёмнике смотрим в порт доскольки досчитает - црц16 на голову стабильнее.
    Причем: если ошибок crc накопится n-ное кол-во модуль - принимает данные, но толи виснет сам проц нрф толи данные бьются полностью -

    Код (C++):

    if (radio.available(&pipeNo)) {
        radio.writeAckPayload(pipeNo, &telemetry, sizeof(telemetry) );
        if (radio.getDynamicPayloadSize() > 1) {
    -- будет true если много ошибок crc было, но данные не придут или будут битые в случаи со счетчиком будет последнее значение, данные не будут увеличиваться
    возмножно просто не очень ровная копия нрфки... но тем немение стоит учитывать это.
    Код (C++):
    void radioListen() {
    // формируем пакет данных телеметрии (напряжение АКБ, скорость, температура...)
      telemetry[0] = 10;
      telemetry[1] = 20;
     
      if (radio.available(&pipeNo)) {
        radio.writeAckPayload(pipeNo, &telemetry, sizeof(telemetry) );
        if (radio.getDynamicPayloadSize() > 1) { //размер полученного сообщения
          radio.read(&recieved_data, sizeof(recieved_data));

    lcd.setCursor(0,0);
    lcd.print(recieved_data[0]);
    lcd.setCursor(0,1);
    lcd.print(recieved_data[1]);
    lcd.setCursor(0,2);
    lcd.print(recieved_data[2]);
    lcd.setCursor(0,3);
    lcd.print(recieved_data[3]);

       
        }
        else {
           lcd.clear();
           lcd.setCursor(0,0);
           lcd.print("error");
        }
     
      } else {
           lcd.clear();
           lcd.setCursor(0,0);
          lcd.print("no signal");
             }
    }
    линк для любопытных: https://habr.com/post/278171/
     
    Последнее редактирование: 16 ноя 2018
  15. indevor

    indevor Нуб

    Добрый, вам удалось завести тини85 и нрф24 по 3 пиновой схеме? У меня таже проблема. Пока сижу на 4 пинах...
    Были использованы: биюлиотека- tmrh20, 1к, 22к рез. 0.1 0.01 + конд. по питанию нрфа-кондер + тантал на печатке.
    2 версии печатки - с большим земляным полигоном и без. Причем обе рабочие даже с обвесом (диод кандер резак) завелись на 4 пинах - 1 провод кинул на 3 ногу тини и конфиг поменял.. на трех пинах никак...(

    [​IMG]

    я думаю вот тут нужно шаманство:

    Код (C++):
    void RF24::csn(bool mode)
    {

    #if defined (RF24_TINY)
        if (ce_pin != csn_pin) {
            digitalWrite(csn_pin,mode);
        }
        else {
            if (mode == HIGH) {
                PORTB |= (1<<PINB2);      // SCK->CSN HIGH
                delayMicroseconds(100); // allow csn to settle.
            }
            else {
                PORTB &= ~(1<<PINB2);    // SCK->CSN LOW
                delayMicroseconds(11);  // allow csn to settle
            }
        }
        // Return, CSN toggle complete
        return;
     
    Последнее редактирование: 16 ноя 2018
  16. parovoZZ

    parovoZZ Гуру

    Он никогда не виснет. Там нет проца. Просто надо даташит очень внимательно читать. Есть пара ситуаций, когда передатчик ждет действия от управляющего МК и отказывается что-либо делать.
     
  17. indevor

    indevor Нуб

    определенно нужно тем, кто понимает неплохо английский и тем паче техническую составляющую терминов.
    в данном случаи передатчик шлет исправно, если сделать ресет приемнику данные продолжат идти.
    Это было просто наблюдение, не воспринимайте как "я все понял" )
     
  18. indevor

    indevor Нуб

    3 пиновый вариант заработал - tiny85 - 8Mhz, резистор 1к конденсатор 1 мкф - полярный электролит - минус на минус, плюс на пин (возможно более быстрая керамика работать будет тоже, но такой не оказалось). Тайминги у меня такие:
    Код (C++):
    #if defined (RF24_TINY)
        if (ce_pin != csn_pin) {
            digitalWrite(csn_pin,mode);
        }
        else {
            if (mode == HIGH) {
                PORTB |= (1<<PINB2);      // SCK->CSN HIGH
                delayMicroseconds(87); // allow csn to settle.
            }
            else {
                PORTB &= ~(1<<PINB2);    // SCK->CSN LOW
                delayMicroseconds(11);  // allow csn to settle
            }
        }
        // Return, CSN toggle complete
        return;
    ну и пичаль небольшая тут же в библиотеке:
    Код (C++):
    #if defined (RF24_TINY) || defined (LITTLEWIRE)
      // for 3 pins solution TX mode is only left with additonal powerDown/powerUp cycle
      if (ce_pin == csn_pin) {
        powerDown();
        powerUp();
      }
      #endif
    я так понимаю что при передаче он передергивает питание? модулю.... поэтому вот такой код плохо работает
    Код (C++):
    void loop() {
      // забиваем transmit_data данными, для примера
      transmit_data[0] = 10;
      transmit_data[1] = 20;
      transmit_data[2] = rssi;
       transmit_data[3] = counter;
      if (radio.write(&transmit_data, sizeof(transmit_data))) {    // отправка пакета transmit_data
           trnsmtd_pack++;
        if (!radio.available()) {                                  // если получаем пустой ответ
        } else {
                            // если в ответе что-то есть
            radio.read(&telemetry, sizeof(telemetry));    // читаем
            // получили забитый данными массив telemetry ответа от приёмника
          }
      } else {
        failed_pack++;
      }
      if (millis() - RSSI_timer > 1000) {    // таймер RSSI
           // расчёт качества связи (0 - 100%) на основе числа ошибок и числа успешных передач
          // сбросить значения
        failed_pack = 0;
        trnsmtd_pack = 0;
        RSSI_timer = millis();
       rssi = 0;
      }
       rssi = (1 - ((float)failed_pack / trnsmtd_pack)) * 100;
    counter++;
    }
    т.е RSSI прыгает потом в 0 уходит.. либо trnsmtd_pack уходит в ноль из-за сброса либо failed_pack, что не наблюдается на 4 пиновом варианте, где все работает как надо.

    и скорость передачи в разы медленнее, что естественно, если на 4 пинах приемник считает 100 (сотыми) счетчик, то на 3, едва 10 (десятыми). Т.е я так понимаю ему нужно отработать все тайминги + передернуть питание.
    ток потребление 3 пин - 14.56ma, 4 пин 12.5ma
     
    Последнее редактирование: 16 ноя 2018
  19. indevor

    indevor Нуб

    Вопрос к мастерам кода: как в библиотеке указать к примеру:
    Код (C++):
    #if defined (TINY85_3PIN)
    if (ce_pin != csn_pin) {
            digitalWrite(csn_pin,mode);
        }
        else {
            if (mode == HIGH) {
                PORTB |= (1<<PINB2);      // SCK->CSN HIGH
                delayMicroseconds(87); // allow csn to settle.
            }
            else {
                PORTB &= ~(1<<PINB2);    // SCK->CSN LOW
                delayMicroseconds(11);  // allow csn to settle
            }
        }
        // Return, CSN toggle complete
        return;
    #endif
    что бы в скетче потом сделать указатель что это конфигурация на 3 пин - TINY85_3PIN и исполнился блок #if defined (TINY85_3PIN) в библиотеке?
     
  20. parovoZZ

    parovoZZ Гуру

    есть прекрасный перевод. Ссылку не помню.