基于Arduino开发的简单RFID智能门禁——舵机控制

发布于 2020-08-13  89 次阅读


基于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射频模块ArduinoI2C_LCD1602Arduino
3.3V3.3VVCC5V
RST2GNDGND
GNDGNDSDAA4
IRQ7SCLA5
MISO3
MOSI4
SCK5
SDA6

具体代码如下:

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号才能识别成功

原文:https://blog.csdn.net/weixin_43757283/article/details/100525469?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.channel_param


一个追求爱搞的小逗逼