NFC積木(PN532)

NFC(Near-Field Communication),「近距離通訊」或是「近場通訊」,是一種通訊協定,讓二個裝置在相距幾公分之內進行訊息的交換。像悠遊卡、停車幣、捷運票卡硬幣、大樓進出磁扣等票卡,內部都有一個無電源的小晶片(RFID Tag),當這些票卡靠近NFC的讀卡機時,讀卡機會傳送電波給票卡讓晶片感應生電,晶片有了電力便可以傳送票卡內部儲存的資料給NFC讀卡機而達到通訊的目的。這些晶片都非常小,甚至可以做進貼紙裡,而且每個票卡的晶片都有一個不會和別人重覆的卡號。

PN532就是一種NFC的讀卡晶片,有許多NFC模組內部就是使用PN532晶片,它可以支援UART、I2C、SPI等界面,在這裡,為了方便起見,我所設計的積木支援I2C界面,因此,如果有這個模組的話,要把它調整到I2C的界面。目前我手上有二個PN532的讀卡模組,測試都是可以使用的。

DFRobot的NFC模組

不知名的NFC模組

這個積木所提供的函式,經過實測,只適用於ESP32以及ESP8266,因此,我將這組積木放置於「吉哥積木」→「ESP32」→「模組」→「PN532 NFC讀卡,另外,要使用這組積木,「吉哥積木」必須更新到至少20211207之後的版本。

用手機或是NFC模組感應不同的卡片,遠端開關電燈

範例一:讀取卡號

  1. 必須要將「PN532讀卡機 初始化」積木放置於「開發板初始化」區塊內。

  2. 在「重複執行」區塊內要先放置「PN532讀卡機 感測RFID卡」,讓PN532去偵測有沒有讀到卡片。

  3. 用「PN532讀卡機 讀取到RFID卡?」來判斷是否讀到了RFID 的Tag,判斷完之後,可以利用「PN532讀卡機 偵測到的RFID卡的種類」以及「PN532讀卡機 取得RFID卡號」積木來讀取卡號資訊。這個積木可以讀取二種不同的RFID Tag,一個是「Mifare Classic」,它的卡號是4個bytes(8個16進位數字); 另一種是「Mifare Ultralight」,它的卡號是7個bytes(1416進位數字)。

讀到Mifare Classic卡片,卡號有四個bytes(8個16進位數字)

讀到Mifare Ultralight卡片,卡號有7bytes(14個16進位數字)

範例二:利用不同的卡片控制LED燈開或關

修改範例一,並在P27連接一個LED,記錄上一個範例讀取到的不同卡號,判斷如果讀取到某個卡號,則讓LED亮;如果是另一個卡號,則讓LED燈熄滅。

利用不同卡片的卡號,控制LED燈亮或熄滅

利用不同卡片的卡號,控制LED燈亮或熄滅

範例三:Mifare Classic卡片寫入資料及讀取

Mifare Classic卡片內有16個區段(Sector),編號是0~15每個區段(Sector)有4個區塊(Block),編號是0~3,每個Block有16 byte的空間可以儲存資料。Block 3裡面都已存了控制碼,不能對它進行存取。另外,Sector 0裡面也是不能存的。因此,我們可以儲存的區域從Sector 1的Block 0、1、2,一直到Sector 15的Block 0、1、2,都是我們可以存取的位置。每個Block有16個byte,代表每個Block可以存16個英、數字,或是5個中文字(UTF8的文字,一個字佔3個byte,所以16 bytes可以存5個中文),只要指定Sector及Block的編號,便能在那個區塊進行字串的存取。

以下的範例,在Sector 1的Block 2進行資料的存取,一個Block可以存五個中文,或是16個英數字。

按下A鍵,將字串寫入Sector 1的Block 2

按下B鍵,將Sector 1的Block 2裡的資料讀取出來

範例:Mifare Classic卡片長字串的寫入及讀取

因為一個Block只能存取5個中文,因此我設計了一個長字串存取的積木,直接對一個Sector做存取,一個Sector有三個Block可以存,5*3=15(其實可以存16個中文,因為有一些剩餘的byte),一個Sector可以存16個中文字,或是48個英數字。在這個範例程式裡,因為OLED的寬度只能容納8個中文顯示,因此將長字串切成前後二個部份來顯示,一個中文佔三個字元,因此前八個中文字是字元1到字元24,後八個中文字是字元25到字元48,一般使用是不需要這樣把讀取到的長字串切開的。

按下A鍵,將十六個中文字長字串寫入Sector 1

按下B鍵,將Sector 1的三個Block資料一次讀取出來顯示

範例:Mifare Ultralight卡片的資料寫入及讀取

Mifare Ultralight卡片內部記憶空間較小,記憶單位是Page,一個Page有四個byte,代表只能存4個英數字或是一個中文字Page4~Page39是我們能夠儲存的位置。以下按A鍵將「Hello World!」切成三個字串儲存到Page4、Page5、Page6,按B鍵再依序讀取Page4、Page5、Page6的資料組合成一個字串顯示出來。

按下A鍵,將字串分別寫入Page4、5、6

按下B鍵,將Page4、5、6的資料讀出來並顯示

RFID卡號的讀取以及資料的存取