Подключение 2-х RFID считывателей к Arduino

Тема в разделе "Arduino & Shields", создана пользователем VaGrAm, 21 май 2018.

  1. VaGrAm

    VaGrAm Нерд

    Добрый день,

    Задача подключить к одному контроллеру (Arduino UNO) 2 RFID считывателя (RC522).

    Оба счтитывателя подключены "паралельно" к ICSP интерфейсу (пины MOSI, MISO и SCK). Пин RST и SS у каждого свой. После запуска не считываются катрочки ни с одного ридера. Если физически отключаю один из ридеров (все пины) и перезапускаю: оставщийся работает.

    Мой код имеет следующий вид:
    Код (C++):
    #include <SPI.h>
    #include <MFRC522.h>

    #define SS_PIN_1 5 //SS pin for 1st reader
    #define SS_PIN_2 6 //SS pin for 2nd reader

    #define RST_PIN_1 8 //RESET pin for 1st reader
    #define RST_PIN_2 9 //RESET pin for 2nd reader

    MFRC522 rfid_1(SS_PIN_1, RST_PIN_1); //Instance of the class for 1st reader
    MFRC522 rfid_2(SS_PIN_2, RST_PIN_2); //Instance of the class for 2nd reader

    MFRC522::MIFARE_Key key_1; //Key for 1st reader
    MFRC522::MIFARE_Key key_2; //Key for 2nd reader

    byte nuidPICC_1[4]; //Array for store UID from 1st reader
    byte nuidPICC_2[4]; //Array for store UID from 2nd reader


    void setup() {
      Serial.begin(9600);

      pinMode(SS_PIN_1, OUTPUT);
      pinMode(SS_PIN_2, OUTPUT);
     
      SPI.begin(); // Init SPI bus
     
      rfid_1.PCD_Init(); // Init MFRC522 for 1st reader
      rfid_2.PCD_Init(); // Init MFRC522 for 2nd reader


      for (byte i = 0; i < 6; i++) {
        key_1.keyByte[i] = 0xFF;  
        key_2.keyByte[i] = 0xFF;
      }
    }
    void loop() {

    Serial.println("Waiting for cards...");
      // Look for new cards
      if ( ( ! rfid_1.PICC_IsNewCardPresent()) && ( ! rfid_2.PICC_IsNewCardPresent()) )
        return;
      // Verify if the NUID has been readed
      if ( ( ! rfid_1.PICC_ReadCardSerial()) && ( ! rfid_2.PICC_ReadCardSerial()) )
        return;

    for (byte i = 0; i < 4; i++) {
          nuidPICC_1[i] = rfid_2.uid.uidByte[i];
          nuidPICC_2[i] = rfid_1.uid.uidByte[i];
        }
       
      printHex(rfid_1.uid.uidByte, rfid_1.uid.size);
      Serial.println();
      rfid_1.PICC_HaltA();
         
      printHex(rfid_2.uid.uidByte, rfid_2.uid.size);
      Serial.println();
      rfid_2.PICC_HaltA();

      rfid_1.PCD_StopCrypto1();
      rfid_2.PCD_StopCrypto1();

      delay (2000);
    }

    void printHex(byte *buffer, byte bufferSize) {
      for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i], HEX);
      }
    }
    Методом тыка выяснил что если в коде "отключить" инициализацию того или иного инстанса (строка 28 или 29) то опять же оставшийся ридер работает. Как вариант думаю смогу организовать инициализацию того или иного инстанса непосредственно перед обращением к определенному ридеру (не в setup а где-то в loop) но после этого его как-то надо "удалить" так как сразу же после инициализации 2-ого вся система перестает считывать карточки. Инициализию в loop пробовал: работает. Есть в Arduino что-то подобное (удаление инстанса)?

    Просьба помочь с решением проблемы развив предложенную мной идею или же направив по более правильному пути.

    Заранее всем спасибо...
     
  2. ostrov

    ostrov Гуру

    Есть мнение, что некоторые китайские RC522 забивают на SS. Можно попробовать подключить каналы MISO через транзисторы, которые вкл-выкл по очереди.
     
    arkadyf нравится это.
  3. Daniil

    Daniil Гуру

    Подскажите, а что тут происходит? Я с рфид метками не работал. На сколько я понял первое условие ждёт новую карточку на считывателе 1 и на считывателе 2. Второе условие аналогично, но id проверяет. Эти 2 условия держат программу пока они не выполнятся.

    Если я правильно понял, то точно ли тут необходимо строгое условие "И" (&&)? Попробуйте сразу 2 карточки приложить?
     
    arkadyf нравится это.
  4. qwone

    qwone Гик

    Ясно же вам сказали
    RFID считыватели не дают друг другу работать через MISO.
     
  5. DIYMan

    DIYMan Guest

    Лучче 74HC125 - 4 канала, хватит на 4 считывателя ;) Да и проще - логика включения канала полностью совпадает с логикой выбора устройства на SPI - по низкому уровню. Т.е. схемотехнически всё крайне просто: с CS каждого модуля параллелим сигнал на ногу управления каналом микрухи, линии MISO каждого модуля - в разрыв через канал микрухи. Делов - на 5 минут проверить на макетке ;)
     
    ostrov и arkadyf нравится это.
  6. VaGrAm

    VaGrAm Нерд

    Там отрицание стоит (!): типа если нет карты на ридере 1 и 2 одновременно (поэтому и условие И). 2-ое условие: то же самое но про NUID (если не считалось с обоих - вернутся)
     
    Daniil нравится это.
  7. VaGrAm

    VaGrAm Нерд

    Спасибо за совет. То есть программно никак? Отпишусь о результатах...
     
  8. VaGrAm

    VaGrAm Нерд

    Скорее всего именно такие считыватели и под тестом. Поделюсь результатами тестов с транзисторами
     
  9. DIYMan

    DIYMan Guest

    А как программно порвать линию MISO от модуля физически, если он её аппаратно (привет китайским модулям!) не отпускает даже тогда, когда CS в высоком, и по итогу - MISO такого модуля может быть постоянно в низком, например? Ну прочитаете вы "с модуля" одни нули - вот и всё. Тут у каждого второго проблема с модулями SD-карточек, например. Лично я тоже с этим сталкивался, теперь, по избежание - лежит ворох 74HC125 и, чтобы не морщить лоб, все модули SPI загоняю через них, разрывая MISO через канал микрухи. Это быстрее и удобней, чем вдуплять, почему вдруг что-то идёт не так и не подкинули ли китайцы очередной сюрприз в виде не до конца правильной схемотехники конкретного модуля.

    Считаю, моё время стоит дороже, чем пучок 74HC125 ;)
     
  10. ostrov

    ostrov Гуру

    Можно извратнуться с мультиплексором. )
     
  11. VaGrAm

    VaGrAm Нерд

    Спасибо. Скорее всего так и сделаю. Просто за этим пучком надо в магазин сгонять а так думал может програмно можно - все уже на столе. Но как понял через транзисторы MISO должен переключать... Пойду за ними ;)
     
  12. ostrov

    ostrov Гуру

    Не переключать а открывать по очереди то одному то другому.
     
  13. parovoZZ

    parovoZZ Гуру

    А можно купить готовую wiegand считку. В корпусе, цивильную и со всеми делами.
     
  14. ostrov

    ostrov Гуру

    Ссылку.
     
  15. parovoZZ

    parovoZZ Гуру

    Да пожалуйста
    https://ironlogic.ru/il_new.nsf/htm/ru_readers
    лично мной проверены - не убиваемые считки.

    С Mifare позамороченнее, но зато карту не скопируешь.
     
  16. ostrov

    ostrov Гуру

    Ну и какая связь с задачей? ТС хочет два ридера с которых идут данные о карточках на Ардуино. При цене ридеров по 100 руб. Эти ваши почем? И данные на Ардуино как с них обоих перекидывать планируете?
     
  17. parovoZZ

    parovoZZ Гуру

    Эти мои к стене пришурупил, подвел 4 провода. И цивильно и работает вечно. Длина кабеля между считкой и ридером в теории 15 метров, у меня на практике 50 метров было - и работало. А 100 рублевый - что с ним делать? Корпус искать, заливать чем-то. На улице вообще не повесишь.

    Wiegand описан и вдоль и поперек. Если мне надо кому-то поставить СКУД, я покупаю Z-5R + считки и не изобретаю велосипед. Есть даже два в одном.
     
  18. VaGrAm

    VaGrAm Нерд

    Спасибо всем за советы. Разрулил ситуацию переключением MISO пинов через транзисторы/микросхемы. В частности поставил 74LS125 (аналог 74HC125).
    На самом деле был нужен "дешевый" проект с ридерами за пару долларов а не какие-то новороченные ридеры которые умеют все ;)
     
    ostrov нравится это.
  19. ostrov

    ostrov Гуру

    Наконец то дошли руки до продолжения неравной борьбы с мультиподключением говнорфидов. В данном раунде борюсь в 4 штуками. Использовал 74HC125 на MISO, сперва параллельно SS, не помогло. Затем выделил еще по пину на каждый рфид и открывал конкретный MISO перед обращением к конкретному РФИДу. И это не помогло. По одному все работают в любом месте. Работают два одновременно, но уже хуже, иногда пропускают метку. Даже три работают, правда еще хуже. Четыре уже никак. Смотрел осциллографом, сигнал проходит только тот какой надо в то время какое надо. Что еще может быть не то? Я уже башку сломал. (
     
  20. Какой смысл постоянно писать без схемы, фото и кода, и ожидаемо раз за разом не получать внятных ответов?