Arduino简易RFID门禁

it2023-07-25  71

Arduino简易RFID门禁

最近闲着无聊用Arduino以及RC522做了个简单的刷卡门禁,由于不在家无法装到门上,所以就用舵机转动来代替开门的过程。

1. 准备材料 Arduino uno板一块,RC522rfid模块一个,SG90舵机一个,ID卡一张,杜邦线数根

2. 模块之间的接线 Arduino连接RC522(使用SPI总线) 3.3v----3.3v GND—GND 其他数据引脚接线如下

1. ----------------------------------------------------------------------------------------- 2. MFRC522 Arduino Arduino Arduino Arduino Arduino 3. Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro 4. Signal Pin Pin Pin Pin Pin Pin 5. ----------------------------------------------------------------------------------------- 6. RST/Reset RST 9 5 D9 RESET/ICSP-5 RST 7. SPI SS SDA(SS) 10 53 D10 10 10 8. SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16 9. SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14 10. SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15 11. //注意RST引脚是不用接的,否则RC522无法读取数据

舵机连接到Arduino 舵机有三根线,红色是5.5供电,接到Arduino5.5的管脚上,褐色是GND,接到Arduino的GND,橙色是数据线,需要接到Arduino上有脉宽调制功能的管脚(即带有~的管脚),我这里接的是9号管脚。

3. 烧写代码

#include <SPI.h> #include <MFRC522.h> #include <Servo.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); //实例化类 Servo myservo; //实例化舵机 // 初始化数组用于存储读取到的NUID byte nuidPICC[4]; void setup() { Serial.begin(9600); SPI.begin(); // 初始化SPI总线 rfid.PCD_Init(); // 初始化 MFRC522 myservo.attach(9); //初始化舵机,设定为9号引脚 } void loop() { // 找卡 if ( ! rfid.PICC_IsNewCardPresent()) return; // 验证NUID是否可读 if ( ! rfid.PICC_ReadCardSerial()) return; MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); // 检查是否MIFARE卡类型 if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println("不支持读取此卡类型"); return; } // 将NUID保存到nuidPICC数组 for (byte i = 0; i < 4; i++) { nuidPICC[i] = rfid.uid.uidByte[i]; } Serial.print("十六进制UID:"); printHex(rfid.uid.uidByte, rfid.uid.size); Serial.println(); Serial.print("十进制UID:"); printDec(rfid.uid.uidByte, rfid.uid.size); Serial.println(); // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡 rfid.PICC_HaltA(); // 停止读卡模块编码 rfid.PCD_StopCrypto1(); if (nuidPICC[0]==0x13&&nuidPICC[1]==0xD5&&nuidPICC[2]==0x65&&nuidPICC[3]==0x3E) { Serial.print("身份确认,解锁成功"); myservo.write(0); delay(1000); myservo.write(90); delay(1000); } else Serial.print("非系统用户,无法解锁"); } void printHex(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : ""); Serial.print(buffer[i], HEX); } } void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : ""); Serial.print(buffer[i], DEC); } }

这里需要用到RC522的库,自己去下载就行了。

4.实现效果

RFID门禁

遇到的问题 SG90舵机居然无法转90°,无论我设置的是什么角度,它都会转270°以上,我怀疑的舵机的问题;还有就是RC522我自己编的程序读不了校园卡(加密卡),但是例程就可以,应该是我写的程序没把其他卡的类型写进去,后面有时间的话再优化下。

最新回复(0)