基于Arduino开发的简单RFID智能门禁——舵机控制
由于有改造家里老式门的冲动,这次做的实验是简单的RFID控制舵机的实验,利用RFID射频识别IC卡的ID号,舵机拉动门锁,适用于家里的普通门改造。
RFID基本原理
无线射频识别即射频识别技术(Radio Frequency Identification,RFID),是自动识别技术的一种,通过无线射频方式进行非接触双向数据通信,利用无线射频方式对记录媒体(电子标签或射频卡)进行读写,从而达到识别目标和数据交换的目的。
RC522
MF RC522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携 式手持设备研发的较好选择
使用材料:
电脑 ------------------ *1
Arduino UNO ----- *1
USB串口线 --------- *1
RFID-RC522 ------- *1
标准S50空白卡 ---- *1
异形卡 --------------- *1
杜邦线 ------------ 若干

实验设计
RC522模块各引脚功能
SDA ---------- 串行数据线(IIC接口时的I/O线);在SPI接口中为NSS(从机标志管脚);
SCK ---------- 连接MCU的SCK信号;
MOSI --------- MCU输出,RC522接收(即主设备输出,从设备输入);
MISO --------- RC522输出,MCU接收(即从设备输出,主设备输入);
IRQ ----------- 中断请求输出;
GND ---------- 接地;
RST ----------- 复位;
3.3V ----------- VCC,工作电
原理图

对应接线如下
RC522射频模块 | Arduino | I2C_LCD1602 | Arduino | |
---|---|---|---|---|
3.3V | 3.3V | VCC | 5V | |
RST | 2 | GND | GND | |
GND | GND | SDA | A4 | |
IRQ | 7 | SCL | A5 | |
MISO | 3 | |||
MOSI | 4 | |||
SCK | 5 | |||
SDA | 6 |
具体代码如下:
lib.zip库文件
LCD1602_I2C转接口的库文件(LiquidCrystal_I2C.h) ↓↓↓
#include <rfid.h> //射频模块
#include <LiquidCrystal_I2C.h> //I²C接口
#include <Wire.h> //LCD
#include <Servo.h> //舵机
LiquidCrystal_I2C lcd(0x27,16,2); //0x27:I2C接口的地址 16,2:可显示16*2的字符串
Servo myservo; //创建一个伺服对象"myservo"
RFID rfid; //创建一个可变类型的RFID
uchar serNum[5]; //创建一个数组来储存ID
void setup()
{
lcd.init(); //初始化 LCD
lcd.backlight(); //打开LCD的背光
Serial.begin(9600);
rfid.begin(7, 5, 4, 3, 6, 2); //rfid.begin(IRQ_PIN,SCK_PIN,MOSI_PIN,MISO_PIN,NSS_PIN,RST_PIN)
delay(100);
rfid.init(); //初始化 RFID
lcd.setCursor(0,0); //把光标定在显示屏的第0列第0行
lcd.print(" Welcome! "); //在LCD" Welcome! "
myservo.attach(8); //说明8号针脚的舵机连接到伺服对象上
myservo.write(0); //舵机归位0°
delay(2000); //delay 2s
}
void loop()
{
uchar status;
uchar str[MAX_LEN];
//检测是否有ID卡,返回ID卡的类型
status = rfid.request(PICC_REQIDL, str);
if (status != MI_OK) //检测是否有卡
{
return;
}
//显示卡的类型
rfid.showCardType(str);
//防止冲突,返回4字节的序列号的卡片
status = rfid.anticoll(str);
if (status == MI_OK)
{
Serial.print("The card's number is: ");
lcd.setCursor(0,0); //LCD的坐标:0列,0行
lcd.print(" ID: ");
memcpy(serNum, str, 5);
rfid.showCardID(serNum); //show the card ID
Serial.println();
//确认IC卡的ID是否为 3AA9EA0B
uchar* id = serNum;
if(id[0]==0x3A && id[1]==0xA9 && id[2]==0xEA && id[3]==0x0B)
{ //该卡号可以更改为自己的IC卡号,包括校园卡等
myservo.write(180); //舵机旋转至180°
Serial.println("Hello Arduino!");
lcd.setCursor(0,1); //显示的坐标:0列,1行
lcd.print(" Hello Arduino! ");
delay(2000);
lcd.clear(); //LCD清屏
myservo.write(0);
}
else
{ //若卡号与上述不符
Serial.println("Hello unkown guy!");
lcd.setCursor(0,1);
lcd.print("Hello unkown guy");
delay(2000);
lcd.clear();
}
}
lcd.setCursor(0,0);
lcd.print(" Welcome! ");
delay(2000);
rfid.halt(); //让IC卡进入休眠状态、防抖
}
由于本实验代码中的ID号是套件中的白卡的ID号,需要将其中的卡号换成自己的IC卡的ID号才能识别成功
叨叨几句... NOTHING