Подскажите пожалуйста, возможно ли одновременное подключение этих двух компонентов к Arduino UNO если они используют одни и те же выводы для работы?
если они используют одни и те же выводы - нет, хотя есть вариант перемычками перебросить RFID на другие порты
RFID сканер выполнен не в формате шилда, а потому механических проблем с переназначением выводов нет. Судя по маркировке полагаю, что данные модули пересекаются на SPI, что вполне нормально. Главное, дать им разные SS (CS,CSN). У Ethernet Shield, скорее всего, эти SS традиционно назначены на 10 для Ethernet, и 4 для SD. Для RFID надо для него выбрать любой свободный пин. Маркировку на фото RFID видно не очень хорошо, похоже, что SS - это крайний контакт, противоположный 3.3 В. Не исключено, что придется подкорректировать библиотеку сканера, если в ней SS прописан строго, без возможности назначения.
Если они управляются по SPI, то теоретически можно. Главное, развести по разным пинам чип-селекторы и другие дополнительные пины, которые нужны, но к SPI отношения не имеют. И еще бы понять, какой именно пин для чего нужен, поскольку маркируют из порой весьма разнообразно. На практике же могут быть разного рода казусы в виде не совсем правильной реализации SPI, что приводит к разного рода конфликтам. Так что только практическая проверка может дать ответ на вопрос о возможности такого подключения. И библиотеку устройства не мешает проверить на предмет наличия ошибок, препятствующей совместной работе устройств на шине SPI, как одинаковых, так и разных.
Делал два устройства на SPI( SD, NFC ). Покупал дорогие шилды в Амерке. Но зато проблем особых небыло. Код выбора устройств SPI у меня получился таким: Код (Text): const char epicfail[] = "EPIC FAIL!"; const char ok[] = "Ok."; void selectSPI( int pin, bool init = false ) { static int lastSelect_pin = -1; const int offsx = 5; if( lastSelect_pin == pin ) return; lastSelect_pin = pin; if( pin == SD_pin ) { digitalWrite( NFC_pin, HIGH ); digitalWrite( SD_pin, LOW ); if( init ) { printLCD( 0, 1, " SD "); if(!SD.begin()) { printLCD( offsx, 1, epicfail ); while( true ); } printLCD( offsx, 1, ok ); }else SD.begin(); } if( pin == NFC_pin ) { digitalWrite( SD_pin, HIGH ); digitalWrite( NFC_pin, LOW ); nfc.begin(); if( init ) { printLCD( 0, 1, " NFC "); uint32_t versiondata = nfc.getFirmwareVersion(); if( !versiondata ) { printLCD( offsx, 1, epicfail );//Didn't find PN53x board while ( true ); // halt } printLCD( offsx, 1, ok ); } nfc.SAMConfig(); } }
Использование: Код (Text): void setup() { lcd.begin(16, 2); pinMode( SD_pin, OUTPUT ); pinMode( NFC_pin, OUTPUT ); printLCD( 0, 0, " Initialization "); selectSPI( SD_pin, true ); delay( init_delay ); selectSPI( NFC_pin, true ); delay( init_delay ); lcd.clear(); } void loop(void) { /*вырезал*/ selectSPI( NFC_pin ); /*работа с NFC*/ selectSPI( SD_pin ); /*работа с SD*/ }
Вопрос решен!))))) Можно хоть 5 RFID RC522 повесить Код (Text): #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==46015106) && (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==46015106) && (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; } } }