NANO+RC522+NRF24 двусторонние общение

Тема в разделе "Arduino & Shields", создана пользователем Gokry, 4 авг 2018.

  1. Gokry

    Gokry Нуб

    Всем привет, не выходит реализовать двусторонние общение на NRF24.
    Есть NANO+NRF24 и NANO+RC522+NRF24. Суть такая что считываю ардуинкой (1) UID метки, передаю на другую ардуинку(2), после этого должен получить любое сообщение от ардуинки (2) на (1). Ну в идеале это текст который привязан к номеру меки. Работает все кроме отправки либо приема обратного сообщения. Использую библиотеку RF24Network потому что в идеале должно быть 12 ардуино с RC522 и они отправляют это на главную.

    Код NANO+RC522+NRF24
    Код (C++):
    #include <RF24Network.h>
    #include <RF24.h>
    #include <SPI.h>
    #include <MFRC522.h>
    #define SS_RFID 10
    #define RST_RFID 9
    MFRC522 rfid(SS_RFID, RST_RFID); // Пины RC522
    MFRC522::MIFARE_Key key;

    #define SS_NRF 8
    #define RST_NRF 7
    RF24 radio(RST_NRF, SS_NRF); // Пины NRF24

    int count = 0 ;
    byte UID[4]; //Храним UID тут

    RF24Network network(radio);

    const uint16_t this_node = 2;// Адресс этой ардуинки
    const uint16_t other_node = 1;// Адресс куда передаем

    String output; // Строкапередача UID + кредиты (не используется)

    void setup(void)
    {
      Serial.begin(9600);
      SPI.begin();
      radio.begin();
    network.begin(/*канал*/ 90, /*адрес ардуины*/ this_node); // Задаем канал и адрес ардуины
      rfid.PCD_Init(); // Инициализация RC522

      for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
      }
      Serial.print("READY TX");
    }

    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 card () { // тут считываем новую карту и сохраняем в массив UID

      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] ) {

        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();
        count = 1;   // Меняем значение переменной
      }  else Serial.println("Card read previously."); // Если приложенна текущая карта

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

    void received () { // Прием обратных данных

      while (network.available()) // Если есть сообщение то читаем его  !
      {                          //НО оно зависает на этом, если убрать while тогда оно хоть работает дальше.
        RF24NetworkHeader header;
        static char mecountage[32]; // сюда пишем принятое сообщение
        network.read(header, &mecountage, sizeof(mecountage));// Читаем сообщение
        Serial.print("Received: ");
        Serial.println(mecountage); // Выводим принятое сообщение
        count = 0;
      }
    }
    void sen () { // Тут отправляем UID
      Serial.print("Sending...");
      RF24NetworkHeader header(/*to node*/ other_node);
      //output = (String (mecountage[0]) + String (mecountage[1]) + String (mecountage[2]) + String (mecountage[3]));  // Не используется
      bool ok = network.write(header, &UID, sizeof(UID)); // Отправляем
      if (ok) {
        Serial.println("ok.");
        count = 2 ; // Меняем переменную
      } else
      {
        Serial.println("failed");
      }
    }

    void loop(void)
    {
      digitalWrite (SS_RFID, LOW);  // Меняем состояние count пинов
      digitalWrite (SS_NRF, HIGH);
      network.update();
      if (count == 0) {  // Читаем карту
        card();
      }
      if (count == 1) {// Отправляем UID
        digitalWrite (SS_RFID, HIGH);  // Меняем состояние count пинов
        digitalWrite (SS_NRF, LOW);
        sen ();
      }
      if (count == 2) {   // Принимаем сообщение
        received ();
      }
    }
     
    Код NANO+NRF24
    Код (C++):
    #include <RF24Network.h>
    #include <RF24.h>
    #include <SPI.h>

    #define SS_NRF 8
    #define RST_NRF 7
    RF24 radio(RST_NRF, SS_NRF);  // Пины NRF24

    String serial; // Для вывода в сериал порт принятого UID
    String UID;
    RF24Network network(radio);
    int count = 0;
    const uint16_t this_node = 1;// Адресс этой ардуинки
    const uint16_t other_node = 2;// Адресс куда передаем

    String card1 = "2342434246"; // Тут храню UID карт который использую
    String card2 = "192247132166";
    String card3 = "96197102168";
    String card4 = "55170114180";

    const char* info;

    void setup(void)
    {
      Serial.begin(9600);
      SPI.begin();
      radio.begin();
      network.begin(/*канал*/ 90, /*адрес ардуины*/ this_node); // Задаем канал и адрес ардуины
      Serial.println("READY RX");
    }

    void received () { // Прием UID
      if (count == 0) {
        while ( network.available() )
        {
          RF24NetworkHeader header;
          byte message[4]; // храним юид
          network.read(header, &message, sizeof(message));
          Serial.print("Received: ");
          UID = (String (message[0]) + String (message[1]) + String (message[2]) + String (message[3])); // Даже не спрашивайте зачем ) UID для сравнения
          serial = (String (message[0]) + String (message[1]) + String (message[2]) + String (message[3]) + " From:" + header.from_node);
          Serial.println(serial);// выводим UID и от какой ардуины получен
          count = 1;
        }
      }
    }
    void sen () { // Обратная передача данных
      if (count == 1) {
        if (UID = card1) { // если пришел UID 1 карты то message = cadr1
          info = "card1";
        }
        if (UID = card2) { // если пришел UID 1 карты то message = cadr1
          info = "card2";
        }
        if (UID = card3) { // если пришел UID 1 карты то message = cadr1
          info = "card3";
        }
        if (UID = card4) { // если пришел UID 1 карты то message = cadr1
          info = "card4";
        }
        Serial.print("Sending...");
        RF24NetworkHeader header(/*to node*/ 2);
        bool ok = network.write(header, info, sizeof(info)); // отправляем информацию о карте
        if (ok) {
          Serial.println("ok.");
          count = 0;
        } else {
          Serial.println("failed");
        }
      }
    }

    void loop(void)
    {
      network.update();
      received();
      sen();
    }

     
    Подскажите как правильно реализовать обратную передачу.
     
  2. Daniil

    Daniil Гуру

    Чтобы проверить, воспользуйтесь отладкой. На пк отправляйте сообщения, которые скажут вам, на каком этапе ваша программа ошибается.
     
  3. Gokry

    Gokry Нуб

    Я в курсе на каком этапе она зависает, она крашится на этапе отправки обратного сообщения, если я эту часть кода убираю то все работает идеально. Просто не очень понимаю как синхронизировать прием и отправку что ли
     
  4. parovoZZ

    parovoZZ Гуру

    Сделай автоподтврждение и в автответе отправляй данные. Вообще, завязывай с библами - в них через одно место все.
     
  5. Gokry

    Gokry Нуб

    Я уже думал насчет авто подтверждения, но тогда у меня другой вопрос появился. Прилетает UID на ардуинку с неё идет в сериал на ПК, он капается в своей базе, отправляет инфу в сериал, ардуинка считывает и отправляет автоподтверждение. Мне кажется что не успею все обработать.
     
  6. parovoZZ

    parovoZZ Гуру

    Автоподтверждение срабатывает сразу же после получения пакета. Т.е. данные там уже должны лежать. А вообще, читай даташите прежде, чем с чем-то работать.
     
  7. Gokry

    Gokry Нуб

    Ну так вот я и говорю же не смогу отправлять с авто подтверждением. Всё же до сих пор не могу сделать нормальный обратный ответ на присланный UID.