Как работать с несколькими RFID-ридерами RC522?

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

  1. Lega

    Lega Нуб

    Почитал даташит, там написано, чтобы чип RC522 заработал по i2C нужно подать на 1-ю ножку чипа логическую "1". На китайской плате считывателя(ридер) RFID-RC522 нога 1 железно запаяна на GND (выбор SPI режима). Еще для i2C надо использовать ножку EA(32-я нога чипа), не разбирался зачем. На плате эта нога запаяна на 3,3V. Так же не получится использовать UART по той же причине, потому что нужно будет перерезать ножку EA(32) от питания и посадить на GND. В этом случае распиновка:
    MISO --> TX
    SDA --> RX
    MOSI --> MX
    SCK --> DTRQ
    Адресация по i2C осуществляется по: MOSI это ADR_0 и SCK это ADR_1, если захочется больше одинаковых ридеров подключить, то придется припаяться к ноге микросхемы RC522 к выводу 28 это ADR_2.
    Хотя наверное проще тогда возится с UART, чем восстановить работу китайской платы по i2C. ))

    Вывод: Получается что можно похоронить идею использования китайского ридера RFID-RC522 с интерфейсами i2C и UART. А точнее сама микросхема поддерживает работу по всем трем интерфейсам, но китайцы упростили себе задачу и сделали данную плату только с SPI.

    P.S. Еще может кому то поможет при работе нескольких ридеров по SPI, без дополнительных чудес(логика ИЛИ по выводу MISO, диоды):
    Вывод RST(ножка чипа 6), который есть в контактах китайской платы работает так: подаем LOW кратковременно на RST(изначально должно удерживаться HIGH) - происходит рестарт ридера. Если удерживать LOW на RST длительно, то ридер будет выключен(power-down) и цепь MISO отключена (буквальный текст даташит: disconnected from the outside world). Это я не проверял. Заодно можно будет и проверить команду halt, такое ощущение что эта команда лишь рестарт, а не power-down.
     
    Последнее редактирование: 27 янв 2017
  2. talan

    talan Нерд

    не камельфо ресетом играться , я на диодах 3 метра поставил - хватает , только диодики шотке надо - падение меньше ( я изначально их и ставил ) . Так решений может быть много: - много входовой элемент ,полевые транзисторы , диоды что стоят на ардуино нано по входу от USB - ТАМ ВООБЩЕ падение 0,2 V , главное нагрузить правильно , можно доставить транзисторы после сумматора на диодах , подтянуть spi на стороне проца или на стороне RC522
     
  3. talan

    talan Нерд

    Вы пытаетесь программно его достать - не получиться - надо аппаратно - получиться , я просто почитал весь пост и понял - никто аппаратно не решал (вариант с SPI) , мне хватило 3 часов (разобраться с мануалом , программкой , и знания схемотехники)
     
    gofol2016 нравится это.
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

  5. Lega

    Lega Нуб

    Библиотека есть, да, но только если вы возьмете отдельный чип RC522, спаяете всю навесуху и программируете его на любой режим. Аналогично и для i2C. Если же берете готовую китайскую плату, где чип впаян, то там ноги выбора режима работы наглухо запаяны для работы только SPI. Нужно резать ноги и припаиваться к нужным уровням GND или 3,3V.
    spi.jpg
     
    Последнее редактирование: 31 янв 2017
  6. Lega

    Lega Нуб

    С Шотке хорошая идея кстати!
    Я тут вчера промаялся с двумя ридерами, хотя до этого несколько раз собирал схему подобную с тремя и все было ок. По отдельности они работают вместе никак. Ничего не помогало. Как ни странно, если соединяешь два входа SCK, то переставали работать. Пришлось заменить подозреваемый ридер на другой и сегодня уже установил схему с 2мя ридерами в работу. А еще пришла новая партия, которая вообще не работает по SPI ))) 3 ридера пробовал из 10, ни один не работает. Еще не разбирался какой режим стоит) отличается тем что кондеры C2 и C3 поменяны местами. Больше вроде ничем. может конечно ардуинка барахлит, но на ней я собрал готовый прибор с двумя старыми ридерами и работает как часы.
     
    Последнее редактирование: 31 янв 2017
  7. gofol2016

    gofol2016 Нуб

    добрый день, не могли бы выложить схему подключения с диодами?
     
  8. talan

    talan Нерд

    всё просто - нужно развязать сигнал входа микроконтроллера интерфейса SPI -MISO - 1.GIF
     
  9. Alex1709

    Alex1709 Нуб

    Здравствуйте, заставил работать 3 считывателя на Arduino Uno по SPI параллельно, но мне нужно сформировать матрицу с помощью демультиплексоров 8х8, нужно будет 9 мультиплексоров (1 выбора столбца и 8 выбора строки), но непонятно как подключить хотя бы к одному эти 3 шт.
    Вот скетч подключения 3 шт параллельно:
    #include <SPI.h>
    #include <MFRC522.h>

    #define RST_PIN 9 // Configurable, see typical pin layout above
    #define SS_1_PIN 10 // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 2
    #define SS_2_PIN 8 // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 1
    #define SS_3_PIN 14

    #define NR_OF_READERS 3

    byte ssPins[] = {SS_1_PIN, SS_2_PIN, SS_3_PIN};

    MFRC522 mfrc522[NR_OF_READERS]; // Create MFRC522 instance.

    /**
    * Initialize.
    */
    void setup() {

    Serial.begin(9600); // Initialize serial communications with the PC
    while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)

    SPI.begin(); // Init SPI bus

    for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card
    // Serial.print(F("Reader "));
    Serial.print(reader);
    Serial.print(F(": "));
    mfrc522[reader].PCD_DumpVersionToSerial();
    }
    }

    /**
    * Main loop.
    */
    void loop() {

    for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    // Look for new cards

    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
    // Serial.print(F("Reader "));
    // Serial.print(reader);
    // Show some details of the PICC (that is: the tag/card)
    // Serial.print(F(": Card UID:"));
    dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
    Serial.println();
    // Serial.print(F("PICC type: "));
    // MFRC522::pICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);
    // Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));

    // Halt PICC
    mfrc522[reader].PICC_HaltA();
    // Stop encryption on PCD
    mfrc522[reader].PCD_StopCrypto1();
    } //if (mfrc522[reader].PICC_IsNewC
    } //for(uint8_t reader
    }

    /**
    * Helper routine to dump a byte array as hex values to Serial.
    */
    void dump_byte_array(byte *buffer, byte bufferSize) {
    for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer < 0x10 ? " 0" : " ");
    Serial.print(buffer, HEX);
    }
    }
    Часть закомментил т.к. лишняя инфа.
    И еще, нашел пример скетча для демультиплексора, но не для этих считывателей, а на 8 других датчиков:
    // Example of using the 74HC4051 multiplexer/demultiplexer

    // Author: Nick Gammon
    // Date: 14 March 2013

    const byte sensor = A0; // where the multiplexer in/out port is connected

    // the multiplexer address select lines (A/B/C)
    const byte addressA = 6; // low-order bit
    const byte addressB = 5;
    const byte addressC = 4; // high-order bit

    void setup ()
    {
    Serial.begin (115200);
    Serial.println ("Starting multiplexer test ...");
    pinMode (addressA, OUTPUT);
    pinMode (addressB, OUTPUT);
    pinMode (addressC, OUTPUT);
    } // end of setup

    int readSensor (const byte which)
    {
    // select correct MUX channel
    digitalWrite (addressA, (which & 1) ? HIGH : LOW); // low-order bit
    digitalWrite (addressB, (which & 2) ? HIGH : LOW);
    digitalWrite (addressC, (which & 4) ? HIGH : LOW); // high-order bit
    // now read the sensor
    return analogRead (sensor);
    } // end of readSensor
    void loop ()
    {
    // show all 8 sensor readings
    for (byte i = 0; i < 7; i++)
    {
    Serial.print ("Sensor ");
    Serial.print (i);
    Serial.print (" reads: ");
    Serial.println (readSensor (i));
    }
    delay (1000);
    } // end of loop
    В общем вопрос в следующем: как согласовать выбор ведомого здесь
    с 3 битным адресом?
     
  10. Lega

    Lega Нуб

    Возможно будет полезно вам!!!
    Пишу разжевано, чтобы понимал любой начинающий.
    Вообщем у меня сломалась в квесте одна загадка. Там работает два считывателя RFID-RC522. А новая партия считывателей, о которых писал выше здесь на форуме, вообще не хотят работать в паре. Но дошла очередь докопаться и до них!
    Загружаю старый скетч на котором работали предыдущие считыватели в паре(иногда они сбоили но редко), и, не хотят дружить. Отсоединяешь MISO у любого из двух и один сразу работает, причем только в том случае если меняешь параметр пин RST_PIN(функция RFID.H) с 9го на 5-й пин и при этом ничего не подключая к 5.
    Я не стал разбираться с особенностями работы новой библиотеки MFRC522 и переписывать скеч, потому как она вроде решает проблему(путем задержек, которые все таки могут меняться в зависимости от температуры окружающей среды), а сделал как нарисовал talan с диодами шотки.
    И не заработало!!! Тогда отсоединяю RST на обоих 522 и все заработало. Убираю диоды шотки и не работает )))) Вообщем попробовал менять считыватели, все ок))) Не пробовал > 2, пока без надобности.

    Результат тестирования работы с новой партией RFID-RC522:
    1. Использую диоды шотки для развязки выходов MISO. Схема выше у talan, использую резистор 10к, т.к. у меня всего 2 считывателя. Чем больше считывателей тем меньше значение резистора.
    2. Отключил RST от обоих RC522 (контакт больше ни к чему не припаян).
    3. Передаю параметр RST_PIN в функции RFID(SS_PIN, RST_PIN), произвольный, например 5.
    Пока что работает как часы)))
    Распиновка RC522 - Arduino NANO V3:
    RST - совсем не подключаю;
    SDA (SS) - D10 и D8;
    MOSI - D11;
    MISO - D12 <--- RC522 через диод шотки(полоской(на диоде) к D12, между D12 и GND нужен резистор 10к);
    SCK - D13;
    GND - GND;
    3v3 - 3v3;

    Проверил, с данным вариантом подключением дружат обе библиотеки: MFRC522.h и RFID.h
     
  11. ostrov

    ostrov Гуру

    Сколько считываетелей одновременно работает? Два без проблем и так, три со скрипом, но тоже сгодится, больше - никак.

    74HC125, кстати есть для MISO, не надо диодами ничего городить.
     
    Последнее редактирование: 21 янв 2019
  12. Lega

    Lega Нуб

    Не хотел этого делать, но все-таки чтобы помочь людям, подключил 4шт RFID-RC522, как и предполагал выше, пришлось резистор 10к заменить на 5,1к. Работает 4 считывателя с библиотеками RFID.h и MFRC522.h
    Мультиплексор конечно можно применить, но мне проще 4 диода шотки и один резистор. RST_PIN установил значение 0.
    Так что теория выше верная:)
     

    Вложения:

    • image1.jpeg
      image1.jpeg
      Размер файла:
      696,9 КБ
      Просмотров:
      174
  13. pixel

    pixel Нерд

    Перечитал я тему и так и не понял, так как правильно подключить 2 ридера RC522 к одной ардуине (UNO)? На первой странице какая то схема есть, но после этого столько информации, что так и не ясно по ней ли собирать. На последнем снимке 4 ридера вообще на нано сидят. Подскажите, плиз.
     
  14. b707

    b707 Гуру

    чтоб вы знали - Нано и Уно это одно и тоже
     
  15. ostrov

    ostrov Гуру

    Если коротко: работа более 2х ридеров на одной шине нестабильна. Разные ss не помогают, аппаратное отключение MISO тоже. Во всяком случае с китайскими RC522. А других у нас и нет.
     
  16. pixel

    pixel Нерд

    Мне нужно всего 2 задействовать.
     
  17. pixel

    pixel Нерд

    спасибо, буду знать. Хотя на УНО можно навешать кучу дополнительных плат расширений, а на нано я не видел.
     
  18. b707

    b707 Гуру

    все то же самое можно навесить, если проводами соединить, что зачастую гораздо удобнее, чем жесткий бутерброд
     
  19. pixel

    pixel Нерд

    ясно, я имел в виду сэндвич.