Arduino与Stronglink SL018 RFID模块
本帖最后由 smching 于 2013-10-3 21:58 编辑眾多RFID模块中,Stronglink SL018是我找到最便宜的模块且支持读取及写入。SL018 使用了I2C接口(只使用两条信号线)与外界沟通,支持的RFID卡包括MIFARE Classic 1K, MIFARE Classic 4K 和 MIFARE Ultralight,频率则是13.56MHz。以下是SL018规则说明:
Model
MIFARE Module SL018
Frequency
13.56MHz
Protocol
ISO14443A
Tag supported
Ultralight, NTAG203, MIFARE Mini, MIFARE Classic 1K, MIFARE Classic 4K, FM11RF08
Interface
I2C
Supply voltage
4.4 - 7.0VDC
Dimension
65 × 45 mm
由于Marc Boon已经编写好了SL018用于 Arduino 的程序库(Library),Arduino与SL018进行沟通将会变得非常的容易,只须几行代码,就能读取RFID卡的UID了。
测试Stronglink SL018
测试SL018是否正常工作可以说是非常的简单,只要供电5V至SL018模块就行了,当然这不包括测试I2C接口。
[*]+5V及Gnd分别连接Pin4和Pin5,然後通电
[*]当SL018侦察到MIFARE RFID卡,L3 LED将会转亮
[*]对地(Gnd)测量Pin1(TAG),将会得到3V
[*]将MIFARE RFID卡移开,L3 LED又熄了
简单的说,如果不需要认证,只使用一片SL018模块,通过Pin1(TAG)输出,就可以控制电子设备了。
安装SL018程序库
[*]下载SL018程序库,此程序库也支持SL030 RFID模块
[*]解压ZIP文件(RFIDuino-master.zip)
[*]只需要SL018文件夹,将之拷贝到 arduino的libraries文件夹,如图:
[*]打开arduino软件
[*]单击File>Examples>SL018,看到SL018例子(如图)表示安装成功
上载(Upload)Sketch至Arduino
SL018程序库自带了示范例子,用此例子上载至Arduino来测试最好不过了。
[*]将Arduino连接至电脑
[*]打开arduino软件
[*]单击File>Examples>SL018>UID,是的,就用UID为例子吧!
#include
#include
SL018 rfid;
int led = 13;
void setup()
{
pinMode(led, OUTPUT);
Wire.begin();
Serial.begin(19200);
Serial.println("Show me your tag"); // prompt for tag
}
void loop()
{
rfid.seekTag(); // start seek mode
while(!rfid.available()); // wait until tag detected
Serial.println(rfid.getTagString());// print tag id
}
把上面的例子上载至Arduino後,可以与SL018沟通了。代码是不是很简单?
SL018模块与Arduino连接
SL018的Pin1,Pin2(SDA)及Pin3(SLC),分别连接至Arduino的A3,A4及A5
SL018
Arduino
1(TAG)
A3 (Analog 3)
2 (SDA)
A4 (Analog 4)
3 (SLC)
A5 (Analog 5)
4 (VCC)
VCC
5 (GND)
GND
SL018模块与Arduino沟通
这里我们使用Arduino软件自带的串口监视器(Serial Monitor)来监视与测试
[*]根据以上方式,连接SL018至Arduino
[*]打开Arduino软件,然後运行Serial Monitor
[*]当SL018侦察到MIFARE RFID卡,L3 LED将会转亮,同时Serial Monitor将显示此RFID卡的UID,如图:
认证开关
改进上面的代码,形成了需要认证後才能决定开与关。以下代码使用RFID认证,认证通过後LED会亮,三秒后将会自动熄。
#include
#include SL018 rfid;int led = 13;// Pin 13 has an LED connected on most Arduino boards
String cardUID;
void setup()
{pinMode(led, OUTPUT);// initialize the digital pin as an output.Wire.begin();
Serial.begin(19200);Serial.println("Show me your tag"); // prompt for tag
}void loop()
{
rfid.seekTag();// start seek mode
while(!rfid.available());// wait until tag detected
cardUID = rfid.getTagString();
Serial.println( cardUID);// print tag id
if ( cardUID == "0467CB11E20280") {
digitalWrite(led, HIGH); // turn the LED on
delay(3000);//wait for 3 seconds
digitalWrite(led, LOW); // turn the LED off
}
}
RFID读取与写入示范
接下来是一个比较复杂的示范,功能包括:
[*]读取UID
[*]读取RF卡内的全部信息
[*]写入两字节(2 Bytes)至RF卡
这里使用由SL018程序库自带的sl018demo例子作示范,同样的使用Serial Monitor来监视与测试,baud rate必须设成19200。一切就绪后,开始测试了:
在Serial Monitor输入?将会显示所有指令,如图
a 命指令
是一个切换指令,当Auto read on时,只要 SL018侦察到RF卡在範围内,将会自动读取UID(s 指令)和列出RF卡的全部信息(r 指令)
d 指令
是一个切换指令,用于调试。当Debug on时,Serial Monitor将列出执行指令以及由SL018获得的信息
s 指令
读取与列出RF卡的UID
r 指令
读取与列出RF卡的全部信息
w 指令
写入两个字节
来源:http://ediy.com.my/index.php/2012-10-21-15-15-03/item/63-arduino与stronglink-sl018-rfid模块
By SM Ching
现在RFID模块确实越来越便宜了,40元不到的价格 MicroCao 发表于 2013-4-14 17:54 static/image/common/back.gif
现在RFID模块确实越来越便宜了,40元不到的价格
Parallax RFID 也很多人用,但是价钱不便宜呀
125 kHz,Parallax RFID 属于EM4000家族
只能读,不能写 距离太短了吧!~~ ~搏击长空 发表于 2013-5-28 16:27 static/image/common/back.gif
距离太短了吧!~~
13.56MHz适合用在短距离,比如防盗门,通常小于10cm。
远距离建议使用125 kHz smching 发表于 2013-5-28 18:58 static/image/common/back.gif
13.56MHz适合用在短距离,比如防盗门,通常小于10cm。
远距离建议使用125 kHz
你说的这个价位多少?能读写吗?····· ~搏击长空 发表于 2013-5-29 16:33 static/image/common/back.gif
你说的这个价位多少?能读写吗?·····
你是指13.56MH还是125KHz?
Stronglink SL018与SL030都支持读写。更多资料请看浏览
http://www.stronglink-rfid.com/en/rfid-modules.html smching 发表于 2013-5-30 20:47 static/image/common/back.gif
你是指13.56MH还是125KHz?
Stronglink SL018与SL030都支持读写。更多资料请看浏览
大神,能给推荐一款可以远距离的读RFID的读卡器吗?·····尽量与Arduino兼容:handshake ~搏击长空 发表于 2013-6-8 19:46 static/image/common/back.gif
大神,能给推荐一款可以远距离的读RFID的读卡器吗?·····尽量与Arduino兼容
Cottonwood: Long Range UHF RFID reader UART
范围:1-6米
接口: TTL Uart (RS232)
天线:5dBi or 8dBi directional antenna
<!-- saved from url=(0063)http://junetrading.com/soliddigi.com/upload/file/1309425930.pde -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
#include "WProgram.h"
#include <NewSoftSerial.h>
#include <string.h> //Used for string manipulations
//global
int ledPin = 13; // LED connected to digital pin 13
unsigned charincomingByte;
#define BYTE unsigned char
//software serial debug_uart
#define RXPIN 3//softwareserial
#define TXPIN 4
NewSoftSerialDebug_uart(RXPIN,TXPIN);
//Create a 'fake' serial port. Pin 2 is the Rx pin, pin 3 is the Tx pin.
//SoftwareSerial Debug_uart(3,4);//d3 int 1 as rx pin,d3 t0 as tx pin;
#define DEBUG_TXBUF_SIZE 64
#define DEBUG_RXBUF_SIZE 64
enum command{hardware=0xf0,software,ssid};
BYTE command_hardware[]={0x10,0x03,0x01};//const
BYTE command_software[]={0x10,0x03,0x00};//const
BYTE command_ssid[]={0x43,0x04,0x01,0xcd};//const
static BYTEdebug_txbuf;
static BYTE debug_txbuf_read=0;
static BYTE debug_txbuf_write=0;
//
static BYTE debug_rxbuf;
static BYTE debug_rxbuf_read=0;
static BYTE debug_rxbuf_write=0;
//
//treat serial_uart
#define serial_RXBUF_SIZE64
#define serial_TXBUF_SIZE64
static BYTE serial_rxbuf;
static BYTE serial_rxbuf_read=0;
static BYTE serial_rxbuf_write=0;
//static BYTE gprs_rxbuf_lineWrite;
//
static BYTEserial_txbuf;
static BYTE serial_txbuf_read=0;
static BYTE serial_txbuf_write=0;
static unsigned char debug_rxBuf_Read( unsigned char *data)
{
if(debug_rxbuf_read == debug_rxbuf_write)
return 0;
*data = debug_rxbuf;
debug_rxbuf_read %= DEBUG_RXBUF_SIZE;
return 1;
}
extern unsigned chardebug_rxBuf_readline(unsigned char *buf)
{
unsigned char len;
for( len=0;;len++)
{
if(0==debug_rxBuf_Read(&buf))
break;
}
//buf='\0';
return len;
}
static void debug_rxBuf_Write(unsigned char*Buf,int len)
{
for(int i=0;i<len;i++)
{
debug_rxbuf=Buf;//Buf;
debug_rxbuf_write++;
debug_rxbuf_write %=DEBUG_RXBUF_SIZE;
}
}
static void debug_SendData(unsigned char *P,unsigned char DataLength)
{
Debug_uart.print(*P);
}
static void debug_Send_bytes(void)
{
while(debug_txbuf_read != debug_txbuf_write)
{
if(debug_txbuf_read < debug_txbuf_write)
{
debug_SendData(&debug_txbuf,1);
debug_txbuf_read++;
debug_txbuf_read %= DEBUG_TXBUF_SIZE;
}
if(debug_txbuf_read > debug_txbuf_write)
{
debug_SendData(&debug_txbuf,1);
debug_txbuf_read++;
debug_txbuf_read %= DEBUG_TXBUF_SIZE;
}
}
}
extern void debug_write_txbuf( unsigned char *pcmd, unsigned char len)
{
for(int n=0;n<len;n++)
{
debug_txbuf = pcmd;
debug_txbuf_write++;
debug_txbuf_write %= DEBUG_TXBUF_SIZE;
}
debug_Send_bytes();//start TX BYTES
}
//
static void serial_rxBuf_Write(unsigned char *Buf,int len)
{
for(int i=0;i<len;i++)
{
serial_rxbuf=Buf;
serial_rxbuf_write++;
serial_rxbuf_write %=serial_RXBUF_SIZE;
}
}
extern void serial_rxBuf_lineWrite(void)
{
//
unsigned char tempbyte = 0xff;
while(1)
{
incomingByte = Serial.read();
if(incomingByte == 0xff)
{
incomingByte = Serial.read();
if(incomingByte == 0xff)
{
break;
}
else
{
serial_rxBuf_Write(&tempbyte,1);//save 0xff;dont discard
serial_rxBuf_Write(&incomingByte,1);
}
}
else
serial_rxBuf_Write(&incomingByte,1);
}
}
staticunsigned char serial_rxBuf_Read( unsigned char *data)
{
if(serial_rxbuf_read == serial_rxbuf_write)
return 0;
*data = serial_rxbuf;
serial_rxbuf_read %= serial_RXBUF_SIZE;
return 1;
}
extern unsigned char serial_rxBuf_readline(unsigned char *buf)
{
BYTE len;
for( len=0;;len++)
{
if(0==serial_rxBuf_Read(&buf))
break;
}
//buf='\0';
return len;
}
static void serial_Send_bytes(void)
{
while(serial_txbuf_read != serial_txbuf_write)
{
Serial.print(serial_txbuf);
serial_txbuf_read++;
serial_txbuf_read %= serial_TXBUF_SIZE;
}
}
extern void serial_write_txbuf(unsigned char *pcmd,unsigned char len)
{
for(int n=0;n<len;n++)
{
serial_txbuf = pcmd;
serial_txbuf_write++;
serial_txbuf_write %= serial_TXBUF_SIZE;
}
serial_Send_bytes();
}
void setup() // run once, when the sketch starts
{
delay(200); //wait for v is 5v
pinMode(ledPin, OUTPUT); // sets the digital pin as output
pinMode(TXPIN, OUTPUT); // sets the digital pin as output
Serial.begin(115200);
Debug_uart.begin(4800);
}
void loop() // run over and over again
{
while(Debug_uart.available())
{
incomingByte = Debug_uart.read();
debug_rxBuf_Write(&incomingByte ,1);//only one byte lwm
}
unsigned char tempbuf;
unsigned char templength;
templength=debug_rxBuf_readline(tempbuf);
serial_write_txbuf(tempbuf,templength);
delay(1000);//wait for corresend
if (Serial.available() > 0)
{
serial_rxBuf_lineWrite();
}
templength=serial_rxBuf_readline(tempbuf);
debug_write_txbuf(tempbuf,templength);
digitalWrite(ledPin, HIGH); // sets the LED on//lwm
delay(100); // waits for a second former 1000 lwm
digitalWrite(ledPin, LOW); // sets the LED off
delay(100); // waits for a second former 1000 lwm
}
</pre></body></html>
我没用过此RFID
smching 发表于 2013-6-9 11:15 static/image/common/back.gif
Cottonwood: Long Range UHF RFID reader UART
范围:1-6米
:(好贵呀。我们就有1600的资本。再买点RFID标签,不知道还够不够!~~ 你好,能发一份SL018的程序库给我吗?[email protected] 求详细资料 千积木 发表于 2013-9-12 11:24 static/image/common/back.gif
你好,能发一份SL018的程序库给我吗?
不好意思,漏放了下载连接。我已经更改了。顺便在这里放一个
https://nodeload.github.com/marcboon/RFIDuino/zip/master HeartRain 发表于 2013-9-15 13:39 static/image/common/back.gif
求详细资料
你想要什么资料?
页:
[1]
2