在本教程中,我们将设计一个使用 STM32 和 RFID Reader读取 RFID 卡的系统。RFID代表射频识别,它通过使用无线电频率读取信息。RFID 用于许多身份验证系统,如电梯停车系统、自动收费、在医院维护患者信息、自动数据收集等。
所需组件
STM32F103C8(蓝色药丸板)
EM-18 RFID阅读器模块
射频识别卡
16x2 液晶显示模块
面包板
连接电线
在将 RFID 与 STM32 连接之前,首先我们将了解 RFID 标签和 RFID 阅读器。
射频识别标签
RFID标签由带有线圈天线的微芯片组成,可以与附近的阅读器进行无线通信。市场上有各种不同形状和尺寸的 RFID 标签。他们中很少有人使用不同的频率进行通信。我们将使用保存唯一 ID 数据的125Khz 无源 RFID 卡。
当您将 RFID 标签放在强光前时,您可以观察标签内部存在的线圈和微芯片。
基本上有两种类型的RFID标签:无源和有源
无源 RFID 标签从读取器模块(如 EM-18)产生的磁场中获取能量,并使用它为微芯片的电路供电。然后芯片将信息发送给阅读器。
EM-18 RFID阅读器
每张 RFID 卡都嵌入了唯一的 ID,RFID 阅读器用于读取 RFID 卡号。 EM-18 RFID 阅读器 工作频率为 125 KHz,带有片上天线,可以使用 5V 电源供电。它提供串行输出和weigand 输出。范围在8-12cm左右。串口通讯参数为9600bps,8个数据位,1个停止位。
EM-18 RFID 阅读器提供的输出为 12 位 ASCII 格式。在 12 位中,前 10 位是卡号,后两位是卡号的 XOR 结果。最后两位数字用于错误检查。
例如,从读卡器读取的卡号为 0200107D0D62,则卡上的卡号如下所示。
02 – 序言
00107D0D = 1080589 十进制。
62 是 (02 XOR 00 XOR 10 XOR 7D XOR 0D) 的 XOR 值。
因此卡上的数字是 0001080589。
EM-18 的针脚细节
EM-18 RFID 阅读器有九个引脚。九个引脚中,有两个引脚没有连接,所以我们基本上要考虑七个端子。下表显示了 EM-18 的引脚说明。
EM-18 RFID 模块规格
读取距离:10cm
工作温度:0ºC 至 +80ºC
通讯参数:9600bps
电流消耗:《50mA
工作频率:125 kHz
工作电压:5v
电路图和连接
STM32F103C8 和 16x2 LCD 之间的连接
STM32F103C8 和 EM-18 读卡器模块之间的连接
对 STM32F103C8 进行编程以读取 RFID
在我们之前的教程中,我们了解了 使用 USB 端口对 STM32F103C8T6 板进行编程 。所以我们现在不需要 FTDI 程序员。只需通过 STM32 的 USB 端口将其连接到 PC 并开始使用 ARDUINO IDE 进行编程。 在 ARDUINO IDE 中对 STM32 进行编程 以读取 RFID 标签非常简单
1.首先,包含LCD显示库,用于使用LCD显示功能。然后定义 LCD 引脚并初始化 LCD 显示。要了解有关LCD 与 STM32F103C8 接口的更多信息,请点击链接。
#include
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
2.接下来在void setup()
我们需要将LCD 显示模式设置为 16x2 并以 9600 的波特率与引脚 PA10 开始串行通信(这是与 EM-18 TX 引脚相连的 STM32F103C8 的 SERIAL1 通信端口 RX1。
lcd.begin(16, 2);
Serial1.开始(9600);
pinMode(PA10,输入);
3.接下来显示欢迎信息并在一段时间后清除。
lcd.print("电路文摘"); //在 LCD 显示屏上打印
lcd.setCursor(0, 1); //设置课程到第二行
lcd.print("RFID WITH STM32"); //以 LCD 显示
延迟打印(5000);//延迟5秒
lcd.clear(); //清除LCD显示
lcd.setCursor(0,0); //将光标设置在第一行
lcd.print("RFID TAG NO:"); //在 LCD 显示屏上打印
lcd.setCursor(0,1); //将光标设置在第二行
4.在void loop()
一旦来自 EM-18 RFID 阅读器模块(标签 ID)的数据在 STM32F103C8 的串行引脚上可用,字符就会被逐位存储并在 LCD 显示屏上逐个显示。
{
while(Serial1.available() && count < 12)
{
RFID[计数] = Serial1.read();
计数++;
lcd.print(RFID[计数]);
if (count==12)
{
lcd.print(" ");
计数 = 0;
lcd.setCursor(0, 1);
}
}
}
现在只需在 STM32 中上传完整的代码,您的系统就可以工作了。只需将任何 RFID 标签放在 RFID 阅读器上,您就会看到标签 ID 出现在 16x2 LCD 显示屏上。
//连接EM-18 RFID阅读器模块与STM32F103C8
//电路文摘
#include //使用LCD显示函数的库
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //提及与LCD连接到STM32F103C8的引脚名称
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化液晶显示器
整数计数 = 0;
字符 RFID[12];//存储12个字符ID的数组
无效设置()
{
lcd.begin(16, 2); // 设置 LCD 为 16x2 类型
Serial1.开始(9600);//以 9600 波特率开始串行通信
pinMode(PA10,输入);//将 PA10 设置为 EM-18 的输入引脚
lcd.print("电路文摘"); //在液晶显示器上打印
lcd.setCursor(0, 1); //设置课程到第二行
lcd.print("STM32 RFID"); //在液晶显示器上打印
延迟(5000);//延迟5秒
lcd.clear(); //清除液晶显示
lcd.setCursor(0,0); //设置光标在第一行
lcd.print("RFID标签号:"); //在液晶显示器上打印
lcd.setCursor(0,1); //将光标设置在第二行
}
无效循环()
{
while(Serial1.available() && count < 12) // While 循环读取 12 个字符并将它们存储在输入数组中
{
RFID[计数] = Serial1.read(); //一一存储12个字符
计数++;
lcd.print(RFID[计数]); //在LCD上一一显示12个字符
如果(计数==12)
{
lcd.print("");
计数 = 0; // 读取 12 个字符后开始等待第二个 ID
lcd.setCursor(0, 1); //移动课程开始。
}
}
}
相关文章