Передача UID Rfid метки по I2C

Тема в разделе "Arduino & Shields", создана пользователем Suyano, 13 июн 2018.

  1. Suyano

    Suyano Нерд

    Доброго времени суток! Есть две UNO, на одной из стоит RFID считыватель (RC522). Обе Arduino UNO объединены по I2C сети. Плата с RFID - Мастер, Вторая - Slave. Мне необходимо по I2C передавать UID карты на Slave.
    Вот код:
    Код (C++):
    // Master
    #include <Wire.h> // Main I2C Lib
    #include <iarduino_I2C_connect.h> // Old I2C Lib

    // RFID
    #include <SPI.h>
    #include <MFRC522.h>
    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    unsigned long uidDec, uidDecTemp;  // для храниения номера метки в десятичном формате
    // RFID END

    iarduino_I2C_connect I2C2;
          int RFCHECK = 0;
          byte REG_Massive[3];
          int            VAR_RFID = 0;
     
    void setup() {
     
    // RFID
    Serial.begin(9600);
    Serial.println("Waiting for card...");
    SPI.begin();  //  инициализация SPI / Init SPI bus.
    mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
    // RFID END

    //Wire.setClock(400000);                              // устанавливаем скорость передачи данных по шине I2C = 400кБит/с
      Wire.begin();                                       // инициируем подключение к шине I2C в качестве ведущего (master) устройства  
    }

    void loop(){
    //Считываем данные:
     
    // RFID
      // Поиск новой метки
      if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }
      // Выбор метки
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
      uidDec = 0;
      // Выдача серийного номера метки.
      for (byte i = 0; i < mfrc522.uid.size; i++)
      {  
        uidDecTemp = mfrc522.uid.uidByte[i];
        uidDec = uidDec * 256 + uidDecTemp;
      }
      Serial.println(uidDec); // Выводим UID

      // Test
      VAR_RFID = uidDec;
      REG_Massive[1] = VAR_RFID>>8;
      REF_Massive[2] = VAR_RFID;
      if(uidDec == 2893284997) {
        I2C2.writeByte(0x02, 0) // ????? Здесь проблема
      }
    }

    Код (C++):
    // Slave
    // Подключаем библиотеки:
    #include <Wire.h>                                     // подключаем библиотеку для работы с шиной I2C
    #include <iarduino_I2C_connect.h>                     // подключаем библиотеку для соединения arduino по шине I2C
    // Объявляем переменные и константы:
    iarduino_I2C_connect I2C2;                            // объявляем переменную для работы c библиотекой iarduino_I2C_connect
    const byte           PIN_LED           = 13;          // объявляем константу с указанием номера цифрового вывода, к которому подключен светодиод
          byte           REG_Massive[3];                  // объявляем массив, данные которого будут доступны для чтения/записи по шине I2C
         
    void setup(){
    //Wire.setClock(400000);                              // устанавливаем скорость передачи данных по шине I2C = 400кБит/с
      Wire.begin(0x02);                                   // инициируем подключение к шине I2C в качестве ведомого (slave) устройства, с указанием своего адреса на шине.
      I2C2.begin(REG_Massive);                            // инициируем возможность чтения/записи данных по шине I2C, из/в указываемый массив
      pinMode(PIN_LED, OUTPUT);                           // Устанавливаем режим работы вывода светодиода, как выход
    }

    void loop(){
      //Здесь мне обходимо принимать UID метки, но непонятно, как?
      /*if(REG_Massive[0] == 5) {
      digitalWrite(PIN_LED, HIGH);
      } if (REG_Massive[0] == 8) {
       digitalWrite(PIN_LED, LOW); // вкл/выкл светодиод в соответствии со значением 0 элемента массива REG_Massive
      }*/

    }
    Изначально у меня получалось передавать числа типа "1", "9", приняв которые я включал светодиод. Но UID метки длинный, поэтому, насколько я понял, его нужно разбивать и на стороне Slave собирать. Как решить это?
     
  2. b707

    b707 Гуру

    зачем его "разбивать", если он у вас и так с карты читается побайтно? Отправляйте отдельными байтами mfrc522.uid.uidByte.
    Да и "собирать" его потом на стороне Slave я тоже бы не стал. Вообще не вижу смысла преобразовывать UID в десятичное число... работайте с байтами, как есть
     
  3. DetSimen

    DetSimen Гуру

    Ну всё, Филин, щас с тебя пример кода потребуют...
     
  4. Suyano

    Suyano Нерд

    Добрый день!
    Я решил попробовать так:
    Код (C++):
      Rfid = 453781458;
      R1 = Rfid>>8;
      R2 = Rfid;
      delay(500);
      I2C2.writeByte(0x02,1,R1);
      I2C2.writeByte(0x02,2,R2);
    Код (C++):
    URE = REG_Massive[1]<<8;
      URE += REG_Massive[2];

      if(URE == 453781458) {
        digitalWrite(LED, HIGH);
        Serial.println("Hello World!");
      }
    К сожалению, работать не хочет пока.
     
  5. b707

    b707 Гуру

    и не будет. Особо глубоко не копал, но некоторые ошибки видны сразу. Вы о разрядности чисел слышали что-нибудь? В Вашем примере RFID = 453781458, разрядность этого числа явно больше 16бит, а значит переслать его в виде двух байт, как это делаете вы - никак не выйдет.

    Я ж вам предлагал посылать RFID побайтно... а вы все пытаетесь по своему.
     
  6. parovoZZ

    parovoZZ Гуру

    Не по-своему, а как понимает. Побайтно.... это как голым на мороз...