創客小製作(含源代碼)《RFID控制器》,用於智能門禁、物流追蹤、控制物品等,基於Arduino
目錄
準備
RFID簡介
射頻識別即RFID(Radio Frequency IDentification)技術,又稱無線射頻識別,是一種通信技術,可通過無線電訊號識別特定目標並讀寫相關數據,而無需建立機械或光學接觸。有低頻(125k~134.2K)、高頻(13.56Mhz)、超高頻,微波等技術。RFID讀寫器也分移動式的和固定式的,目前RFID技術應用很廣,如:圖書館,門禁系統,食品安全溯源等。
RFID的工作原理:標籤進入磁場後,接收解讀器發出的射頻信號,憑藉感應電流所獲得的能量發送出存儲在芯片中的產品信息(Passive Tag,無源標籤或被動標籤),或者由標籤主動發送某一頻率的信號(Active Tag,有源標籤或主動標籤),解讀器讀取信息並解碼後,送至中央信息系統進行有關數據處理。
舵機介紹
舵機是一種位置伺服的驅動器,其工作原理是由接收機或者單片機發出信號給舵機,其內部有一個基準電路,產生週期爲20ms,寬度爲1.5ms 的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。經由電路板上的IC 判斷轉動方向,再驅動無核心馬達開始轉動,透過減速齒輪將動力傳至擺臂,同時由位置檢測器送回信號,判斷是否已經到達定位。適用於那些需要角度不斷變化並可以保持的控制系統。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差爲0,電機停止轉動。一般舵機旋轉的角度範圍是0 度到180 度。
思路
智能門禁
基於arduino與RFID,可通過RFID技術識別讀入IC卡的序號並與設定的序號比較符合則使用舵機打開門禁,由於不同門禁的需要可選擇不同的控制器代替舵機,如電磁開關、繼電器,紅外線發射裝置。
物流追蹤
關於物流跟蹤,使用RFID技術識別讀入IC卡的序號並報告給系統即可,其他內容本篇文章暫時討論
控制物品
思路與智能門禁類似,可通過RFID技術識別讀入IC卡的序號根據設定執行相關操作,如流水線上的兩種產品貼上兩種不同的無線射頻標籤,RFID技術識別後執行兩種不同的操作(如放入不同流水線中),通過電磁開關、繼電器,紅外線發射等實現。
製作
材料
- Arduino
- RFID
- IC卡
- 舵機
- 杜邦線
可選材料
- LCD1002(顯示)
- 繼電器
- 電磁開關
- 紅外線發射模塊
接線
RFID對應Arduino UNO
RFID模塊 | Arduino UNO |
---|---|
VCC | 3.3V |
RST | 5V |
GND | GND |
MISO | 12 |
MOSI | 11 |
SCK | 13 |
NSS | 10 |
IRQ | (不接) |
舵機
所有的舵機都有外接三根線,分別用棕、紅、橙三種顏色進行區分,由於舵機品牌不同,顏色也會有所差異,棕色爲接地線,紅色爲電源正極線,橙色爲信號線
感謝閱讀
持續更新arduino 樹莓派 python linux c語言等等
接到有幫助的話 求點贊👍 求關注❤️ 求分享👥
有問題可以評論
點關注,不迷路
如果有任何錯誤,如何建議,請批評指教,不勝感激 !
源代碼(三個版本)
對代碼有疑問可評論
智能門禁
這裏以控制舵機爲例子,如有需要顯示可加上lcd1602詳細可前往我的另一篇博客
/*
RFID模塊 Arduino UNO
VCC 3.3V
RST 5V
GND GND
MISO 12
MOSI 11
SCK 13
NSS 10
IRQ (不接)
舵機
黃色 信號線
紅色 5v
棕色 地級
*/
/*舵機*/
#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN); //實例化類
int relayPin = 6; //繼電器引腳
int key = 7;//按鍵引腳
int incomedate = 0;//設置變量
String refid1="";
// 初始化數組用於存儲讀取到的NUID
byte nuidPICC[4];
Servo myservo; //創建一個舵機控制對象
// 使用Servo類最多可以控制8個舵機
int pos = 90; // 該變量用與存儲舵機角度位置
void setup() {
myservo.attach(8); // 該舵機由arduino第九腳控制
pinMode(key,INPUT_PULLUP);//按鍵爲上拉輸入
pinMode(relayPin, OUTPUT);
Serial.begin(9600);
SPI.begin(); // 初始化SPI總線
rfid.PCD_Init(); // 初始化 MFRC522
}
void loop() {
myservo.write(0);
if (digitalRead(key)==LOW)
{delay(100);
if (digitalRead(key)==LOW) incomedate = !incomedate;}
if ((incomedate == 0))
{
digitalWrite(relayPin, HIGH);
}
else if ((incomedate == 1))
{
digitalWrite(relayPin, LOW);
}
// 找卡
if ( ! rfid.PICC_IsNewCardPresent())
{ delay(500);
if ( ! rfid.PICC_IsNewCardPresent())
{incomedate = 1;
return;}
}
// 驗證NUID是否可讀
if ( ! rfid.PICC_ReadCardSerial())
return;
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// 檢查是否MIFARE卡類型
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("不支持讀取此卡類型");
return;
}
// 將NUID保存到nuidPICC數組
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
Serial.print("十六進制UID:");
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
Serial.print("十進制UID:");
printDec(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
if((refid1=="1214519892")||(refid1=="73217151153"))
{
incomedate = 0;
//判斷爲真,執行需要的程序。
Serial.println("已驗證");
myservo.write(pos); // 指定舵機轉向的角度
delay(3000); // 等待15ms讓舵機到達指定位置
myservo.write(0);
}
else
{
//判斷爲假,執行需要的程序。
Serial.println("驗證失敗");
}
// 使放置在讀卡區的IC卡進入休眠狀態,不再重複讀卡
///// rfid.PICC_HaltA();
// 停止讀卡模塊編碼
///// rfid.PCD_StopCrypto1();
refid1="";
/* if (rfid.uid.uidByte, rfid.uid.size==183624630)
{ incomedate = !incomedate;}
*/
if ((incomedate == 0))
{
digitalWrite(relayPin, HIGH);
}
else if ((incomedate == 1))
{
digitalWrite(relayPin, LOW);
}
}
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : "");
Serial.print(buffer[i], HEX);
refid1+=nuidPICC[i];
}
}
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : "");
Serial.print(buffer[i], DEC);
}
}
物流追蹤
/*RFID模塊*/
/*
RFID模塊 Arduino UNO
VCC 3.3V
RST 5V
GND GND
MISO 12
MOSI 11
SCK 13
NSS 10
IRQ (不接)
*/
#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::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// 檢查是否MIFARE卡類型
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("不支持讀取此卡類型");
return;
}
// 將NUID保存到nuidPICC數組
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
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[i] < 0x10 ? " 0" : "");
Serial.print(buffer[i], HEX);
}
}
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : "");
Serial.print(buffer[i], DEC);
}
}
控制繼電器
/*
RFID模塊 Arduino UNO
VCC 3.3V
RST 5V
GND GND
MISO 12
MOSI 11
SCK 13
NSS 10
IRQ (不接)
*/
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN); //實例化類
int relayPin = 6; //繼電器引腳
int key = 7;//按鍵引腳
int incomedate = 0;//設置變量
String refid1="";
// 初始化數組用於存儲讀取到的NUID
byte nuidPICC[4];
void setup() {
pinMode(key,INPUT_PULLUP);//按鍵爲上拉輸入
pinMode(relayPin, OUTPUT);
Serial.begin(9600);
SPI.begin(); // 初始化SPI總線
rfid.PCD_Init(); // 初始化 MFRC522
}
void loop() {
if (digitalRead(key)==LOW)
{delay(100);
if (digitalRead(key)==LOW) incomedate = !incomedate;}
if ((incomedate == 0))
{
digitalWrite(relayPin, HIGH);
}
else if ((incomedate == 1))
{
digitalWrite(relayPin, LOW);
}
// 找卡
if ( ! rfid.PICC_IsNewCardPresent())
{ delay(500);
if ( ! rfid.PICC_IsNewCardPresent())
{incomedate = 1;
return;}
}
// 驗證NUID是否可讀
if ( ! rfid.PICC_ReadCardSerial())
return;
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
// 檢查是否MIFARE卡類型
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println("不支持讀取此卡類型");
return;
}
// 將NUID保存到nuidPICC數組
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
Serial.print("十六進制UID:");
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
Serial.print("十進制UID:");
printDec(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
if((refid1=="1214519892")||(refid1=="73217151153"))
{
incomedate = 0;
//判斷爲真,執行需要的程序。
Serial.println("已驗證");
}
else
{
//判斷爲假,執行需要的程序。
Serial.println("驗證失敗");
}
// 使放置在讀卡區的IC卡進入休眠狀態,不再重複讀卡
///// rfid.PICC_HaltA();
// 停止讀卡模塊編碼
///// rfid.PCD_StopCrypto1();
refid1="";
/* if (rfid.uid.uidByte, rfid.uid.size==183624630)
{ incomedate = !incomedate;}
*/
if ((incomedate == 0))
{
digitalWrite(relayPin, HIGH);
}
else if ((incomedate == 1))
{
digitalWrite(relayPin, LOW);
}
}
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : "");
Serial.print(buffer[i], HEX);
refid1+=nuidPICC[i];
}
}
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : "");
Serial.print(buffer[i], DEC);
}
}