创客小制作(含源代码)《RFID控制器》,用于智能门禁、物流追踪、控制物品等,基于Arduino
目录
- 创客小制作(含源代码)《RFID控制器》,用于智能门禁、物流追踪、控制物品等,基于Arduino
- 准备
- RFID简介
- 舵机介绍
- 思路
- 制作
- 材料
- 接线
- 感谢阅读
- 源代码(三个版本)
- 智能门禁
- 物流追踪
- 控制继电器
- 其他相关博客
准备
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技术识别后执行两种不同的操作(如放入不同流水线中),通过电磁开关、继电器,红外线发射等实现。
制作
材料
- Arduino
- RFID
- IC卡
- 舵机
- 杜邦线
可选材料
- LCD1002(显示)
- 继电器
- 电磁开关
- 红外线发射模块
接线
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);
}
}