美文网首页
No003. 基于Arduino的射频卡控制功能

No003. 基于Arduino的射频卡控制功能

作者: 彩虹直至黑白_Joon | 来源:发表于2021-08-22 21:48 被阅读0次

    1| 功能介绍

    射频卡控制模块主要是对IC/ID卡进行识别,并将接收到的信息传输给Arduino开发板,再由Arduino开发板对其进行认证,此部分编译环境为Arduino IDE,在信息认证匹配后控制舵机开始工作,打开门锁,实现自动开门。在此已经设定好了相应的IC/ID卡,进行多次启动后,使舵机旋转一个适合的角度,恰好打开门锁。元件包括MFRC522模块、Arduino开发板和舵机。

    2| 模块

    Adruino UNO
    RFID-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);
    }
    

    补充:

    1. SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。

    利用SPI可以在软件的控制下构成各种系统。如一个主控制器和几个从控制器、几个从控制器相互连接构成多主机系统(分布式系统)、一个主控制器和一个或几个从I/O设备所构成的各种系统等。在大多数应用场合,可以使用一个主控制器作为主控机来控制数据,并向一个或几个从外围器件传送该数据。从器件只有在主控机发命令时才能接收或发送数据,其数据的传输格式是高位(MSB)在前,低位(LSB)在后。单主系统只有一台主控制器,其他均为从控制器。

    相关文章

      网友评论

          本文标题:No003. 基于Arduino的射频卡控制功能

          本文链接:https://www.haomeiwen.com/subject/nmmhiltx.html