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

Vittorio
Offline
Зарегистрирован: 02.02.2015
Можно ли одним МК рулить несколькими ридерами? В примерах такого не нашел, а по схеме подключения непонятно как задействовать еще несколько.
Замок один, а ридеров надо три (два по обеим сторонам двери и третий у пульта охраны). Расстояние от МК не более 2 метров до каждого.
KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

запросто,там SPI шина, каждому отдельный SS и будут работать.

Vittorio
Offline
Зарегистрирован: 02.02.2015

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

//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

/*
* MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
* The library file MFRC522.h has a wealth of useful info. Please read it.
http://mac86project.altervista.org/
----------------------------------------------------------------------------- Nicola Coppola
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
*            MFRC522      Arduino      Arduino  Arduino    Arduino          Arduino
*            Reader/PCD  Uno          Mega      Nano v3    Leonardo/Micro  Pro Micro
* Signal      Pin          Pin          Pin      Pin        Pin              Pin
* -----------------------------------------------------------------------------------------
* RST/Reset  RST          9            5        D9        RESET/ICSP-5    RST
* SPI SS      SDA(SS)      10            53        D10        10              10
* SPI MOSI    MOSI        11 / ICSP-4  51        D11        ICSP-4          16
* SPI MISO    MISO        12 / ICSP-1  50        D12        ICSP-1          14
* SPI SCK    SCK          13 / ICSP-3  52        D13        ICSP-3          15
*
* The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com.
*/

#include <SPI.h>
#include <MFRC522.h>

/* Set your new UID here! */
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
byte SS_PIN = 10;
#define RST_PIN 9

MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522 instance.
MFRC522::MIFARE_Key key;

void setup(){
  Serial.begin(9600);        // Initialize serial communications with the PC
  pinMode(4, OUTPUT);    // SS для первого считывателя
  pinMode(10, OUTPUT);   // SS для второго считывателя
  while (!Serial);          // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();              // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
  Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!"));

  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  delay(3000);
  Serial.println("Ready...");
}


// But of course this is a more proper approach
void loop() {
  // Look for new cards, and select one if present
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    delay(50);
    return;
  }

  // Now a card is selected. The UID and SAK is in mfrc522.uid.

  // Dump UID
  Serial.print(F("Card ID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.println();

  delay(1000);

  // Подключение нескольких устройств по SPI
  // Да все ясно SCK MISO MOSI паралельно, а CS отдельно. Просто нужно перед обращением к устройству дергать его  CS (установив на всех 1 на нужном 0).
  // http://arduino.ru/forum/obshchii/podklyuchenie-neskolkikh-ustroistv-po-spi#comment-35811
  digitalWrite(SS_PIN, HIGH);
  if (SS_PIN != 4) SS_PIN = 4;
  else SS_PIN = 10;
  digitalWrite(SS_PIN, LOW);
}

Вместе не хотят работать, а при отключении любого из считывателей все работает.

Тогда как? Отрывание ноги питания 3,3 В не помогает (паразитное питание с линий данных). Помогает лишь отрывание GND (на платке индикатор питания начинает мерцать, тоже какое-то питание просачивается, мне это не нравится).

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Vittorio, покажите пальцем, где в вашем коде происходит выбор CS для нужного считывателя.

Что позволяет вам думать, что достаточно создать один объект MFRC522 для обоих считывателей?

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

навскидку - строки 84-85, там циклично меняется пин с 10 на 4. Только вот достаточно ли просто менять пин? Надо же сам ридер еще как-то дергать (инициализировать).

Цитата:
Что позволяет вам думать, что достаточно создать один объект MFRC522 для обоих считывателей?

По коду получается, что всегда работает только один из двух MFRC522, поэтому зачем создавать более одного объекта?

 

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

*facepalm CS задается при инициализации объекта и Ваши манипуляции с переменной SS_PIN до лампочки. Сделайте два объекта, как Вам сказали, или пишите свою библиотеку. 

Vittorio
Offline
Зарегистрирован: 02.02.2015
//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

/*
* MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
* The library file MFRC522.h has a wealth of useful info. Please read it.
<a href="http://mac86project.altervista.org/" rel="nofollow">http://mac86project.altervista.org/</a>
----------------------------------------------------------------------------- Nicola Coppola
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
*            MFRC522      Arduino      Arduino  Arduino    Arduino          Arduino
*            Reader/PCD  Uno          Mega      Nano v3    Leonardo/Micro  Pro Micro
* Signal      Pin          Pin          Pin      Pin        Pin              Pin
* -----------------------------------------------------------------------------------------
* RST/Reset  RST          9            5        D9        RESET/ICSP-5    RST
* SPI SS      SDA(SS)      10            53        D10        10              10
* SPI MOSI    MOSI        11 / ICSP-4  51        D11        ICSP-4          16
* SPI MISO    MISO        12 / ICSP-1  50        D12        ICSP-1          14
* SPI SCK    SCK          13 / ICSP-3  52        D13        ICSP-3          15
*
* The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com.
*/

#include <SPI.h>
#include <MFRC522.h>

/* Set your new UID here! */
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
#define SS1_PIN 4
#define SS2_PIN 10
#define RST_PIN 9
bool SSflag = true;

MFRC522 mfrc522_1(SS1_PIN, RST_PIN);        // Create MFRC522 instance.
MFRC522 mfrc522_2(SS2_PIN, RST_PIN);        // Create MFRC522 instance.
MFRC522::MIFARE_Key key1;
MFRC522::MIFARE_Key key2;

void setup(){
  Serial.begin(9600);        // Initialize serial communications with the PC
  pinMode(4, OUTPUT);    // SS для первого считывателя
  pinMode(10, OUTPUT);  // SS для второго считывателя
  while (!Serial);          // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();              // Init SPI bus
  mfrc522_1.PCD_Init();        // Init MFRC522 card
  mfrc522_2.PCD_Init();        // Init MFRC522 card
  Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!"));

  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  for (byte i = 0; i < 6; i++) {
    key1.keyByte[i] = 0xFF;
    key2.keyByte[i] = 0xFF;
  }
  delay(3000);
  Serial.println("Ready...");
}


// But of course this is a more proper approach
void loop() {
  // Look for new cards, and select one if present
  if ( ! mfrc522_1.PICC_IsNewCardPresent() || ! mfrc522_1.PICC_ReadCardSerial() || ! mfrc522_2.PICC_IsNewCardPresent() || ! mfrc522_2.PICC_ReadCardSerial() ) {
    delay(50);
    return;
  }

  // Now a card is selected. The UID and SAK is in mfrc522.uid.

  // Dump UID
  Serial.print(F("Card1 ID:"));
  for (byte i = 0; i < mfrc522_1.uid.size; i++) {
    Serial.print(mfrc522_1.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522_1.uid.uidByte[i], HEX);
  }
  Serial.println();

  Serial.print(F("Card2 ID:"));
  for (byte i = 0; i < mfrc522_2.uid.size; i++) {
    Serial.print(mfrc522_2.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522_2.uid.uidByte[i], HEX);
  }
  Serial.println();

  delay(1000);

  // Подключение нескольких устройств по SPI
  // Да все ясно SCK MISO MOSI паралельно, а CS отдельно. Просто нужно перед обращением к устройству дергать его  CS (установив на всех 1 на нужном 0).
  // <a href="http://arduino.ru/forum/obshchii/podklyuchenie-neskolkikh-ustroistv-po-spi#comment-35811" rel="nofollow">http://arduino.ru/forum/obshchii/podklyuchenie-neskolkikh-ustroistv-po-spi#comment-35811</a>
  
  if (SSflag == true) {
   digitalWrite(SS1_PIN, HIGH);
   digitalWrite(SS2_PIN, LOW);
   SSflag == false;
  }
  else {
   digitalWrite(SS1_PIN, LOW);
   digitalWrite(SS2_PIN, HIGH);
   SSflag == true;
  }
}

Никакой реакции :( Теперь даже один подключенный считыватель не работает. Видимо, эти имена жестко заданы в библиотеке и менять их нельзя.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Gippopotam пишет:

Vittorio, покажите пальцем, где в вашем коде происходит выбор CS для нужного считывателя.

...

вопрос все еще актуален...

Vittorio
Offline
Зарегистрирован: 02.02.2015
#define SS1_PIN 4     // CS первого считывателя на пине 4
#define SS2_PIN 10   // CS второго считывателя на пине 10

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Vittorio пишет:

#define SS1_PIN 4     // CS первого считывателя на пине 4
#define SS2_PIN 10   // CS второго считывателя на пине 10

 

И?

Во втором сообщении этой темы есть ссылка - почитайте.

Vittorio
Offline
Зарегистрирован: 02.02.2015

Читал. И?

При обмене данными с ведомым устройством, соответствующий ему сигнал SS переводится в активное (низкое) состояние, при этом все остальные сигналы SS находятся в неактивном (высоком) состоянии. 

У меня разве не так? После чтения один ридер переводится в высокое, другой в низкое. При следующем цикле наоборот.
Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

А скетч вообще работает? Меня смущает, что вы работаете с неактивным ридером, одновременно с активным. Я не знаю внутреннего устройства класса - влиять на работу может что угодно.

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

droncs
Offline
Зарегистрирован: 02.02.2015
#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define SS_PIN1 5
MFRC522 mfrc522(SS_PIN, 0); // Create MFRC522 instance.
MFRC522 mfrc523(SS_PIN1, 0); // Create MFRC523 instance.
unsigned long uidDec, uidDecTemp;

boolean Red1 = false;
boolean Red2 = false;
boolean Blue1 = false;
boolean Blue2 = false;

void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
mfrc523.PCD_Init(); // Init MFRC523 card
Serial.println("Waiting for card...");
}

void loop() {
byte status;
byte byteCount;
byte buffer[2]; // длина массива (16 байт + 2 байта контрольная сумма) 
byteCount = sizeof(buffer);
uidDec = 0;

status = mfrc522.PICC_RequestA(buffer, &byteCount);
if (mfrc522.PICC_ReadCardSerial()) {
for (byte i = 0; i < mfrc522.uid.size; i++) { 
uidDecTemp=mfrc522.uid.uidByte[i];
uidDec=uidDec*256+uidDecTemp;
}
if ((uidDec==4088481163) && (Red1==false)){
Serial.println("Red Card logged on Rider 1");
Red1=true;
Red2=false;
}
if ((uidDec==3546663646) && (Blue1==false)){
Serial.println("Blue Card logged on Rider 1");
Blue1=true;
Blue2=false;
}
}
status = mfrc523.PICC_RequestA(buffer, &byteCount); 
if (mfrc523.PICC_ReadCardSerial()) {
for (byte i = 0; i < mfrc523.uid.size; i++) { 
uidDecTemp=mfrc523.uid.uidByte[i];
uidDec=uidDec*256+uidDecTemp;
}
if ((uidDec==4088481163) && (Red2==false)){
Serial.println("Red Card logged on Rider 2");
Red2=true;
Red1=false;
}
if ((uidDec==3546663646) && (Blue2==false)){
Serial.println("Blue Card logged on Rider 2");
Blue2=true;
Blue1=false;
}
}
}

 

Gnomilla
Offline
Зарегистрирован: 10.11.2015

Я работаю создавая различные инстансы класса  MFC522  Целых 5 штук. Но есть проблемма с тем что они могут работать отлично а могут через раз. Из-за чего такая проблемма хз.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Gnomilla пишет:

Я работаю создавая различные инстансы класса  MFC522  Целых 5 штук. Но есть проблемма с тем что они могут работать отлично а могут через раз. Из-за чего такая проблемма хз.

гляньте, сколько свободной памяти.

gekso
gekso аватар
Offline
Зарегистрирован: 27.09.2017

Vittorio Приветсвую. Если не трудно можете помочь как вы решили эту задачу?? у меня тоже такая трудность немогу 2 ридера (RC-522) подключит к одному ардуино (nano)/ спасибо!.

Vittorio
Offline
Зарегистрирован: 02.02.2015

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

Способ принудительной инициализации плюс halt() каждого ридера перед считыванием в 85% случаев работает, если не повезло - заказывать ридер из другой партии (у дрогого продавца).

Logik
Offline
Зарегистрирован: 05.08.2014

В той теме проблемы если на плате "нога выбора ведомого (SS) прибита и не реагирует". Тогда понятное дело, выходы ридера всегда активны и без аппарптного решения никак. Возможно такое и встречается, но мне не попадало. Если SS выведен и работает никаких сложностей нет вобще, ну конечно кроме кривых либ не расчитаных на несколько ридеров.

ПС. Если чё, я брал год назад здесь https://ru.aliexpress.com/item/MFRC-522-RC522-mfrc-522-RFID-RF-IC-card-inductive-module-with-free-S50-Fudan-card/32433898442.html?af=1516381&cv=23588177&cn=41pakak9nrf417b3688oanq8zivap5hl&dp=v5_41pakak9nrf417b3688oanq8zivap5hl&mall_affr=pr1&aff_platform=default&cpt=1529397370022&sk=RzjEaYr&aff_trace_key=954ff61de9224de7bedf69c55e6a1bac-1529397370022-04646-RzjEaYr&terminal_id=d6e353ff3fd8471fb7f1132626613739 нога не "прибита", отлично уживался на одной шине с экраном.

gekso
gekso аватар
Offline
Зарегистрирован: 27.09.2017

Vittorio и Logik спасибо!!!