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

VaGrAm
Offline
Зарегистрирован: 11.12.2017

Добрый день,

Задача подключить к одному контроллеру (Arduino UNO) 2 RFID считывателя (RC522). Подобную тему нашел тут: http://arduino.ru/forum/programmirovanie/kak-rabotat-s-neskolkimi-rfid-riderami-rc522 но кажется вопрос так и остался открытым.

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

Мой код имеет следующий вид:

#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 что-то подобное (удаление инстанса)?

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

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Инстанс ничего волшебнее, чем манипуляции с SS не делает. Я бы попробовал просто соотв. ногу попереводить в разные состоянии (LOW/HIGH, а то и в INPUT), да пронаблюдать, как реагируют эти ридеры.

VaGrAm
Offline
Зарегистрирован: 11.12.2017

Спасибо за реакцию...

Насколько понял по быстрому ознакомишшись с пинами и поведением ридера: LOW это включить SS (соотвественно и инстанс), а HIGH: вырубить. Так?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

VaGrAm пишет:

Спасибо за реакцию...

Насколько понял по быстрому ознакомишшись с пинами и поведением ридера: LOW это включить SS (соотвественно и инстанс), а HIGH: вырубить. Так?

Попробуй теперь по медленее и внимательнее ознакомится снова.

sadman41
Offline
Зарегистрирован: 19.10.2016

VaGrAm пишет:

Спасибо за реакцию...

Насколько понял по быстрому ознакомишшись с пинами и поведением ридера: LOW это включить SS (соотвественно и инстанс), а HIGH: вырубить. Так?

Не инстанс, а ногу SS одного из ридеров. Т.е., потенциально (если он насильно на ноге не держит активное состояние, а бывает и такое с китайскими модулями), привести его в условное состояние "выкл". Перед использованием ногу вернуть на место.

VaGrAm
Offline
Зарегистрирован: 11.12.2017

Прерывание SS не помогло. Физически стал дергать MISO - заработало. Скорее всего програмыми методами нерешаемо. Буду ставить транзисторы под MISO

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Я же на амперке писал - 74HC125 как самое простое решение.

VaGrAm
Offline
Зарегистрирован: 11.12.2017

Вот и я об этом ;)

VaGrAm
Offline
Зарегистрирован: 11.12.2017
Если кому-то в будущем будет интересно...
Итог: разрулил ситуацию переключением MISO пинов через транзисторы/микросхемы. В частности поставил 74LS125 (аналог 74HC125).