创客小制作(含源代码)《RFID控制器》,用于智能门禁、物流追踪、控制开关等,基于Arduino

创客小制作(含源代码)《RFID控制器》,用于智能门禁、物流追踪、控制物品等,基于Arduino

准备

RFID简介

射频识别即RFID(Radio Frequency IDentification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需建立机械或光学接触。有低频(125k~134.2K)、高频(13.56Mhz)、超高频,微波等技术。RFID读写器也分移动式的和固定式的,目前RFID技术应用很广,如:图书馆,门禁系统,食品安全溯源等。

RFID的工作原理:标签进入磁场后,接收解读器发出的射频信号,凭借感应电流所获得的能量发送出存储在芯片中的产品信息(Passive Tag,无源标签或被动标签),或者由标签主动发送某一频率的信号(Active Tag,有源标签或主动标签),解读器读取信息并解码后,送至中央信息系统进行有关数据处理。

舵机介绍

舵机是一种位置伺服的驱动器,其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。适用于那些需要角度不断变化并可以保持的控制系统。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0 度到180 度。

思路

智能门禁

基于arduino与RFID,可通过RFID技术识别读入IC卡的序号并与设定的序号比较符合则使用舵机打开门禁,由于不同门禁的需要可选择不同的控制器代替舵机,如电磁开关、继电器,红外线发射装置。

物流追踪
关于物流跟踪,使用RFID技术识别读入IC卡的序号并报告给系统即可,其他内容本篇文章暂时讨论

控制物品
思路与智能门禁类似,可通过RFID技术识别读入IC卡的序号根据设定执行相关操作,如流水线上的两种产品贴上两种不同的无线射频标签,RFID技术识别后执行两种不同的操作(如放入不同流水线中),通过电磁开关、继电器,红外线发射等实现。

制作

材料

  1. Arduino
  2. RFID
  3. IC卡
  4. 舵机
  5. 杜邦线

可选材料

  1. LCD1002(显示)
  2. 继电器
  3. 电磁开关
  4. 红外线发射模块

接线

RFID对应Arduino UNO

RFID模块 Arduino UNO
VCC 3.3V
RST 5V
GND GND
MISO 12
MOSI 11
SCK 13
NSS 10
IRQ (不接)

舵机
所有的舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线

感谢阅读

持续更新arduino 树莓派 python linux c语言等等
接到有帮助的话 求点赞👍 求关注❤️ 求分享👥
有问题可以评论
点关注,不迷路
如果有任何错误,如何建议,请批评指教,不胜感激 !

源代码(三个版本)

对代码有疑问可评论

智能门禁

这里以控制舵机为例子,如有需要显示可加上lcd1602详细可前往我的另一篇博客

Arduino实践(二)lcd1602使用说明,源码

/*
RFID模块  Arduino UNO
VCC      3.3V
RST    5V
GND   GND
MISO    12
MOSI   11
SCK   13
NSS   10
IRQ   (不接)
舵机
黄色   信号线
红色   5v
棕色   地级

 */


/*舵机*/
#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
 
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类
int relayPin = 6; //继电器引脚
int key = 7;//按键引脚
int incomedate = 0;//设置变量
String refid1="";

// 初始化数组用于存储读取到的NUID 
byte nuidPICC[4];


Servo myservo;  //创建一个舵机控制对象
                          // 使用Servo类最多可以控制8个舵机
int pos = 90;    // 该变量用与存储舵机角度位置
void setup() { 
   myservo.attach(8);  // 该舵机由arduino第九脚控制
  pinMode(key,INPUT_PULLUP);//按键为上拉输入
   pinMode(relayPin, OUTPUT);
  Serial.begin(9600);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522 
}
 
void loop() {
  myservo.write(0);
   
  if (digitalRead(key)==LOW) 
   {delay(100);
   if (digitalRead(key)==LOW) incomedate = !incomedate;}
  
    if ((incomedate == 0))
    {
      digitalWrite(relayPin, HIGH);
     
    } 
    else if ((incomedate == 1))
    {
      digitalWrite(relayPin, LOW);
    
    }
 
  // 找卡
  if ( ! rfid.PICC_IsNewCardPresent())
   {    delay(500);
        if ( ! rfid.PICC_IsNewCardPresent())
           {incomedate = 1;
            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();
  if((refid1=="1214519892")||(refid1=="73217151153"))    
    {   
      incomedate = 0;
    //判断为真,执行需要的程序。
    Serial.println("已验证");
    myservo.write(pos);        // 指定舵机转向的角度
    delay(3000);                       // 等待15ms让舵机到达指定位置
    myservo.write(0);
      }
    else
    {
      //判断为假,执行需要的程序。
      Serial.println("验证失败");
      }


  
  // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
///// rfid.PICC_HaltA();
 
  // 停止读卡模块编码
/////  rfid.PCD_StopCrypto1();
  refid1="";
  /* if (rfid.uid.uidByte, rfid.uid.size==183624630) 
   { incomedate = !incomedate;}
   */
    
   if ((incomedate == 0))
    {
      digitalWrite(relayPin, HIGH);
    
    } 
    else if ((incomedate == 1))
    {
      digitalWrite(relayPin, LOW);
    
    }
}
  void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : "");
    Serial.print(buffer[i], HEX);
    refid1+=nuidPICC[i];
  }
}
  void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : "");
    Serial.print(buffer[i], DEC);
    
  }
  
}

物流追踪

/*RFID模块*/
/*


RFID模块  Arduino UNO
VCC      3.3V
RST    5V
GND   GND
MISO    12
MOSI   11
SCK   13
NSS   10
IRQ   (不接)

 
 */

#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
 
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类
 
// 初始化数组用于存储读取到的NUID 
byte nuidPICC[4];
 
void setup() { 
  Serial.begin(9600);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522 
}
 
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();
}
 
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);
  }
}

控制继电器

/*


RFID模块  Arduino UNO
VCC      3.3V
RST    5V
GND   GND
MISO    12
MOSI   11
SCK   13
NSS   10
IRQ   (不接)

 
 */



#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
 
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类
int relayPin = 6; //继电器引脚
int key = 7;//按键引脚
int incomedate = 0;//设置变量
String refid1="";
 
// 初始化数组用于存储读取到的NUID 
byte nuidPICC[4];
 
void setup() { 
  pinMode(key,INPUT_PULLUP);//按键为上拉输入
   pinMode(relayPin, OUTPUT);
  Serial.begin(9600);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522 
}
 
void loop() {
   
  if (digitalRead(key)==LOW) 
   {delay(100);
   if (digitalRead(key)==LOW) incomedate = !incomedate;}
  
    if ((incomedate == 0))
    {
      digitalWrite(relayPin, HIGH);
     
    } 
    else if ((incomedate == 1))
    {
      digitalWrite(relayPin, LOW);
    
    }
 
  // 找卡
  if ( ! rfid.PICC_IsNewCardPresent())
   {    delay(500);
        if ( ! rfid.PICC_IsNewCardPresent())
           {incomedate = 1;
            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();
  if((refid1=="1214519892")||(refid1=="73217151153"))    
    {   
      incomedate = 0;
    //判断为真,执行需要的程序。
    Serial.println("已验证");
      }
    else
    {
      //判断为假,执行需要的程序。
      Serial.println("验证失败");
      }


  
  // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
///// rfid.PICC_HaltA();
 
  // 停止读卡模块编码
/////  rfid.PCD_StopCrypto1();
  refid1="";
  /* if (rfid.uid.uidByte, rfid.uid.size==183624630) 
   { incomedate = !incomedate;}
   */
    
   if ((incomedate == 0))
    {
      digitalWrite(relayPin, HIGH);
    
    } 
    else if ((incomedate == 1))
    {
      digitalWrite(relayPin, LOW);
    
    }
}
  void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : "");
    Serial.print(buffer[i], HEX);
    refid1+=nuidPICC[i];
  }
}
  void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : "");
    Serial.print(buffer[i], DEC);
    
  }
  
}

其他相关博客

Arduino小白入门全解,学习笔记

Arduino实践(二)lcd1602使用说明,源码

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章