NFC(近場通信)在兩個小環(huán)形天線之間使用磁感應,常用于各種智能卡的讀寫。項目采用Arduino Uno開發(fā)板讀取PN532 NFC模塊卡,顯示器采用0.96″I2C ?OLED小屏幕。
使用的物料清單如下:
Arduino Nano開發(fā)板
Adafruit PN532 RFID/NFC模塊
SSD1306 0.96″OLED顯示器
跳線
面包板
Arduino IDE(集成開發(fā)環(huán)境)
Adafruit PN532 NFC近場通訊模塊兼容Arduino設備,運用UART串口進行通訊??捎?a target="_blank">USB to UART轉換器,通過電腦進行測試。用戶也可根據自己需要,利用管腳改變數據傳輸方式,如IIC、SPI等。
該PN532 NFC近場通訊模塊基于NXP PN532芯片,包含80C51微控制器內核,集成了13.56MHz下的各種主動/被動式非接觸通信方法和協(xié)議,支持6種不同的工作模式:
讀寫器模式,支持ISO/IEC 14443A / MIFARE機制
讀寫器模式,支持 FeliCa機制
讀寫器模式,支持ISO/IEC 14443B機制
卡操作模式,支持ISO 14443A / MIFARE機制
卡操作模式,FeliCa機制
ISO/IEC18092,ECM340點對點
首先,我們按照電路圖將PN532模塊和OLED顯示器連接到Arduino開發(fā)板:
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開發(fā)板:
#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 ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32;
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup(void)?
{
?Serial.begin(115200);
?while (!Serial) delay(10); // for Leonardo/Micro/Zero
?Serial.println("Hello!");
?nfc.begin();
?if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS))
?{
? ?Serial.println(F("SSD1306 allocation failed"));
? ?for (;;); // Don't proceed, loop forever
?}
?uint32_t versiondata = nfc.getFirmwareVersion();
?if (! versiondata)?
?{
? ?Serial.print("Didn't find PN53x board");
? ?while (1); // halt
?}
?
?// Got ok data, print it out!
?Serial.print("Found chip PN5");?
?Serial.println((versiondata>>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將讀取字節(jié)長度和UID值,并顯示在OLED屏幕上。
?
?
字節(jié)長度有時是4位,有時是7位,這取決于卡的發(fā)卡機構的設定。如果不喜歡這個OLED顯示器,也可以改用串口監(jiān)視工具Serial Monitor來顯示UID值和字節(jié)長度。
審核編輯:湯梓紅
評論
查看更多