极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 86906|回复: 25

Arduino读取RFID卡

[复制链接]
发表于 2012-5-7 17:10:08 | 显示全部楼层 |阅读模式
本帖最后由 thomas 于 2012-5-7 18:39 编辑

很随意的从tb买了个RF读卡模块,串口的,准备以后加在饮水机上或者改良一下考勤机。
公司的考勤卡都是125k的ID卡,应该可以直接用。


因为是成熟模块,过于简单,半小时就全部搞定了。

补充一个重要信息:由于RX TX口被占用,下一次更新程序时,可能需要断开模块的连接,否则可能会出现程序无法更新的错误。先上模块:

(公司名隐去)

说明:

管脚定义:(从上到下)

GND
VCC(3-5V)
天线1
天线2
EN卡有效信号输出
TXD串口输出
RXD串口输入
性能参数:

输入电压:3~5.5V
输入电流:刷卡电流<25mA
通讯格式:9600-8-1串口输出卡号
(格式:1bit:start、8bit:data、1bit:stop)

有效刷卡高度:3-20cm(视天线、卡和周围环境而定)
使用环境:-25~70摄氏度
尺寸:28mm*20mm(2010最mini版)
发货清单:模块一个,天线一个



Arduino连接方式:

RF模块                  Arduino
1脚                            GND
2脚                            +5v
3脚  天线            
4脚  天线
5脚                            D2
6脚                            RX0
7脚                            TX0

测试代码

  1. //RFID test by Thomas 2012.05.07
  2. int incomingByte = 0;        // for incoming serial data
  3. const int ENPin = 2;     // the number of the EN pin
  4. int ENState = 1;  //default EN state was HIGH

  5. void setup() {
  6.   Serial.begin(9600);        // opens serial port, sets data rate to 9600 bps
  7.   pinMode(ENPin, INPUT);     
  8. }

  9. void loop() {

  10.   // read the state of the EN value:
  11.   ENState = digitalRead(ENPin);

  12.   // check if the EN is LOW,the output the data.
  13.   if (ENState == LOW&&Serial.available() > 0) {     
  14.     // read the incoming byte:
  15.     incomingByte = Serial.read();
  16.     // say what you got:
  17.     Serial.print("I received: ");
  18.     Serial.println(incomingByte, DEC);
  19.   }

  20. }

复制代码
读出数据输出




说下以后的想法:考勤机,一个当日过生日的员工刷考勤卡上班时,如果能给他奏上一曲《生日快乐》,是多么惬意的事情。
饮水机,做成缩小版加油机形式,刷卡饮水,记录每人用水量。(看看谁喝水太少,就应该督促一下。这个纯属无聊,公司肯定不会收水费)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-5-7 17:24:52 | 显示全部楼层
沙发
incomingByte =incomingByte+= Serial.read();这句的语法不太懂
原理是不是有卡放在附近,模块的5脚就会出现低电平,自动在串口输出卡里的数据?
这个能把数据写到卡里的吗?
回复 支持 反对

使用道具 举报

发表于 2012-5-7 17:24:56 | 显示全部楼层
强,程序再麻烦点儿就能取代考勤机了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-7 17:30:12 | 显示全部楼层
本帖最后由 thomas 于 2012-5-7 17:32 编辑
悠然小调 发表于 2012-5-7 17:24
沙发
incomingByte =incomingByte+= Serial.read();这句的语法不太懂
原理是不是有卡放在附近,模块的 ...


嘿嘿,这句是改着玩儿忘了改回来了。

卡在读取范围内,就会输出低电平,然后输出 读出的卡号。

ID卡是最基础的卡,好像只能读,不能写入。

做考勤机,配套个时钟电路,Flash存储应该就可以了。

回复 支持 反对

使用道具 举报

发表于 2012-5-7 17:31:54 | 显示全部楼层
本帖最后由 txmg 于 2012-5-7 17:34 编辑

为什么不能读取卡号????
另外私信 模块地址!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-7 17:34:13 | 显示全部楼层
本帖最后由 thomas 于 2012-5-7 17:41 编辑
txmg 发表于 2012-5-7 17:31
为什么不能读取卡号????


能读啊, 02218289  这个 我在变亮用了int,所以输出就这样了。
默认功能是输出hex的
--------------------------------------------

操作说明:
当在有效的刷卡范围内有卡出现时,LED 灯点亮,并串口输出4
个字节十六进制卡号。如果卡一直检测有效,LED 灯一直点亮,EN
脚一直输出低电平,但串口只输出一次有效的数据。移开卡后,灯熄
灭,管脚恢复到高电平,重新刷卡后继续送出卡号。
回复 支持 反对

使用道具 举报

发表于 2012-5-7 17:35:29 | 显示全部楼层
thomas 发表于 2012-5-7 17:34
能读啊, 02218289  这个

哦!是分开来的啊!可以pm模块地址吗???
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-7 17:44:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-5-7 17:46:49 | 显示全部楼层
要把这些数字合并存到一个变量里,怎么写呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-7 18:35:20 | 显示全部楼层
悠然小调 发表于 2012-5-7 17:46
要把这些数字合并存到一个变量里,怎么写呢?


我还没想好最简洁的方法,目前可以用数组赋值的形式。
u8glib库可以直接显示数组在12864屏上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-7 19:42:01 | 显示全部楼层
改进了一下,以数组的形式显示卡号。这次是以16进制显示的,比较合理。

  1. //RFID test by Thomas 2012.05.07

  2. char Str1[4];
  3. int i=0;
  4. const int ENPin = 2;     // the number of the EN pin
  5. int ENState = 1;  //default EN state was HIGH


  6. void setup(void) {
  7.   Serial.begin(9600);
  8.   pinMode(ENPin, INPUT);     
  9. }
  10. void loop(void) {
  11.   // read the state of the EN value:
  12.   ENState = digitalRead(ENPin);

  13.   // check if the EN is LOW,the output the data.

  14.   if (ENState == LOW&&Serial.available() > 0) {     
  15.     // read the incoming byte:
  16.     Str1[i] = Serial.read();
  17.     if(i>=3){
  18.       i=0;
  19.       Serial.println(" ");
  20.     }
  21.     else{
  22.         Serial.print(Str1[i], HEX);
  23.       i++;
  24.     }
  25.   }
  26.   else{
  27.     i=0;
  28.   }
  29. }

复制代码

评分

参与人数 1 +30 收起 理由
Ansifa + 30

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-7 19:46:50 | 显示全部楼层
自带的卡号是02246681 ,读数是:016FFFFFFB6
公司的某个考勤卡号是12601058 ,读数是:07E4
还有个考勤卡号是13129568, 读数是:0FFFFFF8373

用计算器算了半天都没发现关联,不求甚解的话,还是读十进制吧
回复 支持 反对

使用道具 举报

发表于 2012-5-7 21:06:51 | 显示全部楼层
转化为字符型,把这几个数连起来存到一个字符型变量里可以吗?不知道怎么写?
回复 支持 反对

使用道具 举报

发表于 2012-5-7 23:08:13 | 显示全部楼层
这东西也可以玩玩,但是最近在学画图,没有时间!
回复 支持 反对

使用道具 举报

发表于 2012-7-31 00:46:09 | 显示全部楼层
thomas 发表于 2012-5-7 19:46
自带的卡号是02246681 ,读数是:016FFFFFFB6
公司的某个考勤卡号是12601058 ,读数是:07E4
还有个考勤卡 ...

如果我预先将一个卡号放进一个数组里,然后在读卡的时候进行两个数组匹配,来判断是否是有效的卡,应该如何弄呢,倒腾一晚上都没个头绪。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 20:12 , Processed in 0.045614 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表