Подключение 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 как самое простое решение.
Вот и я об этом ;)