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

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

  1. ostrov

    ostrov Гуру

    Читать ваш глубокий анализ у меня времени нет. Отвечу так, раз регулярно всплывает этот вопрос, значит не у всех и не всегда получается подключить самым очевидным и простым способом который вы тут героически обнаружили. Причины сейчас выяснять не буду, но это факт. Я предложил вариант для таких случаев и для таких ридеров. Работает всегда, со всем и есть возможность для множества дополнительных функций. На этом предлагаю закругляться. Когда наткнетесь на трудности, у вас будет готовое решение.
     
    Последнее редактирование: 12 май 2016
  2. Roon Booh

    Roon Booh Нерд

    По поводу вашего метода, я согласен с тем что это выход в том случае, когда человек приобрёл рфид, у него нога выбора ведомого (SS) прибита и не реагирует, и навыков не хватает ни для диагностики ни для создания на мк своего считывателя.
    Но хочу заметить что рациональное было бы вообще не использовать бракованый рфид, а на базе универсального программируемого МК спроектировать считыватель с необходимыми портами, и переферией. Возможно даже не изобретать велосипеды а поискать на просторах интернета вполне рабочие решения.
    По сути и по секрету с ему свету подмечу что в библиотеке старых версий некорректно дрыгается нога выбора ведомого, об этом я читал ещё года два назад. Ещё есть проблема возникающая по причине не стабилизатор ван ноги питания и питания импульсного характера. Бывают ещё проблемы из за высокой ёмкости шины SPI, попросту шина не успевает вовремя насытиться и разрядиться.
    Ещё бывает что вроде бы не нужную функцию забывают включать после работы каждого объекта рфида.
    И конечно же никто не отменял проблемы с реализацией кода, пару раз видел код в котором есть проверка наличия карты, проверка корректности считывания, но нет очистки буфера.

    На вас же среагировал столь резко из за размытости вашего определения. И да когда человек с достаточно высоким рейтингом размыто говорит и неправильно обобщает, возникает негодование.
    По поводу моим пожеланиям к освоению программирования, то тут все просто, если программист то должны уметь парсить в уме код, точнее хотябы представлять как его будет видеть парсер. Так вот когда хотчьы несколько десятков кодов пропарсите то обратите внимание на неточности своих утверждений.

    Вот как то так, я о одном вы о другом... Так и живём.
     
  3. ostrov

    ostrov Гуру

    Ну да, вы говорите цветок красный, я возражаю что бывает и белый и желтый, на что вы негодуете - зачем они если есть красный?

    А что до ридеров, то далеко не все с неработающей ногой выбора считаются браковаными, некоторые производители видимо считают, что она не нужна и незачем тратить на нее внимание. Я так наткнулся раз, два, потерял время, деньги и чуть не просрочил заказчика. Потому решил сделать универсальное решение да хотя бы на всякий случай. А потом заметил как оно экономит ресурсы главного МК, вместо опросов SPI устройств опрашивает лишь ножки (если связь типа HIGH-LOW) или ком-порт (если связь UART в т.ч. через шину RS485). И номера меток хранятся в модуле, а для удобства сделал так, чтобы записывались сами. В итоге получилось готовое устройство, которое можно использовать вообще самостоятельно, например для открывания замков (при себестоимости рублей 100, напомню). Потому не могу согласиться с мнением, что это никому не нужно и даже вредно. Вот такая моя тз на этот вопрос.
     
  4. ИгорьК

    ИгорьК Оракул Модератор

    Помогли бы товарищу вот здесь. А то столько времени потратили...
     
  5. ох, полемика разгорелась нешуточная, ув. Ostrov, подскажите, тут было несколько примеров программы, я если честно не совсем разобрался с Вашим примером, если выкроите минутку, не могли бы помочь начинающим.
    Суть проблемы в следующем- есть 4 метки и релюшка, когда "таблетки" по местам на метках, релюшка переключается, пробовал по вашему примеру, но из-за отсутствия опыта получилась полная белеберда, не могли бы помочь с этим вопросом?
    подключаю все контакты параллельно, кроме SS-их в каждый отдельный вход
     
  6. Roon Booh

    Roon Booh Нерд

    Я не гуру но смысл в том что, мы создаём экземпляр класса, каждый рфид, отдельный объект и каждый раз когда обращаемся не забываем последние строчки добавлять, вот и все, и не морочте себе головы с левыми платами пожалуйста, просто не забываем писать начало обращения, и функцию после обращения. А так же не забываем правильно инициалищировать. Иначе у вас не только рфид но и ещё что весело на этом интерфейсе будет глючить. Так же не забываем про наводки в проводах.
     
  7. а можно хоть маломальский пример с описанием, хоть на 2 rfid, хоть приблизительно, буду очень благодарен
     
  8. Roon Booh

    Roon Booh Нерд

    Вот мы создаём наши объекты и присваиваемое им каждому свою ногу выбора рфида. Это делается там где мы библиотеки и переменные обьявляем
    Код (C++):


    RFID rfid_1(53, 45);
    RFID rfid_2(48, 45);
    RFID rfid_3(49, 45);
    RFID rfid_4(47, 45);
    RFID rfid_5(42, 45);
    RFID rfid_6(43, 45);
    RFID rfid_7(40, 45);
    RFID rfid_8(41, 45);
    RFID rfid_9(38, 45);

    RFID  rfid[9] {rfid_1, rfid_2, rfid_3, rfid_4, rfid_5, rfid_6, rfid_7, rfid_8, rfid_9};
    Вот мы создаём сколько нам надо этих рфидов, хоть два хоть 25 как у меня было однажды.
     
    Последнее редактирование: 4 авг 2016
  9. Roon Booh

    Roon Booh Нерд

    Вот мы их инициализируем сколько нам надо
    Код (C++):
    void setup()
    {
      Serial.begin(9600);
      SPI.begin();
      rfid_1.init();
      rfid_2.init();
      rfid_3.init();

    }
    Или вот так
    Код (C++):
    void setup()
    {
      Serial.begin(9600);
      SPI.begin();
      rfid[0].init();
      rfid[1].init();
      rfid[2].init();

    }
     
  10. Roon Booh

    Roon Booh Нерд

    А теперь самое главное, что все пропускают...
    Код (C++):
    rfid_1.halt();
    //или
    rfid[0].halt();
    Вот тут не надо забывать вставлять после обращения к конкретному устройству!

    По сути когда мы начинаем обращаться к устройству, на ноге выбора появляется сигнал выбора, и после того как мы перестали обращаться к этому устройству, и хотим делать что то дальше, например обращаться к другому устройству, нужно вернуть ногу выбора устройства в исходное состояние.

    Иначе вы обратились к устройству номер 1. Ногу не привели в исходное состояние и начали общаться со вторым выбрав его, а ваш запрос одновременно начинает слушать два устройства, и одновременно отвечать по разному, естественно в таких случаях появляются легенды о не работающих устройствах.

    И на будущее приводит пример своего кода. Меня тут необоснованно оболгали вот я тут и не появляюсь
     
    Tomasina и Дмитрий Салик нравится это.
  11. Tomasina

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

    Вот и мой черед дошел...
    Разведены 4 ридера (40 см от МК каждый, по витой паре), SDA на каждый отдельно, остальное запараллелено.
    Два любых ридера в любых комбинациях подключения работают без нареканий.
    Подключаю третий - ни один не отвечает.
    Причем при подключении одного конкретного ридера на линии MOSI напряжение снижается на 0,52 В и на линии RST на 0,2 D (три ридера без этого все равно не работают). Цвет платы тот же, номинал элементов тот же, лишь толщина лазерной гравировки на чипе тоньше нежели у остальных.
    Шаманство, однако.
     
    ostrov нравится это.
  12. Tomasina

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

    Вот кусок кода:
    Код (C++):
    void readRFID(byte RF)
    {
      if (!mfrc522[RF]->PICC_IsNewCardPresent()) // если метки нет
      {
        rfid_ID[RF][0] = 0;        // помечаем отсутствие метки в первом индексе UID
        return;
      }
      if (!mfrc522[RF]->PICC_ReadCardSerial())
      {
        rfid_ID[RF][0] = 0;
        return;
      }
      dump_byte_array(mfrc522[RF]->uid.uidByte, 4, RF);
      mfrc522[RF]->PICC_IsNewCardPresent();
      mfrc522[RF]->PICC_ReadCardSerial();
    }
    Где именно вставлять? В конце функции или после каждого вызова PICC_...?
    Оно в любом случае ругается: "class MFRC522' has no member named 'halt'"
     
  13. ostrov

    ostrov Гуру

    Об этом я и говорил. То третий лишний то пятый, причем не обязательно сразу, может и потом в процессе работы. Потому для себя решил отжалеть лишние 100 -150 руб на отдельный МК там где нужна стабильность и не нужны сюрпризы.
     
  14. Tomasina

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

    обновилась библиотека MFRC522.h
    Из замеченных нововведений:
    - умеет определять подключен ли ридер физически
    - выводит версию прошивки чипа NXP (а может его клона, хе-хе...)
    - выводит тип метки
    - умеет перезаписывать ID метки (для перезаписываемых карт MIFARE и MIFARE Classic)
    - появились команды Halt и StopCrypto
    - появилась поддержка выхода IRQ (теперь нет нужды постоянно опрашивать ридер, он сам выдаст прерывание при поднесении карты)
    - расширен список поддерживаемых типов NFC (теперь мой телефон видится как NFC-метка :) )
    - если в зоне видимости находится несколько меток, выводит все их номера, а не только ближайшую (работает нестабильно, видимо антенны перекрываются)
    - появилось детектирование события "метку убрали" (хотя оно и раньше работало, просто раньше было документировано только событие "метку поднесли")
    - примеров стало больше, в том числе скетч работы с несколькими ридерами, скетч клонирования меток, скетч записи на карту произвольных данных, скетч записи номеров меток в EEPROM и др.

    Примечательно, что из 9 имеющихся у меня ридеров только один имеет версию прошивки 0x92 (остальные 0x12), и именно этот ридер безпроблемно работает с любыми другими ридерами, остальные же в паре не работают, так что все описанные в этой теме трудности по сопряжению нескольких ридеров - это аппаратный косяк заводской прошивки ридеров, а не скетча.

    Сама плата версии 2.0 (с прошивкой 0x92) внешне такая же, отличается очень незначительно - появилась металлизация крепежных отверстий, чуть изменилась ширина дорожек (разводка такая же, но дорожки чуть толще) и маркировка двух элементов (обозначения конденсаторов C2 и C3 поменялись местами по сравнению со старыми версиями).
     
    Последнее редактирование: 9 окт 2016
    ostrov нравится это.
  15. talan

    talan Нерд

    библиотека MFRC522.h изменена по отношению к старой , и есть нюансы , rfid.halt(); нет .
    Подключить несколько (сколько есть свободных ножек ) можно и нужно .
    Решение :
    1 посмотреть какую нагрузочную способность имеет интерфейс RC522 вывод MISO- ОЧЕНЬ МАЛЕНЬКУЮ , причём это стандартный цифровой выход !!! - соединять насколько выводов НЕЛЬЗЯ (друг друга грузят)
    надо подключить через много входовой элемент ИЛИ - самый простой - диоды и нагрузочный резистор (4,7к)
    все остальные (кроме SDA) МОЖНО СОЕДИНИТЬ ПАРАЛЛЕЛЬНО - Atmega выдержит .вывод RQ - НЕ ИСПОЛЬЗОВАЛСЯ
    2 Программная часть : тут тоже надо по колдовать
    - создать необходимое количество обявлений ножек SS(SDA)
    #define SS_PIN1 4 //ВЫБОР МОДУЛЯ RC522 1
    MFRC522 mfrc522_1(SS_PIN1, RST_PIN); //ПРИСВОЕНИЕ - СОЗДАНИЕ КЛАССА

    #define SS_PIN2 5 //ВЫБОР МОДУЛЯ RC522 2
    MFRC522 mfrc522_2(SS_PIN2, RST_PIN); //ПРИСВОЕНИЕ - СОЗДАНИЕ КЛАССА

    unsigned long uidDec, uidDecTemp; // для хранения номера метки в десятичном формате
    unsigned long uidDec1; // для хранения номера конкретного модуля
    unsigned long uidDec2; // для хранения номера конкретного модуля
    .......
    - принудительно определить и выставить до инициализации модулей все выводы SS(SDA)
    void setup() {
    pinMode(4, OUTPUT);
    digitalWrite(4,HIGH);
    pinMode(5, OUTPUT);
    digitalWrite(5,HIGH);
    .........

    }
    - не инициализировать модуле в setup
    -тело программы
    void loop() {
    // тут лучше вызвать свою процедуру или скрутить в цикл по количеству модулей
    m5221();
    //далее можем опросить следующие модули
    m5222();// не забываем про индексы mfrc522_2.PCD_Init(); и тд
    .
    .
    // делаем выводы о номерах карточек
    }



    теперь сама процедура считывания на основе библиотеки MFRC522.h
    //*******************************************************************************8
    void m5221() {
    mfrc522_1.PCD_Init(); // инициализация конкретного модуля - иначе будут идти ошибки чтения
    // Поиск новой метки 1
    if ( ! mfrc522_1.PICC_IsNewCardPresent() || ! mfrc522_1.PICC_ReadCardSerial() ) {
    return;
    }
    uidDec = 0;
    // Выдача серийного номера метки.
    for (byte i = 0; i < mfrc522_1.uid.size; i++)
    {
    uidDecTemp = mfrc522_1.uid.uidByte;
    uidDec = uidDec * 256 + uidDecTemp;
    }
    uidDec1 = uidDec; // мы сохранили номер карточки , считанной на первом модуле
    digitalWrite(SS_PIN1,HIGH);//принудительно отключили вывод ss(sda) для этого модуля
    }
    Всё прекрасно работает , читается , определяется

    Удачи всем!
     
    Последнее редактирование: 24 янв 2017
  16. Roon Booh

    Roon Booh Нерд

    Есть ньюанс. Скорость передачи данных по шине, чем она выше тем критичнее шина реагирует на паразитивные ёмкости включая ёмкость шины.
    И тут нужно учесть что дата шлейф должен быть тонкая медь, так как его задача менять потенциал в основном. Но не забывать про питание, если вы тяните шлейф длиной около двух трёх метров, то тут нужно чтобы питающие провода были не большого сопротивления.
    По поводу применения нестандартных решений, то это можно поробывать конвертеры логики на 12в, а для решения проблемы с маленьким кол-вом ног, по быстроте кода выигрывают дешефраторы.

    Столкнулся уже три раза с проблемой длинных проводов, и с успехом запихиваю конвертер ТТЛ на rs232
     
  17. ostrov

    ostrov Гуру

    Вот такую штуку сделал. Себестоимость рублей 200, собирается за 15 минут. Сама запоминает метки и потом на них реагирует. Инфо выдает хоть в виде HIGH - LOW, хоть в UART. Мне удобно.
    [​IMG]
     
  18. Lega

    Lega Нуб

    Выходы действительно соединять НЕЛЬЗЯ, при любом раскладе, поэтому никакими программными путями не получается объединить много RC522. Вариант через логику более правильный. Никакие Halt не помогают, скорее всего время закрытия затвора выходного транзистора у каждого модуля разное, к тому же еще и паразитарные токи изменяют это время. Тоже пробовал объединять, 2 RC522 еще боле менее, 3 уже не стабильность. Да и 2 было что из 100раз, раза 2 не срабатывало.
     
  19. talan

    talan Нерд

    жалко не сделал фото , вчера запустил на атмега 328, с загрузчиком от про мини 8 мгц 3,3v 6 модулей и именно только выводы MISO RC522 через диоды , всё отлично работает никаких косяков и приколов
     
  20. Lega

    Lega Нуб

    Вариант не плохой. А можешь попробовать удлинить проводами 1 из 6-ти считывателей на 2м?
    Тоже не понятно как логика себя поведет, на диоде падает 0,7В + провода. Питание RC522 3,3В, значит логическая единица его примерно 2,5В-0,7-провода. Не на грани ли логическая единица для 328?

    Никто не пробовал соединить RC522 по i2C?, вроде как это идеальный способ работы с х кол-вом считывателей. Библиотека вроде есть i2C.