創客小製作(含源代碼)《RFID控制器》,用於智能門禁、物流追蹤、控制開關等,基於Arduino

創客小製作(含源代碼)《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技術識別後執行兩種不同的操作(如放入不同流水線中),通過電磁開關、繼電器,紅外線發射等實現。

製作

材料

  1. Arduino
  2. RFID
  3. IC卡
  4. 舵機
  5. 杜邦線

可選材料

  1. LCD1002(顯示)
  2. 繼電器
  3. 電磁開關
  4. 紅外線發射模塊

接線

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詳細可前往我的另一篇博客

Arduino實踐(二)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);
    
  }
  
}

其他相關博客

Arduino小白入門全解,學習筆記

Arduino實踐(二)lcd1602使用說明,源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章