37款傳感器與執行器的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止這37種的。鑒於本人手頭積累了一些傳感器和執行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這里准備逐一動手嘗試系列實驗,不管成功(程序走通)與否,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗九十八:MFRC-522 RC522 RFID射頻 IC卡感應模塊讀卡器S50復旦卡鑰匙扣模組
MF RC522
是應用於13.56MHz 非接觸式通信中高集成度讀寫卡系列芯片中的一員。是NXP 公司針對“三表”應用推出的一款低 電壓、低成本、體積小的非接觸式讀寫卡芯片,是智能儀表和便攜式手持設備研發的較好選擇。
MF RC522特點和優勢
高度集成的模擬電路來解調和解碼的響應
緩沖的輸出驅動器,用於連接一個天線的最小數量
外部元件
支持ISO / IEC 14443 A / MIFARE
典型操作距離在讀/寫模式下可達至50mm視
天線的尺寸和調整
支持MF1xxS20 , MF1xxS70和MF1xxS50在讀/寫模式加密
支持ISO / IEC 14443高達848 kBd的更高傳輸速度的通信
支持MFIN / MFOUT
額外的內部電源IC智能卡,通過MFIN / MFOUT連接
支持的主機接口
MFRC522是一個高度集成的讀取器/寫入器IC,適用於非接觸式通信
在13.56MHz 。該MFRC522讀卡器支持ISO / IEC 14443 A / MIFARE模式。
該MFRC522的內部發射器能夠驅動一個讀/寫器天線設計
符合ISO / IEC 14443 A / MIFARE卡和轉發器,無需額外通信
有源電路。接收器模塊提供了一個強大而英法fi cient實現
從ISO / IEC解調和解碼信號14443 A / MIFARE兼容卡
轉發器。數字模塊管理的完整的ISO / IEC 14443 A和取景
錯誤檢測(奇偶和CRC )功能。
該MFRC522支持MF1xxS20 , MF1xxS70和MF1xxS50產品。該MFRC522
支持非接觸式通信,並使用MIFARE更高的傳輸速度高達
848 kBd的兩個方向。
提供了下面的主機接口:
•串行外設接口(SPI )
•串行UART (類似與RS232電平依賴於引腳電壓源)
•I2C- BUS接口
MF522-AN模塊采用Philips MFRC522原裝芯片設計讀卡電路,使用方便,成本低廉,適用於設備開發、讀卡器開發等高級應用的用戶、需要進行射頻卡終端設計/生產的用戶。本模塊可直接裝入各種讀卡器模具。模塊采用電壓為3.3V,通過SPI接口簡單的幾條線就可以直接與用戶任何CPU主板相連接通信,可以保證模塊穩定可靠的工作、讀卡距離遠;
【電氣參數簡介】
工作電流:13—26mA/直流3.3V
空閑電流:10-13mA/直流3.3V
休眠電流:<80uA
峰值電流:<30mA
工作頻率:13.56MHz
支持的卡類型:mifare1 S50、mifare1 S70、mifare UltraLight、mifare Pro、mifare Desfire
產品物理特性:尺寸:40mm×60mm
環境工作溫度:攝氏-20—80度
環境儲存溫度:攝氏-40—85度
環境相對濕度:相對濕度5%—95%
【模塊接口SPI參數】
數據傳輸速率:最大10Mbit/s
MFRC-522 RC522 RFID射頻 IC卡感應模塊讀卡器S50復旦卡鑰匙扣模組
模塊參考電原理圖
射頻卡
非接觸式IC卡又稱射頻卡,由IC芯片、感應天線組成,封裝在一個標准的PVC卡片內,芯片及天線無任何外露部分。是世界上最近幾年發展起來的一項新技術,它成功的將射頻識別技術和IC卡技術結合起來,結束了無源(卡中無電源)和免接觸這一難題,是電子器件領域的一大突破。卡片在一定距離范圍(通常為5—10cm)靠近讀寫器表面,通過無線電波的傳遞來完成數據的讀寫操作。
工作原理
射頻讀寫器向IC卡發一組固定頻率的電磁波,卡片內有一個LC串聯諧振電路,其頻率與讀寫器發射的頻率相同,這樣在電磁波激勵下,LC諧振電路產生共振,從而使電容內有了電荷;在這個電荷的另一端,接有一個單向導通的電子泵,將電容內的電荷送到另一個電容內存儲,當所積累的電荷達到2V時,此電容可作為電源為其它電路提供工作電壓,將卡內數據發射出去或接受讀寫器的數據。
發射原理
非接觸性IC卡與讀卡器之間通過無線電波來完成讀寫操作。二者之間的通訊頻率為13.56MHZ。非接觸性IC卡本身是無源卡,當讀寫器對卡進行讀寫操作時,讀寫器發出的信號由兩部分疊加組成:一部分是電源信號,該信號由卡接收后,與本身的L/C產生一個瞬間能量來供給芯片工作。另一部分則是指令和數據信號,指揮芯片完成數據的讀取、修改、儲存等,並返回信號給讀寫器,完成一次讀寫操作。讀寫器則一般由單片機,專用智能模塊和天線組成,並配有與PC的通訊接口,打印口,I/O口等,以便應用於不同的領域。
Miafre 1 s50 感應式IC卡
◇ 芯 片: Philips Mifare 1 S50
◇ 存儲容量: 8Kbit ,16個分區,每分區兩組密碼
◇ 工作頻率: 13.56MHZ
◇ 通訊速度: 106Kboud
◇ 讀寫距離: 2.5—10CM
◇ 讀寫時間: 1-2MS
◇ 工作溫度: -20℃-85℃
◇ 擦寫次數: >100000次
◇ 數據保存: >10年
◇ 規 格: 0.87×85.5×54/ 非標卡
◇ 封裝材料: PVC、PET、0.13銅錢
◇ 封裝工藝: 超聲波自動植線/自動碰焊
◇ 制作標准: ISO 14443, ISO 10536
◇ 應用范圍: 企業/校園一卡通、公交儲值卡、高速公路收費、停車場、小區管理等
實驗原理
RFID系統組成
RFID 技術利用無線射頻方式在閱讀器和射頻卡之間進行非接觸雙向數據傳輸,以達到目標識別和數據交換的目的。最基本的 RFID 系統由三部分組成:
1. 標簽(Tag,即射頻卡):由耦合元件及芯片組成,標簽含有內置天線,用於和射頻天線間進行通信。
2. 閱讀器:讀取(在讀寫卡中還可以寫入)標簽信息的設備。
3. 天線:在標簽和讀取器間傳遞射頻信號。
工作原理
MCU通過對讀卡器芯片內寄存器的讀寫來控制讀卡器芯片,讀卡器芯片收到MCU發來的命令后,按照非接觸式射頻卡協議格式,通過天線及其匹配電路向附近發出一組固定頻率的調制信號(13.56 MHz)進行尋卡,若此范圍內有卡片存在,卡片內部的LC諧振電路(諧振頻率與讀卡器發送的電磁波頻率相同)在電磁波的激勵下,產生共振,在卡片內部電壓泵的作用下不斷為其另一端的電容充電,獲得能量,當該電容電壓達到2 V時,即可作為電源為卡片的其他電路提供工作電壓。 當有卡片處在讀卡器的有效工作范圍內時,MCU向卡片發出尋卡命令,卡片將回復卡片類型,建立卡片與讀卡器的第一步聯系,若同時有多張卡片在天線的工作范圍內,讀卡器通過啟動防沖撞機制,根據卡片序列號來選定一張卡片,被選中的卡片再與讀卡器進行密碼校驗,確保讀卡器對卡片有操作權限以及卡片的合法性,而未被選中的則仍然處在閑置狀態,等待下一次尋卡命令。密碼驗證通過之后,就可以對卡片進行讀寫等應用操作。
RC522模塊
模塊的射頻讀寫芯片應該是飛利浦的 MF RC522,在上一篇文章我應該已經附上了英文和中文的手冊。MF RC522提供了3種接口模式:高達10 Mb/s的SPI、I2C總線模式(快速模式下能達400 kb/s,而高速模式下能達3.4 Mb/s)、最高達1228.8 kb/s的UART模式。買來的模塊采用了第一種模式——四線制SPI,通信中的時鍾信號由 Arduino 產生,MF RC522芯片設置為從機模式,接收來自 Arduino 的數據以設置寄存器,並負責射頻接口通信中相關數據的收發。數據的傳輸路徑為:Arduino 通過 MOSI 線將數據發到 MF RC522,MF RC522 通過 MISO 線發回至 Arduino。
RC522模塊各引腳功能
SDA -- 串行數據線(IIC接口時的I/O線);在SPI接口中為NSS(從機標志管腳);
SCK -- 連接MCU的SCK信號;
MOSI -- MCU輸出,RC522接收(即主設備輸出,從設備輸入);
MISO -- RC522輸出,MCU接收(即從設備輸出,主設備輸入);
IRQ -- 中斷請求輸出;
GND -- 接地;
RST -- 復位;
3.3V -- VSS,工作電壓,若使用的事5V的MCU,注意分壓。
實驗開源代碼
/* 【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程) 實驗九十八:MFRC-522 RC522 RFID射頻 IC卡感應模塊讀卡器S50復旦卡鑰匙扣模組 1、工具-管理庫-搜索“MFRC522”庫-安裝 2、項目:使用MFRC522 RFID和Arduino讀寫標簽 3、RFID與Arduino Uno的連線 SDA------------------------Digital 10 SCK------------------------Digital 13 MOSI----------------------Digital 11 MISO----------------------Digital 12 IRQ------------------------不用連接 GND-----------------------GND RST------------------------Digital 9 3.3V------------------------3.3V (千萬不要連接到5V接口!!!) */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. void setup() { Serial.begin(9600); // Initialize serial communications with the PC SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card Serial.println("Scan PICC to see UID and type..."); } void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Dump debug info about the card. PICC_HaltA() is automatically called. mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); }
實驗串口返回情況
實驗場景圖
實驗開源代碼之二
/* 【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程) 實驗九十八:MFRC-522 RC522 RFID射頻 IC卡感應模塊讀卡器S50復旦卡鑰匙扣模組 1、工具-管理庫-搜索“MFRC522”庫-安裝 2、項目二:讀取UID,並將其分別以十進制和十六進制輸出到串口 3、RFID與Arduino Uno的連線 SDA------------------------Digital 10 SCK------------------------Digital 13 MOSI----------------------Digital 11 MISO----------------------Digital 12 IRQ------------------------不用連接 GND-----------------------GND RST------------------------Digital 9 3.3V------------------------3.3V (千萬不要連接到5V接口!!!) */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); //實例化類 // 初始化數組用於存儲讀取到的NUID byte nuidPICC[4]; void setup() { Serial.begin(9600); SPI.begin(); // 初始化SPI總線 rfid.PCD_Init(); // 初始化 MFRC522 } void loop() { // 找卡 if ( ! rfid.PICC_IsNewCardPresent()) return; // 驗證NUID是否可讀 if ( ! rfid.PICC_ReadCardSerial()) return; MFRC522::ICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); // 檢查是否MIFARE卡類型 if (piccType != MFRC522::ICC_TYPE_MIFARE_MINI && piccType != MFRC522::ICC_TYPE_MIFARE_1K && piccType != MFRC522::ICC_TYPE_MIFARE_4K) { Serial.println("不支持讀取此卡類型"); return; } // 將NUID保存到nuidPICC數組 for (byte i = 0; i < 4; i++) { nuidPICC = rfid.uid.uidByte; } Serial.print("十六進制UID:"); printHex(rfid.uid.uidByte, rfid.uid.size); Serial.println(); Serial.print("十進制UID:"); printDec(rfid.uid.uidByte, rfid.uid.size); Serial.println(); // 使放置在讀卡區的IC卡進入休眠狀態,不再重復讀卡 rfid.PICC_HaltA(); // 停止讀卡模塊編碼 rfid.PCD_StopCrypto1(); } void printHex(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer < 0x10 ? " 0" : ""); Serial.print(buffer, HEX); } } void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer < 0x10 ? " 0" : ""); Serial.print(buffer, DEC); } }
實驗串口返回情況
實驗開源代碼之三
/* 【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程) 實驗九十八:MFRC-522 RC522 RFID射頻 IC卡感應模塊讀卡器S50復旦卡鑰匙扣模組 1、安裝庫:IDE-工具-管理庫-搜索“MFRC522”庫-安裝 2、項目三:RC522 模塊的讀寫操作 3、RFID與Arduino Uno的連線 SDA------------------------Digital 10 SCK------------------------Digital 13 MOSI----------------------Digital 11 MISO----------------------Digital 12 IRQ------------------------不用連接 GND-----------------------GND RST------------------------Digital 9 3.3V------------------------3.3V (千萬不要連接到5V接口!!!) */ #include <SPI.h> #include <MFRC522.h> #define RST_PIN 9 // 配置針腳 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); // 創建新的RFID實例 MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); // 設置串口波特率為9600 while (!Serial); // 如果串口沒有打開,則死循環下去不進行下面的操作 SPI.begin(); // SPI開始 mfrc522.PCD_Init(); // Init MFRC522 card for (byte i = 0; i < 6; i++) { key.keyByte = 0xFF; } Serial.println(F("掃描卡開始進行讀或者寫")); Serial.print(F("使用A和B作為鍵")); dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); Serial.println(); Serial.println(F("注意,會把數據寫入到卡在#1")); } void loop() { // 尋找新卡 if ( ! mfrc522.PICC_IsNewCardPresent()) return; // 選擇一張卡 if ( ! mfrc522.PICC_ReadCardSerial()) return; // 顯示卡片的詳細信息 Serial.print(F("卡片 UID:")); dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); Serial.println(); Serial.print(F("卡片類型: ")); MFRC522:ICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // 檢查兼容性 if ( piccType != MFRC522:ICC_TYPE_MIFARE_MINI && piccType != MFRC522:ICC_TYPE_MIFARE_1K && piccType != MFRC522:ICC_TYPE_MIFARE_4K) { Serial.println(F("僅僅適合Mifare Classic卡的讀寫")); return; } // 我們只使用第二個扇區 // 覆蓋扇區4 byte sector = 1; byte blockAddr = 4; byte dataBlock[] = { 0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4, 0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8, 0x00, 0x00, 0x00, 0x00, // 0,0,0,0 0x00, 0x00, 0x00, 0x00 // 0,0,0,0 };//寫入的數據定義 byte trailerBlock = 7; MFRC522::StatusCode status; byte buffer[18]; byte size = sizeof(buffer); // 原來的數據 Serial.println(F("顯示原本的數據...")); status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522:ICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("身份驗證失敗?或者是卡鏈接失敗")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // 顯示整個扇區 Serial.println(F("顯示所有扇區的數據")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); // 從塊兒讀取數據 Serial.print(F("讀取塊兒的數據在:")); Serial.print(blockAddr); Serial.println(F("塊 ...")); status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("讀卡失敗,沒有連接上 ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("數據內容在第 ")); Serial.print(blockAddr); Serial.println(F(" 塊:")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(); //開始進行寫入准備 Serial.println(F("開始進行寫入的准備...")); status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522:ICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("寫入失敗,沒有連接上或者沒有權限 ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Write data to the block Serial.print(F("在第: ")); Serial.print(blockAddr); Serial.println(F(" 塊中寫入數據...")); dump_byte_array(dataBlock, 16); Serial.println(); status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("寫入失敗... ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.println(); // 再次讀取卡中數據,這次是寫入之后的數據 Serial.print(F("讀取寫入后第")); Serial.print(blockAddr); Serial.println(F(" 塊的數據 ...")); status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("讀取失敗... ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("塊 ")); Serial.print(blockAddr); Serial.println(F("數據為 :")); dump_byte_array(buffer, 16); Serial.println(); // 驗證一下數據,要保證寫入前后數據是相等的 // 通過計算塊中的字節數量 Serial.println(F("等待驗證結果...")); byte count = 0; for (byte i = 0; i < 16; i++) { // 比較一下緩存中的數據(我們讀出來的數據) = (我們剛剛寫的數據) if (buffer == dataBlock) count++; } Serial.print(F("匹配的字節數量 = ")); Serial.println(count); if (count == 16) { Serial.println(F("驗證成功 :")); } else { Serial.println(F("失敗,數據不匹配")); Serial.println(F("也許寫入的內容不恰當")); } Serial.println(); // 轉儲扇區數據 Serial.println(F("寫入后的數據內容為::")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); // 停止 PICC mfrc522.PICC_HaltA(); //停止加密PCD mfrc522.PCD_StopCrypto1(); } /** * 將字節數組轉儲為串行的十六進制值 */ void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer < 0x10 ? " 0" : " "); Serial.print(buffer, HEX); } }
實驗串口返回情況
實驗開源仿真編程(Linkboy V4.62)
實驗仿真編程(Linkboy V4.62)之二
實驗串口返回情況
實驗開源仿真編程(Linkboy V4.62)其他
NFC Tools PRO
應該是目前為止最強大的NFC工具了吧(APP),可惜nfc這玩意兒不是所有手機都標配。NFC Tools PRO是一款可以讀取和寫入nfc標簽的工具,同時還提供了一些額外功能。NFC工具專業版包含額外的功能,如配置文件管理等等。保存您的標記或任務配置文件后重新使用它們。NFC工具專業版允許您在記錄或任務直接從現有的NFC標簽導入。您可以非常快的編輯您的標簽。您也可以直接運行的任務配置文件。
主要功能:
- 讀寫NFC
- NFC標簽配置文件管理
- 從標簽導入任務