基于PN532 NFC近场通讯模块的读卡器

nfc(近场通信)在两个小环形天线之间使用磁感应,常用于各种智能卡的读写。项目采用arduino uno开发板读取pn532 nfc模块卡,显示器采用0.96″i2c  oled小屏幕。
使用的物料清单如下:
arduino nano开发板
adafruit pn532 rfid/nfc模块
ssd1306 0.96″oled显示器
跳线
面包板
arduino ide(集成开发环境)
adafruit pn532 nfc近场通讯模块兼容arduino设备,运用uart串口进行通讯。可用usb to uart转换器,通过电脑进行测试。用户也可根据自己需要,利用管脚改变数据传输方式,如iic、spi等。
该pn532 nfc近场通讯模块基于nxp pn532芯片,包含80c51微控制器内核,集成了13.56mhz下的各种主动/被动式非接触通信方法和协议,支持6种不同的工作模式:
读写器模式,支持iso/iec 14443a / mifare机制
读写器模式,支持 felica机制
读写器模式,支持iso/iec 14443b机制
卡操作模式,支持iso 14443a / mifare机制
卡操作模式,felica机制
iso/iec18092,ecm340点对点
首先,我们按照电路图将pn532模块和oled显示器连接到arduino开发板:
gnd (ground) gnd
vcc (power supply) 5v
sda (data) a4
scl (clock) a5
为读卡器更先进,我们采用adafruit pn532 library,这个数据库兼容arduino uno/nano板,支持i2c or spi通信模式。下载adafruit pn532库、adafruit gfx库和ssd1306 oled库,将如下代码上传到arduino nano开发板:
#include
#include
#include
#include
#include
#define pn532_irq   (2)
#define pn532_reset (3)  // not connected by default on the nfc shield
#define screen_width 128 // oled display width, in pixels
#define screen_height 64 // oled display height, in pixels
#define oled_reset     4 // reset pin # (or -1 if sharing arduino reset pin)
#define screen_address 0x3c ///>24) & 0xff, hex); 
 serial.print(firmware ver. ); 
 serial.print((versiondata>>16) & 0xff, dec); 
 serial.print('.'); serial.println((versiondata>>8) & 0xff, dec);
display.cleardisplay();
 display.setcursor(0, 0); //oled display
 display.settextsize(1);
 display.settextcolor(white);
 display.print(found chip pn5);
 display.print((versiondata >> 24) & 0xff, hex);
display.setcursor(0, 20); //oled display
 display.settextsize(1);
 display.settextcolor(white);
 display.print(firmware ver. );
 display.print((versiondata >> 16) & 0xff, dec);
 display.print(.);
 display.print((versiondata >> 8) & 0xff, dec);
nfc.setpassiveactivationretries(0xff);
// configure board to read rfid tags
 nfc.samconfig();
serial.println(waiting for an iso14443a card);
display.setcursor(0, 40); //oled display
 display.settextsize(1);
 display.settextcolor(white);
 display.print(waiting for nfc card);
 display.display();
}
void loop(void) 
{
 boolean success;
 uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // buffer to store the returned uid
 uint8_t uidlength;        // length of the uid (4 or 7 bytes depending on iso14443a card type)
success = nfc.readpassivetargetid(pn532_mifare_iso14443a, &uid[0], &uidlength);
if (success) {
   serial.println(found a card!);
   serial.print(uid length: );
   serial.print(uidlength, dec);
   serial.println( bytes);
   serial.print(uid value: );
display.cleardisplay();
   display.setcursor(10, 0); //oled display
   display.settextsize(1);
   display.settextcolor(white);
   display.print(uid length:);
   display.print(uidlength, dec);
   display.print( bytes);
display.setcursor(35, 20); //oled display
   display.settextsize(1);
   display.settextcolor(white);
   display.println(uid value: );
   display.setcursor(5, 35); //oled display
for (uint8_t i=0; i < uidlength; i++) 
   {
serial.print( 0x);
     serial.print(uid[i], hex); 
      display.print( 0x);
     display.print(uid[i], hex);
     display.display();
   }
   serial.println();
 // wait 1 second before continuing
 delay(1000);
 }
 else
 {
   // pn532 probably timed out waiting for a card
   serial.println(timed out waiting for a card);
 }
}
上传成功后就可以开始测试了。oled显示器将显示固件版本1.6,并询问是否扫描卡片。
将银行卡、旅行卡、公交卡等nfc卡靠近pn532 nfc模块板,pn532将读取字节长度和uid值,并显示在oled屏幕上。
字节长度有时是4位,有时是7位,这取决于卡的发卡机构的设定。如果不喜欢这个oled显示器,也可以改用串口监视工具serial monitor来显示uid值和字节长度。


全新ES8标配安全和辅助驾驶功能 全方位守护驾乘安全
新松联手江都 总投资超过20亿元建造智能制造产业园
PCB高速信号
NVIDIA推出针对笔记本电脑的Optimus技术
图文详解:为什么HTTPS是安全的
基于PN532 NFC近场通讯模块的读卡器
掺铒光纤放大器的原理及其结构
LED显示屏市场全面复苏,小间距全彩LED显示屏成主力
配电管理系统中的现场总线应用
科技解锁养老“新密码”!这些智能产品成健康养老新商机
物联网技术将会影响到我们生活的方方面面
天嵌科技E9v3卡片电脑-NXP系列简介
嵌入式系统下的数字扩频收发信机通信过程概述
华为进军彩电行业,瞄准8K显示备战5G
S2C推出ALLEGRO第四代H.264 High Profile编码器
iPhone 13最新消息:“真十三香”
机器视觉检测技术在字符识别方面的应用
基于AT25T1024 FLASH的高速SPI接口设计
研究人员使用人工智能来发现疾病高危人群
干式电抗器运行状况及耐压试验