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

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

  1. Gokry

    Gokry Нуб

    Ребят все в принципе работает, мб просто подскажите что лучше изменить-подправить ?
    Так важно включать сначала приемник а потом передатчик?
    "Передатчик" NANO+NRF24
    Код (C++):

    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    RF24 radio(9, 10); // (CE,SCN)
    const uint64_t direccion[4] = {0x7878787878LL, 0xB3B4B5B6F1LL, 0xB3B4B5B6CDLL, 0xB3B4B5B6A3LL };
    int ID = 0;// Задаем номер трубы для опроса
    int temp = 100;
    unsigned long prevTiempo = 0;
    static char GET[32]; // Сюда принимаем запрос
    char otvet[32]; // Сюда сохраняем ответ на запрос
    void setup() {
      delay(500); // Заряжаем кондей
      Serial.begin (9600);
      radio.begin();
      radio.setPALevel(RF24_PA_HIGH);
      radio.setChannel(100);
      radio.openReadingPipe(0, direccion[0]);
      radio.openReadingPipe(1, direccion[1]);
      radio.openReadingPipe(2, direccion[2]);
      radio.openReadingPipe(3, direccion[3]);
      Serial.print ("START SERVER");
    }

    void loop() {

      radio.stopListening();
      radio.openWritingPipe(direccion[ID]);
      radio.write( &ID, sizeof (ID) );
      Serial.print ("Send:");
      Serial.println (ID);
      radio.startListening();
      unsigned long started_waiting_at = millis();
      bool timeout = false;
      while ( ! radio.available() && ! timeout ) // 200мс для чтения данных

        if (millis() - started_waiting_at > 200 )
          timeout = true;
      memset(GET, 0, sizeof GET);  // Ну по идее очищаем массив
      if ( timeout ) {
        if (ID == 0)memset(GET, 0, sizeof GET);;
        if (ID == 1)memset(GET, 0, sizeof GET);;
        if (ID == 2)memset(GET, 0, sizeof GET);;  // Ну или лучше тут(что бы на верняка)
        if (ID == 3)memset(GET, 0, sizeof GET);;
      } else {

        radio.read( GET, sizeof(GET) ); //Читаем запрос
        Serial.println ("Read");
      }
      Serial.print ("Recived:"); // Пишем от кого приняли
      Serial.println (GET[0]);
      if ( GET[0] == '2' && GET[1] == 'G') { // Если пришло от 2 трубы и ключ G
        Serial.println ("ID-2 Key-G");
        Serial.println (GET);
        Serial.println ("Wait serial");
        Serial.println (GET[0]);
        while (Serial.available() == 0) {
        }
        GET[1] = '0';
        memset(GET, 0, sizeof GET);
        String Data = Serial.readString();
        Serial.println ("Serial OK");

        Data.getBytes(otvet, 32);
        radio.stopListening();
        radio.openWritingPipe(direccion[2]); // Тут вручну пишем куда отправлять
        radio.write( otvet, sizeof (otvet));
        Serial.println ("Write back OK");
        Serial.println (otvet);
        radio.startListening();
        Data = "";
      }
      if ( GET[0] == '2' && GET[1] == 'U') {
        Serial.println ("ID-2 Key-U");
        String UPD = ("UPDATE:""BALANCE:");
        Serial.println (UPD);
      }
      /*
        if ( ID == 1 && key == "G") {
        Serial.println ("ID-1 Key-G");
        }
        if ( ID == 1 && key == "U") {
        Serial.println ("ID-1 Key-U");
        }

        if ( ID == 2 && key == "G") {
        Serial.println ("ID-2 Key-G");
        }                                   пока не использую
        if ( ID == 2 && key == "U") {
        Serial.println ("ID-2 Key-G");
        }

        if ( ID == 3 && key == "G") {
        Serial.println ("ID-3 Key-G");
        }
        if ( ID == 3 && key == "U") {
        Serial.println ("ID-3 Key-U");
        }
      */

      memset(otvet, 0, sizeof otvet);
      ID++; // Увеличиваем номер трубы
      if (ID >= 4) ID = 0;
      delay (500);
    }
     
    "Приемник" NANO+RC522+NRF24+Nextion (без кода Nextion)
    Код (C++):

    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #define SS_NRF 8
    #define RST_NRF 7

    RF24 radio(RST_NRF, SS_NRF); //Пины радио CE CSN
    const uint64_t direccion[4] = {0x7878787878LL, 0xB3B4B5B6F1LL, 0xB3B4B5B6CDLL, 0xB3B4B5B6A3LL };
    int NUMB = 2; // Номер нашей трубы
    int ID;
    char GET[32]; // Массив для запроса информации о UID
    static char key[32]; // Массив для ответа на запрос о UID
    int terminal = 0;
    #include <MFRC522.h>
    #define SS_RFI 10
    #define RST_RFI 9

    MFRC522 rfid(SS_RFI, RST_RFI); // Пины RFID CE CSN
    MFRC522::MIFARE_Key keyy;
    byte UID[5];// Храним UID
    void setup(void) {
      delay(500); // Для заряда кондера
      Serial.begin(9600);
      radio.begin();
      radio.setRetries(15, 15);
      radio.setPALevel(RF24_PA_HIGH);
      radio.setChannel(100);
      radio.openReadingPipe(0, direccion[NUMB] );
      radio.startListening();
      rfid.PCD_Init();

      for (byte i = 0; i < 6; i++) {
        keyy.keyByte[i] = 0xFF;
      }
      Serial.println ("START TERMINAL");
    }

    void printDec(byte *buffer, byte bufferSize) {
      for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], DEC);
      }
    }
    void loop() {
      if (terminal == 0) {

        digitalWrite (SS_RFI, LOW);
        digitalWrite (SS_NRF, HIGH);  // Устанавливаем сигнал на пинах SPI

        Serial.println ("Wait CARD");
        if ( ! rfid.PICC_IsNewCardPresent())
          return;
        if ( ! rfid.PICC_ReadCardSerial())
          return;
        if (rfid.uid.uidByte[0] != UID[0] ||
            rfid.uid.uidByte[1] != UID[1] ||
            rfid.uid.uidByte[2] != UID[2] ||
            rfid.uid.uidByte[3] != UID[3] ) {
          Serial.println("A new card has been detected."); // Новая карта найдена

          for (byte i = 0; i < 4; i++) {
            UID[i] = rfid.uid.uidByte[i];
          }
          Serial.print("In dec: ");
          printDec(rfid.uid.uidByte, rfid.uid.size);
          Serial.println();
          terminal = 1; // Карта считана переходим в terminal 1

        }
        else Serial.println("Card read previously."); // Если приложенна таже карта.

        rfid.PICC_HaltA();
        rfid.PCD_StopCrypto1();
      }

      if (terminal == 1) { // Если считан UID
        digitalWrite (SS_RFI, HIGH);
        digitalWrite (SS_NRF, LOW);    // Меняем сигнал на пинах SPI

        radio.startListening();
        radio.read( &ID, sizeof (ID) );
        Serial.print ("Prin: ");  // Выводи какой ID приняли
        Serial.println (ID);
        if (ID == NUMB)  { // Сравниваем полученный ID с номером трубы
          radio.stopListening();
          char GET[32];
          String get = (String(NUMB) + "GET: " + String (UID[0]) + String (UID[1]) + String (UID[2]) + String (UID[3])); //формируем строчку с ключем "G"
          get.getBytes(GET, 31);
          radio.openWritingPipe(direccion[NUMB] ); //Открываем трубу для отправки
          radio.write(GET, strlen (GET)); // Отправляем строчку с ключем и UID
          Serial.print ("Otpravil: ");
          Serial.println ();
          terminal = 2; // Идем в terminal 2
        }
      }
      if (terminal == 2) {
        radio.startListening();              
        while (radio.available() ) {          

          radio.read( key, sizeof(key) ); // Принимаем ответ на запрос
          Serial.println("Read");
        }
        Serial.println("Received");
        Serial.println(key[0]);

        if ( key[0] == 'N') { // Проверяем ответ какой ключ
          memset(GET, 0, sizeof GET);
          Serial.println (key);   // Отправляем в сериал
          Serial.println ("Key-N");
          while (Serial.available() == 0) { // Ждем измененных данных
            Serial.println ("Waite Serial");
          }
          String Data = Serial.readString();
          Serial.println (Data);
          Serial.println ("Serial OK");
          radio.stopListening();
          radio.openWritingPipe(direccion[ID]);
          radio.write( &Data, sizeof (Data));
          Serial.println ("Write back OK");
          radio.startListening();
          Data = "";
          terminal = 0; // Идем считывать карту
        }

      }
    }
     
    Последнее редактирование: 8 авг 2018
  2. parovoZZ

    parovoZZ Гуру

    Ты про режимы nrf24? Без разницы. Главное сразу после подачи питания выждать 100 мс, чтобы нрфка очухалась, а потом уже работай как хочешь. И в режиме передачи дольше 4 мс передатчик включённым не держать.
     
  3. Gokry

    Gokry Нуб

    Если я включаю сначала ардуинку с первым кодом, а потом со вторым то работает через раз, а если я включаю сначала вторую а потом первую то все сразу работает
     
  4. parovoZZ

    parovoZZ Гуру

    Такого быть не должно. Ищи ошибку с адресацией труб.
     
  5. forfrends

    forfrends Нерд

    Всем привет! Столкнулся со странностью: не полностью приходят отправленные данные.
    Вот часть кода передатчика:
    Код (C++):
    data[12] = digitalRead(button1); // инвертированный (!) сигнал с кнопки
      data[13] = digitalRead(button2); // инвертированный (!) сигнал с кнопки
      data[14] = digitalRead(button3); // инвертированный (!) сигнал с кнопки
      data[15] = digitalRead(button4); // инвертированный (!) сигнал с кнопки
      data[16] = digitalRead(button5); // инвертированный (!) сигнал с кнопки
      data[17] = digitalRead(button6); // инвертированный (!) сигнал с кнопки
      //data[14] = map(analogRead(slider), 0, 1023, 0, 255);//слайдер на мосфет
     
      i = analogRead(pote0);
      data[0] = map(i,0,1023,0,255);
      i = analogRead(pote1);
      data[1] = map(i,0,1023,0,255);
      i = analogRead(pote2);
      data[2] = map(i,0,1023,0,255);
      i = analogRead(pote3);
      data[3] = map(i,0,1023,0,255);
      i = analogRead(pote4);
      data[4] = map(i,0,1023,0,255);
      i = analogRead(pote5);
      data[5] = map(i,0,1023,0,255);
      i = analogRead(pote6);
      data[6] = map(i,0,1023,0,255);
      i = analogRead(pote7);
      data[7] = map(i,0,1023,0,255);
      i = analogRead(pote8);
      data[8] = map(i,0,1023,0,255);
      i = analogRead(pote9);
      data[9] = map(i,0,1023,0,255);
      i = analogRead(pote10);
      data[10] = map(i,0,1023,0,255);
      i = analogRead(pote11);
      data[11] = map(i,0,1023,0,255);

      radio.write( data, sizeof(data) );// отправляем масив и указываем сколько байт пакет
      delay(50);
    Передатчик передает следующее:
    data[0] data[1] и т.д....
    208 59 69 25 10 12 18 21 72 16 223 223 1 1 0 0 0 1 0 0
    а приемник принимает вот это:
    208 59 69 25 10 12 18 21 72 16 0 0 0 0 0 0 0 0 0 0

    то есть приемник принимает только данные с data[0] по data[9] а дальше нет.
    Из-за чего такое может быть?
     
  6. проверьте значение
    radio.setPayloadSize(32); //размер пакета, в байтах
    в приемнике , возможно у вас там стоит меньшее число чем в передатчике
    а вообще было бы не плохо выложить оба кода
     
  7. forfrends

    forfrends Нерд

    Да в коде ничего особенного.
    Вот код передатчика:
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>

    #define CE_PIN 40
    #define CSN_PIN 42
    const uint64_t pipe = 0xF0F1F2F3F4LL;// Открываем трубу с идентификатором 0xF0F1F2F3F4LL для приема данных
    RF24 radio(CE_PIN, CSN_PIN); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)

    #define pote0 A0 // джостик 1движок
    #define pote1 A1 // джостик 2движок
    #define pote2 A2 // серво1 манипулятор
    #define pote3 A3 // серво2 манипулятор
    #define pote4 A4 // серво3 манипулятор
    #define pote5 A5 // серво4 манипулятор
    #define pote6 A6 // серво5 манипулятор
    #define pote7 A7 // серво6 манипулятор
    #define pote8 A8 // сарва1 камеры
    #define pote9 A9 // серва2 камеры
    #define pote10 A10 // джостик рулевое (х)ось (Y)реле
    #define pote11 A11 //
    byte data[18];//масив передачи даных
    //пины подключения блока 4 реле движок скоростя  
    int button1 = 2; // кнопка на 2 цифровом
    int button2 = 3;  // кнопка на 3 цифровом
    int button3 = 4;  // кнопка на 4 цифровом
    int button4 = 5;  // кнопка на 5 цифровом
    int button5 = 6;  // кнопка на 6 цифровом
    int button6 = 7;  // кнопка на 7 цифровом

    //int slider = A10; // движковый потенциометр на A10 аналоговом пине
    int i =0;

    void setup()
    {
      Serial.begin(9600);
      radio.begin();
       delay(2000);
      radio.setChannel(95); // выбираем канал от 0 до 126 – они имеют разную частоту
      radio.setDataRate(RF24_1MBPS);// Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS). При скорости 2 Мб/с, задействуются сразу два канала (выбранный и следующий за ним). (самая дальнобойная 250KBPS, но скорость меньше)
      radio.setPALevel(RF24_PA_HIGH); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
      radio.openWritingPipe(pipe);// открываем трубу на передачу.
      pinMode(button1, INPUT_PULLUP); // настроить пин кнопки
      pinMode(button2, INPUT_PULLUP); // настроить пин кнопки
      pinMode(button3, INPUT_PULLUP); // настроить пин кнопки
      pinMode(button4, INPUT_PULLUP); // настроить пин кнопки
      pinMode(button5, INPUT_PULLUP); // настроить пин кнопки
      pinMode(button6, INPUT_PULLUP); // настроить пин кнопки

    }

    void loop()  
    {
      data[12] = digitalRead(button1); // инвертированный (!) сигнал с кнопки
      data[13] = digitalRead(button2); // инвертированный (!) сигнал с кнопки
      data[14] = digitalRead(button3); // инвертированный (!) сигнал с кнопки
      data[15] = digitalRead(button4); // инвертированный (!) сигнал с кнопки
      data[16] = digitalRead(button5); // инвертированный (!) сигнал с кнопки
      data[17] = digitalRead(button6); // инвертированный (!) сигнал с кнопки
      //data[14] = map(analogRead(slider), 0, 1023, 0, 255);//слайдер на мосфет
     
      i = analogRead(pote0);
      data[0] = map(i,0,1023,0,255);
      i = analogRead(pote1);
      data[1] = map(i,0,1023,0,255);
      i = analogRead(pote2);
      data[2] = map(i,0,1023,0,255);
      i = analogRead(pote3);
      data[3] = map(i,0,1023,0,255);
      i = analogRead(pote4);
      data[4] = map(i,0,1023,0,255);
      i = analogRead(pote5);
      data[5] = map(i,0,1023,0,255);
      i = analogRead(pote6);
      data[6] = map(i,0,1023,0,255);
      i = analogRead(pote7);
      data[7] = map(i,0,1023,0,255);
      i = analogRead(pote8);
      data[8] = map(i,0,1023,0,255);
      i = analogRead(pote9);
      data[9] = map(i,0,1023,0,255);
      i = analogRead(pote10);
      data[10] = map(i,0,1023,0,255);
      i = analogRead(pote11);
      data[11] = map(i,0,1023,0,255);
       
            Serial.println(sizeof(data));
     
      radio.write( data,  sizeof(data));// отправляем масив и указываем сколько байт пакет
      delay(50);
    }
    Код приемника:
    Код (C++):
    int y = 0;
    int x = 0;
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include "HCPCA9685.h"
    #define  I2CAdd 0x40
    HCPCA9685 HCPCA9685(I2CAdd);
    const uint64_t pipe = 0xF0F1F2F3F4LL; // указываем идентификатор передачи, "труба"
    RF24 radio(40, 42); // указываем пины CE и CSN
    int data[20];
    int relay1 = 5; // реле на 22 цифровом
    int relay2 = 6; // реле на 23 цифровом
    int relay3 = 7; // реле на 24 цифровом
    int relay4 = 8; // реле на 25 цифровом
    int relay5 = 11; // реле на 30 цифровом
    int relay6 = 12; // реле на 31 цифровом

    int pot0=0;
    int pot1=0;
    int pot2=0;

    void setup(){
        radio.begin();
        Serial.begin(9600);
        delay(2000);
        radio.setChannel(95); // выбираем канал от 0 до 126 – они имеют разную частоту
        radio.setDataRate(RF24_1MBPS);    
        radio.setPALevel(RF24_PA_HIGH);  
        radio.openReadingPipe(1,pipe); // открываем первую трубу с идентификатором "pipe"
        radio.startListening(); // включаем приемник, начинаем слушать трубу
        HCPCA9685.Init(SERVO_MODE);
        HCPCA9685.Sleep(false);
        pinMode(relay1, OUTPUT); // настроить пин реле как выход
        pinMode(relay2, OUTPUT); // настроить пин реле как выход
        pinMode(relay3, OUTPUT); // настроить пин реле как выход
        pinMode(relay4, OUTPUT); // настроить пин реле как выход
        pinMode(relay5, OUTPUT); // настроить пин реле как выход
        pinMode(relay6, OUTPUT); // настроить пин реле как выход

    }
     
    void loop()  
    {
        if(radio.available())
        {
            radio.read(data,20);
            Serial.print(data[0]);
            Serial.print("  ");
       
            Serial.print(data[1]);
            Serial.print("  ");
           
            Serial.print(data[2]);
            Serial.print("  ");
       
            Serial.print(data[3]);
            Serial.print("  ");
       
            Serial.print(data[4]);
            Serial.print("  ");
       
            Serial.print(data[5]);
            Serial.print("  ");
           
            Serial.print(data[6]);
            Serial.print("  ");
       
            Serial.print(data[7]);
            Serial.print("  ");
       
            Serial.print(data[8]);
            Serial.print("  ");
           
            Serial.print(data[9]);
            Serial.print("  ");
       
            Serial.print(data[10]);
            Serial.print("  ");
       
            Serial.print(data[11]);
            Serial.print("  ");
       
            Serial.print(data[12]);
            Serial.print("  ");
           
            Serial.print(data[13]);
            Serial.print("  ");
       
            Serial.print(data[14]);
            Serial.print("  ");
       
            Serial.print(data[15]);
            Serial.print("  ");
           
            Serial.print(data[16]);
            Serial.print("  ");
       
            Serial.print(data[17]);
            Serial.print("  ");
       
            Serial.print(data[18]);
            Serial.print("  ");
       
            Serial.println(data[19]);
        }
    }
     
  8. parovoZZ

    parovoZZ Гуру

    Не имеет значения, если включено автоподтверждение.
     
  9. parovoZZ

    parovoZZ Гуру

    Надо инициализировать абсолютно все регистры.
     
  10. forfrends

    forfrends Нерд

    radio.setDataRate(RF24_2MBPS);
    radio.setCRCLength(RF24_CRC_8);
    radio.setPALevel(RF24_PA_MIN);
    radio.setChannel(102); // уствновка канала
    radio.setAutoAck(false); // - автоответ.
    radio.powerUp(); // включение или пониженное потребление powerDown - powerUp
    radio.openReadingPipe(1,pipe); // открыть канал на приём
    radio.startListening(); // приём

    Кроме этих, какие еще регистры нужно прописать?
     
  11. parovoZZ

    parovoZZ Гуру

    Все, какие есть в даташите. Кода под рукой нет, а так не помню.
     
  12. Noobeum

    Noobeum Нуб

    Драсти.

    Не люблю я эти модули, но время от времени ничего лучше них придумать не могу.
    Начну с того,что у меня ни на одном модуле с али (ну да, клоны, не оригинал) никогда не работал нормально printDetails, даже там где установлено соединение и данные передаются в обе стороны.
    Про конденсаторы и установление почти всех параметров как бы в курсе.

    Сейчас задач малость забавная. Пытаюсь запилить связку attiny85 от дигиспарк с рф24 модулем. Делал согласно "трехпиновому подключению" (можно нагуглить в прицнипе).
    На быстроразводной макетной плате (баребоард) даная схема функционирует успешно. Данные передаются (я передаю в одну сторону, принимает мега, принимает успешно).

    А вот распаять на pcb ту же схему мне пока не удалось. Дважды уже пытался и дважды не удалось. Питание идет через 1117 3в3 регулятор с 5в (там до ампера вроде бы). Используется типичная
    https://tmrh20.github.io/RF24/ATTiny.html
    там в числе прочего упрощенная софтварная спи-реализация, успешно работающиая с трехпиновым подключением.

    Вопрос в том - куда вообще говоря смотреть...
    Осцилографа нет.

    А пока пытаюсь припилить сериал к аттини, пока не очень успешно =(
    Идеи кончились...

    Код собсн...
    Код (C++):
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <RF24_config.h>



    #if defined (__AVR_ATtiny85__)
    #define CE_PIN 3
    #define CSN_PIN 3
    #endif

    #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__)
    #define CE_PIN 48
    #define CSN_PIN 49
    #endif


    RF24 radio(CE_PIN, CSN_PIN);


    byte radio_pipes[2][6] = {"1Node", "2Node"};

    struct SRadioData {
      int32_t counter;
      int16_t pins[3];
      int16_t radio_ms;
      int16_t value;
      int16_t angle;
    };


    void setup() {
      radio.begin();
      radio.setPALevel(RF24_PA_LOW);
      radio.setChannel(98);
      radio.setDataRate(RF24_2MBPS);
      radio.setCRCLength(RF24_CRC_8);
      radio.setAutoAck(0);
      radio.setRetries(7, 7);
      radio.setPayloadSize(sizeof(SRadioData));
      //radio.powerUp();

    #if defined (__AVR_ATtiny85__)
      // spammer
      radio.openWritingPipe(radio_pipes[1]);
      radio.openReadingPipe(1, radio_pipes[0]);
      //radio.startListening();
      radio.stopListening();
    #endif
    #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__)
      // reciever
      radio.openWritingPipe(radio_pipes[0]);
      radio.openReadingPipe(1, radio_pipes[1]);
      radio.startListening();

      Serial.begin(19200);
      Serial.println("SETUP...");
      Serial.print("PAYLOAD=");
      Serial.print(sizeof(SRadioData));
      Serial.println();
    #endif
    }





    #if defined (__AVR_ATtiny85__)
    int spam_index = 0;
    long spam_m = 0;
    SRadioData spam_dat = {0};
    #endif
    #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__)
    int recv_index = 0;
    long recv_timer = 0;
    #endif

    void loop() {
    #if defined (__AVR_ATtiny85__)
      // spammer
      spam_m = millis();
      spam_dat.counter = spam_index++;
      spam_dat.pins[0] = 1; //analogRead(IR0_PIN);
      spam_dat.pins[1] = 2; //analogRead(IR1_PIN);
      spam_dat.pins[2] = 3; //analogRead(ENC_PIN);
      spam_dat.value = 50;
      spam_dat.angle = 90;

      //radio.stopListening();
      //delay(10);
      radio.write( &spam_dat, sizeof(spam_dat) );
      //radio.startListening();

      spam_dat.radio_ms = millis() - spam_m;
    #endif



    #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__)
      // reciever
      int read_bad = 1;
      if ( radio.available() > 0 ) {

        struct SRadioData di = {0};
        radio.read( &di, sizeof(di) );

        uint8_t *u = (uint8_t *)&di;
        uint8_t uu = 0;
        for (int i = 0; i < sizeof(di); ++i)
          uu |= u[i];


        read_bad = 0;
        if (read_bad == 0) {
          if (1) {
            Serial.print("RADIO_MON_");
            Serial.print(recv_index++);

            Serial.print("(counter=");
            Serial.print(di.counter);

            Serial.print(", pin0=");
            Serial.print(di.pins[0]);
            Serial.print(", pin1=");
            Serial.print(di.pins[1]);
            Serial.print(", pin2=");
            Serial.print(di.pins[2]);
            Serial.print(", radio_ms=");
            Serial.print(di.radio_ms);

            Serial.print(", value=");
            Serial.print(di.value);
            Serial.print(", angle=");
            Serial.print(di.angle);
            Serial.print(")");
            Serial.println();
          };
          recv_timer = millis();

          radio.startListening();
        };
        delay(20);
      };

      if (read_bad) {
        // no radio available
        if (millis() - recv_timer > 2000) {
          recv_timer = millis();
          Serial.print("RADIO_MON_");
          Serial.print(recv_index++);
          Serial.print(": NO DATA ");
          Serial.print(read_bad);
          Serial.println();
        };
      };
    #endif


    };


     

    [​IMG]
     
  13. parovoZZ

    parovoZZ Гуру

    Ну давай сюда pcb свою. Поглядим.
    возьми 841 тиню. Там и SPI настоящий и UART рядом. )) Можно 84 тиньку взять. Там USART полноценного нет, но есть USI. Полуаппаратный SPI можно сделать.
     
  14. Noobeum

    Noobeum Нуб

    когда делал вторую плату, пытался сделать немного более гибкой, потому что с первой сам начал запутываться куда какие проводки идут... поэтому вторую сделал на пинах...
    если бы заработало - запаял бы третью версию, но пока и вторая не работает.

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

    оригинальную схему (которую я с https://www.hackster.io/arjun/nrf24l01-with-attiny85-3-pins-74a1f2 стащил)
    я более просто на фото в предыдущем посте привел...


    из того что удалось сделать пока не сгорела очередная rf24 (сгорела по глупости - при подключении к быстроразводной макетке перепутал полюса)

    удалось дойти до radio.write, дальше виснет
    в зависимости от фазы луны может записнуть надолго (секунд на 15-20) а может навсегда
    если на резистор и СE подать не 3.3 а 5в то зависания уходят
    но приемник ничего все равно не получает...

    [​IMG]

    [​IMG]
    [​IMG]
    [​IMG]

    [​IMG]
     
  15. parovoZZ

    parovoZZ Гуру

    CE же надо к земле прижать?
     
  16. Noobeum

    Noobeum Нуб

    по ссылке у него на питание заведено
    вот еще схема, тоже на питание
    [​IMG]
     
  17. b707

    b707 Гуру

    так не бывает.
    Ищите, чем отличается "быстроразводная" схема от PCB. Раз первая работала - значит все, что нужно сделать - повторить ее буквально.
     
  18. parovoZZ

    parovoZZ Гуру

    к чему такой изврат? Ноги же есть на МК.
     
  19. Noobeum

    Noobeum Нуб

    Свободные то? Пока есть. Но на них свои планы...
    В том то и дело... ДВа дня потратил на сверху схем, ошибок по схемам не нашел. Пока три гипотезы.
    1) при пайке какой-то элемент был перегрет. Тут подозрение либо на диод либо на конденсатор. Резистор прозванивал, он соотсвествует номиналу.
    2) тайминги. дело в том что при трехпиновом подключении много завязано на время зарядки/разрядки конденсатора. и может сложилось так, что в распаяных схемах требуются другие тайминги для этой радости...
    но для того чтобы это проверить нужен сериал, который мне вчера поднять не удалось на аттини...
    связь уно-hc06 работает, даже без делителя TX, а связь 85-HC06 не работает, что с делителем что без...
    3) общие наводки. но это вообще никак не решается похоже... по крайней мере я не умею с этим бороться вообще никак.

    Буду думать, а пока попробую поднять ту же радость на нано, оно конечно места занимает больше, но там хотя бы хардварный сериал для отладки есть. надоело светодиодами отлаживать =(
     
  20. parovoZZ

    parovoZZ Гуру

    А какие? Их же всегда можно отвязать и использовать как душе угодно, пока SPI слэйв не включен.
    зачем сериал? Слушай SPI.
    вот и именно что. Выдумываешь проблемы на ровном месте.