Подключение 2-х RFID считывателей к Arduino
- Войдите на сайт для отправки комментариев
Добрый день,
Задача подключить к одному контроллеру (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 что-то подобное (удаление инстанса)?
Просьба помочь с решением проблемы развив предложенную мной идею или же направив по более правильному пути.
Заранее всем спасибо...
Инстанс ничего волшебнее, чем манипуляции с SS не делает. Я бы попробовал просто соотв. ногу попереводить в разные состоянии (LOW/HIGH, а то и в INPUT), да пронаблюдать, как реагируют эти ридеры.
Спасибо за реакцию...
Насколько понял по быстрому ознакомишшись с пинами и поведением ридера: LOW это включить SS (соотвественно и инстанс), а HIGH: вырубить. Так?
Спасибо за реакцию...
Насколько понял по быстрому ознакомишшись с пинами и поведением ридера: LOW это включить SS (соотвественно и инстанс), а HIGH: вырубить. Так?
Спасибо за реакцию...
Насколько понял по быстрому ознакомишшись с пинами и поведением ридера: LOW это включить SS (соотвественно и инстанс), а HIGH: вырубить. Так?
Не инстанс, а ногу SS одного из ридеров. Т.е., потенциально (если он насильно на ноге не держит активное состояние, а бывает и такое с китайскими модулями), привести его в условное состояние "выкл". Перед использованием ногу вернуть на место.
Прерывание SS не помогло. Физически стал дергать MISO - заработало. Скорее всего програмыми методами нерешаемо. Буду ставить транзисторы под MISO
Я же на амперке писал - 74HC125 как самое простое решение.
Вот и я об этом ;)