1| 功能介绍
射频卡控制模块主要是对IC/ID卡进行识别,并将接收到的信息传输给Arduino开发板,再由Arduino开发板对其进行认证,此部分编译环境为Arduino IDE,在信息认证匹配后控制舵机开始工作,打开门锁,实现自动开门。在此已经设定好了相应的IC/ID卡,进行多次启动后,使舵机旋转一个适合的角度,恰好打开门锁。元件包括MFRC522模块、Arduino开发板和舵机。
2| 模块
Adruino UNORFID-RC522
舵机
器件名 | 引脚名 | Arduino开发板引脚 |
---|---|---|
MFRC522 | RST | 9 |
MFRC522 | SDA | 10 |
MFRC522 | MOSI | 11 |
MFRC522 | MISO | 12 |
MFRC522 | SCK | 13 |
MFRC522 | VCC | 3.3V |
MFRC522 | GND | GND |
舵机(SG90) | URXD | 8 |
舵机(SG90) | VCC | 5V |
舵机(SG90) | GND | GND |
3| 代码实现
需要加载MFRC522.h函数库
// --------------
// 射频卡控制模块
//----------------
# include <SPI.h>
# include <MFRC522.h>
# define USER_NUM 4
byte servoRun = 0; //舵机是否运行
MFRC522 rfid(10, 9); /*此处引用了库文件RFID, Arduino开发板引脚10接RFID中的SDA、引脚8接RST、引脚13接SCK、引脚11接MOSI、引脚12接MISO,RQ不接 */
int userCard[USER_NUM][4] ={
// RFID定义库
{170,128,31,63},
{170,128,31,63},
{170,128,31,63},
{170,128,31,63}
};
void setup() { //初始化
Serial.begin(9600); //
SPI.begin();
rfid.PCD_Init(); // RFID 初始化
pinMode(8,OUTPUT); //舵机定义引脚及工作模式
}
void loop() {
if(servoRun == 1){ // 舵机运行变量若为1,则运行。
servoControl(); // 舵机控制函数。
}
if (!rfid.PICC_IsNewCardPresent()) return; // 找卡
if (!rfid.PICC_ReadCardSerial()) return; // 验证NUID是否可读
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K){// 检查是否MIFARE卡类型
Serial.println("不支持读取此卡类型");
return;
}
byte i;
for (i=0; i<USER_NUM; i++){ // 判断卡是否为通行卡。
byte i2;
for(i2=0; i2<4; i2++){ // 遍历userCard中所有卡。
if(rfid.uid.uidByte[i2] != userCard[i][i2]) break; // break时,表示此卡不是通行卡。
}
if(i2 == 4){ // i2为4,表示此卡的四位值都验证通过。
Serial.println("Find an accessful card."); // 输出成功信息。
servoRun = 1; // 将开门变量置1。
break; // 已找到通行卡,跳出循环。
}
}
if(i==USER_NUM){ // 若i等于通行用户数量,则上层循环未找到通行卡。
Serial.print("Find a unknown card, its uid:");
for(i=0; i<4; i++){ // 输出此卡UID。
Serial.print(rfid.uid.uidByte[i], DEC);
Serial.print(" ");
}
Serial.println();
}
rfid.PICC_HaltA(); // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
rfid.PCD_StopCrypto1(); // 停止读卡模块编码
}
void servoControl(){ // 舵机控制函数。
Serial.println("Servo run!"); // 函数运行输出标识。
servoPulse(0); // 舵机转至0度。
delay(1000); // 等待舵机运转。
servoPulse(180); // 舵机转至180度。
servoRun = 0; // 舵机运行变量置零。
}
void servoPulse(int myangle) // 定义一个脉冲函数,作者:https://blog.csdn.net/sss_369/article/details/52894347
{
int pulseWidth=(myangle*11)+500;// 将角度转化为500-2480 的脉宽值
digitalWrite(8,HIGH); // 将舵机接口电平至高
delayMicroseconds(pulseWidth); // 延时脉宽值的微秒数weimiao
digitalWrite(8,LOW); // 将舵机接口电平至低
delay(20-pulseWidth/1000);
}
补充:
- SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。
利用SPI可以在软件的控制下构成各种系统。如一个主控制器和几个从控制器、几个从控制器相互连接构成多主机系统(分布式系统)、一个主控制器和一个或几个从I/O设备所构成的各种系统等。在大多数应用场合,可以使用一个主控制器作为主控机来控制数据,并向一个或几个从外围器件传送该数据。从器件只有在主控机发命令时才能接收或发送数据,其数据的传输格式是高位(MSB)在前,低位(LSB)在后。单主系统只有一台主控制器,其他均为从控制器。
网友评论