[Решено] Как подружить 2 RFID-сканера RC522 и Arduino Nano

Тема в разделе "Arduino & Shields", создана пользователем onmironov, 11 сен 2015.

  1. onmironov

    onmironov Нерд

    Мне в проекте светодиоды не были нужны, но если вам нужен, допустим, зеленый, чтобы зажигать его при правильных картах, ни что не мешает его прицепить, а зажигать через условие выше.
     
  2. vcc

    vcc Нуб

    Привет!
    Подскажите, используя код с предыдущей страницы, прописав дополнительные пины SS, и количество ридеров удалось кому нибудь подключить больше 2-х считывателей?
    У меня при 3шт работает через раз, а если подключать 4, то один всегда сыплет в ком порт рандомный UID, и не видит карточки.
    Причем даже если отсоединить все считыватели ( пины SS на "+" через резистор).
    Схема подключения такая - моси, мисо и сцк запаралелены соответственно и подключены к железному SPI (пробовал и уно и мега). Резеты со всех тоже свел на один пин (9).
    Выбор SS 2,3,4,5. Пробовал разные цифровые пины, все одинаково.

    Начал ковыряться в библиотеке, но уже второй день, и все сложно. Она слишком сложная для меня.

    Вот код, с которым у меня не работает 4 шт..

    Код (C++):
    #include <SPI.h>
    #include <MFRC522.h>

    #define RST_PIN        9          // пин RST

    byte maxRF = 3;                // всего рфидов (включая нулевой)
    byte ssRFpin[4] = {2, 3, 4, 5};      // SS пины рфидов

    byte massRFuid[2][4];          // массив UID меток (первый - номер ридера, второй - 4 числа UID)

    MFRC522 *mfrc522[4];

    void setup() {
      for (byte i = 0; i <= maxRF; i++) { // выставляем пины
        mfrc522[i] = new MFRC522(ssRFpin[i], RST_PIN);
      }

      Serial.begin(9600);
      SPI.begin();
      for (byte i = 0; i <= maxRF; i++) {
        mfrc522[i]->PCD_Init();
      }
      Serial.println("Card please:");
    }


    void loop() {
      for (int i = 0; i <= maxRF; i++) { // заполняем массив меток
        readRF(i);
        delay (100);                    // не знаю надо ли
      }
      SerialRFprint();                  // печатаем содержимое массива меток на экран
      delay(400);
    }



    void readRF (byte RF) {
      if ( ! mfrc522[RF]->PICC_IsNewCardPresent()) { // если метки нет
        massRFuid[RF][0] = 0;        // метим отсуствие метки в первом числе UID
        return;
      }
      if ( ! mfrc522[RF]->PICC_ReadCardSerial()) {
        massRFuid[RF][0] = 0;
        return;
      }

      dump_byte_array(mfrc522[RF]->uid.uidByte, 4, RF);
      mfrc522[RF]->PICC_IsNewCardPresent();
      mfrc522[RF]->PICC_ReadCardSerial();
    }


    void dump_byte_array(byte * buffer, byte bufferSize, byte RF) { // считываем UID в массив
      for (byte i = 0; i < bufferSize; i++) {
        massRFuid[RF][i] = buffer[i];
      }
    }

    void SerialRFprint () {            // печать массива меток на экран
      for (int i = 0; i <= maxRF; i++) {
        Serial.print("Card ");
        Serial.print(i, DEC);
        Serial.print(": ");
        if (massRFuid[i][0] == 0) {
          Serial.println("NO card");
        } else {
          for (int j = 0; j < 4; j++) { // печатаем UID
            Serial.print(massRFuid[i][j], HEX);
            Serial.print(" ");
          }
          Serial.println("");
        }
      }
    }

    В чем же может быть причина?
    Питание мерял, 3.2вольта.
    По отдельности все рфиды работают.

    Нашел скетч без библиотеки рфид, с китайскими комментариями, перевел. С ней подрубил 1 считку, в данный момент разбираюсь, как создать несколько устройств. Там проще, т.к. код на пару страниц. но все равно сложновато пока для меня.

    Хелп плиз.
     
  3. onmironov

    onmironov Нерд

    Привет

    Я, на самом деле, нихрена не понимаю в программировании =) У меня работает связка 5 RFID + реле. Реле срабатывает только в том случае, если к каждому RFID’у поднесена своя метка. Код ниже (он очень грязный):

    Код (C++):
    #include <SPI.h>
    #include <MFRC522.h>

    #define RST_PIN        9          // пин RST

    byte maxRF = 4;                // всего рфидов (включая нулевой)
    byte ssRFpin[5] = {3, 4, 5, 6, 7};      // SS пины рфидов

    byte massRFuid[4][4];          // массив UID меток (первый - номер ридера, второй - 4 числа UID)

    MFRC522 *mfrc522[5];

    String rfid1;
    String rfid2;
    String rfid3;
    String rfid4;
    String rfid5;

    int Relay = 2;

    void setup() {
      for (byte i = 0; i <= maxRF; i++) { // выставляем пины
        mfrc522[i] = new MFRC522(ssRFpin[i], RST_PIN);
      }

      Serial.begin(9600);
      while (!Serial);
      SPI.begin();
      for (byte i = 0; i <= maxRF; i++) {
        mfrc522[i]->PCD_Init();
      }
      Serial.println("Card please:");
      pinMode(Relay, OUTPUT);
    }


    void loop() {
      for (int i = 0; i <= maxRF; i++) { // заполняем массив меток
        readRF(i);
        delay (10); // не знаю надо ли
      }
      RelayOnOff();
      delay(1000);
    }



    void readRF (byte RF) {
      if ( ! mfrc522[RF]->PICC_IsNewCardPresent()) { // если метки нет
        massRFuid[RF][0] = 0; // метим отсуствие метки в первом числе UID
        return;
      }
      if ( ! mfrc522[RF]->PICC_ReadCardSerial()) {
        massRFuid[RF][0] = 0;
        return;
      }

      dump_byte_array(mfrc522[RF]->uid.uidByte, 4, RF);
      mfrc522[RF]->PICC_IsNewCardPresent();
      mfrc522[RF]->PICC_ReadCardSerial();
    }


    void dump_byte_array(byte * buffer, byte bufferSize, byte RF) { // считываем UID в массив
      for (byte i = 0; i < bufferSize; i++) {
        massRFuid[RF][i] = buffer[i];
      }
    }

    void RelayOnOff () {
      rfid1 = String(massRFuid[0][0], DEC);
      rfid2 = String(massRFuid[1][0], DEC);
      rfid3 = String(massRFuid[2][0], DEC);
      rfid4 = String(massRFuid[3][0], DEC);
      rfid5 = String(massRFuid[4][0], DEC);
      Serial.println("RFID 1: ");
      Serial.println(rfid1);
      Serial.println("--------");
      Serial.println("RFID 2: ");
      Serial.println(rfid2);
      Serial.println("--------");
      Serial.println("RFID 3: ");
      Serial.println(rfid3);
      Serial.println("--------");
      Serial.println("RFID 4: ");
      Serial.println(rfid4);
      Serial.println("--------");
      Serial.println("RFID 5: ");
      Serial.println(rfid5);
      Serial.println("--------");
      if ((rfid1 == "4") && (rfid2 == "217") && (rfid3 == "179") && (rfid4 == "169") && (rfid5 == "227")) {
          digitalWrite(Relay, LOW);
        } else {
            digitalWrite(Relay, HIGH);
          }
      }
    Обрати внимание на строку
    Код (C++):
    byte massRFuid[4][4];
    Я не помню, почему мы так сделали, но какое-то переполнение у нас было, выявили тестами. С
    Код (C++):
    byte massRFuid[4][4];
    все работает стабильно.

    Ну и мы считываем только первый номер метки, причем изначально перевели это все в стринг.
     
  4. ostrov

    ostrov Гуру

    Что то я туплю. Где в последнем и предпоследнем примере переключение активного ридера?
     
  5. ostrov

    ostrov Гуру

    Вовсе нет, они считываются только когда в SS подается LOW. А он туда подается поочередно. Вероятно, это происходит в библиотеке, хотя я бы ей не доверял и продублировал вкл-выкл вручную.
     
  6. ostrov

    ostrov Гуру

    Таким обоазом работало до 4х, больше пока не пробовал, но надо разводить по времени и дублировать сигналы активации, как я говорил. Тогда анализатора не было, глюки словить было сложно. Скоро попробую еще.
     
  7. ostrov

    ostrov Гуру

    Я для надежности сделал модули из рфида и Атмеги8, подключил их все 9 к Про Мини. Чуть громоздко, зато железобетонно.
     
  8. ostrov

    ostrov Гуру

    Схему чего? Как ридер к Атмеге подключить?
     
  9. ostrov

    ostrov Гуру

  10. Andrey_K

    Andrey_K Нуб

    По вашей схеме собрал на Mega 2560.
    Все заработало :) Но осмелюсь спросить. Может поможете
    Имею ethernet шилд w5100
    2 rfid модуля rc522
    И 150 брелков-меток.

    Прописать их просто и заставить срабатывать релюшку у меня не составило труда, но в идеале хотелось бы иметь web доступ к плате, где я видел бы 150 своих меток и "на лету" мог бы запрещать или разрешать им доступ. Без перепрошивки мк.
    Вот думаю как это реализовать. Пните в какую то сторону Или разместить их на SD карте. Или же в энергонезависимой области самого контроллера... что-то смотрел и не нашел похожего.

    UPD:
    Так как я понял, у меня не получится подружить rfid и w5100 ибо обе пользуют SPI и возможно придется пользоваться способом который описал товарищ ostrov из предыдущего поста. Я даже не могу представить у себя в голове по какому пути пойти. Чтобы не попасть в тупик.
     
    Последнее редактирование: 27 апр 2016