工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

RFIDの仕組みとArduinoベースのRFIDドアロックの作り方

このチュートリアルでは、RFIDとは何か、RFIDがどのように機能するか、ArduinoベースのRFIDドアロックを作成する方法を学びます。詳細については、次のビデオを見るか、以下のチュートリアルを読むことができます。

概要

RFIDは無線周波数識別の略です これは非接触テクノロジーであり、人員追跡、アクセス制御、サプライチェーン管理、図書館での書籍追跡、料金所システムなどのタスクで多くの業界で広く使用されています。[/ column]

RFIDの仕組み

RFIDシステムは、識別したいオブジェクトに配置されているトランスポンダーまたはタグと、トランシーバーまたはリーダーの2つの主要コンポーネントで構成されています。

RFIDリーダーは、無線周波数モジュール、制御ユニット、および高周波電磁界を生成するアンテナコイルで構成されています。一方、タグは通常、アンテナと電子マイクロチップのみで構成されるパッシブコンポーネントであるため、トランシーバーの電磁界に近づくと、誘導によりアンテナコイルに電圧が発生します。電圧はマイクロチップの電力として機能します。

タグに電力が供給されると、送信されたメッセージをリーダーから抽出でき、メッセージをリーダーに送り返すために、ロード操作と呼ばれる手法を使用します。タグのアンテナで負荷のオンとオフを切り替えると、リーダーのアンテナの消費電力に影響します。これは、電圧降下として測定できます。この電圧の変化は1と0としてキャプチャされ、それがデータがタグからリーダーに転送される方法です。

後方散乱結合と呼ばれる、リーダーとタグ間のデータ転送の別の方法もあります。この場合、タグは受信電力の一部を使用して、リーダーのアンテナによって拾われる別の電磁界を生成します。

RFIDとArduino

これが基本的な動作原理です。次に、ArduinoでRFIDを使用して、独自のRFIDドアロックを構築する方法を見てみましょう。 MIFAREプロトコルとMFRC522RFIDリーダーに基づくタグを使用します。これはわずか数ドルです。

これらのタグには1kbのメモリがあり、算術演算を実行できるマイクロチップがあります。それらの動作周波数は13.56MHzであり、動作距離はアンテナの形状に応じて最大10cmです。これらのタグの1つを光源の前に置くと、前に説明したアンテナとマイクロチップに気付くことができます。

RFIDリーダーモジュールに関しては、Arduinoボードとの通信にSPIプロトコルを使用しており、これらを接続する方法は次のとおりです。モジュールのVCCを3.3Vに接続する必要があることに注意してください。他のピンは、5Vに対応しているため、心配する必要はありません。

モジュールを接続したら、GitHubからMFRC522ライブラリをダウンロードする必要があります。ライブラリには、モジュールの使用方法を学ぶことができるいくつかの良い例が付属しています。

まず、「DumpInfo」の例をアップロードして、システムが正しく機能するかどうかをテストできます。シリアルモニターを実行してタグをモジュールに近づけると、リーダーがタグの読み取りを開始し、タグのすべての情報がシリアルモニターに表示されます。

ここでは、タグのUID番号と、実際には16セクターに分割されている1 KBのメモリ、各セクターが4ブロックに分割され、各ブロックに2バイトのデータを格納できることがわかります。このチュートリアルでは、タグのメモリは使用せず、タグのUID番号のみを使用します。

ArduinoRFIDドアロックアクセス制御プロジェクト

RFIDドアロックプロジェクトのコードを実行する前に、このプロジェクトのコンポーネントと回路図を見てみましょう。

RFIDモジュールに加えて、ドアが閉じているか開いているかをチェックするための近接センサー、ロック機構用のサーボモーター、および文字表示を使用します。

このArduinoチュートリアルに必要なコンポーネントは、以下のリンクから入手できます。

  • MFRC522RFIDモジュール……………………。
  • サーボモーター……………………………………..
  • LCDディスプレイ………………………………………
  • Arduinoボード…………………………………。
  • ブレッドボードとジャンパー線……………..
  • 近接センサーCNY70……………………

プロジェクトのワークフローは次のとおりです。最初にマスタータグを設定する必要があり、次にシステムが通常モードになります。不明なタグをスキャンするとアクセスは拒否されますが、マスターをスキャンするとプログラムモードに入り、そこから不明なタグを追加して承認できます。したがって、タグをもう一度スキャンすると、アクセスが許可され、ドアを開けることができます。

ドアを閉めると、ドアは自動的にロックされます。システムからタグを削除したい場合は、プログラムモードに戻り、既知のタグをスキャンすると削除されます。

ソースコード

それでは、コードを見てみましょう。 したがって、最初に、RFIDモジュール、ディスプレイ、およびサーボモーターのライブラリを含め、以下のプログラムに必要ないくつかの変数を定義し、ライブラリのインスタンスを作成する必要があります。

#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>

#define RST_PIN   9
#define SS_PIN    10

byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;

// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motorCode language: Arduino (arduino)

セットアップセクションでは、最初にモジュールを初期化し、サーボモーターの初期値をロック位置に設定します。次に、最初のメッセージをディスプレイに出力し、次の「while」ループを使用して、マスタータグがスキャンされるまで待機します。 getID()カスタム関数はタグUIDを取得し、それをmyTags[0]配列の最初の場所に配置します。

void setup() {
  // Initiating
  SPI.begin();        // SPI bus
  mfrc522.PCD_Init(); //  MFRC522
  lcd.begin(16, 2);   // LCD screen
  myServo.attach(8);  // Servo motor

  myServo.write(10); // Initial lock position of the servo motor
  // Prints the initial message
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print("    SCAN NOW");
  // Waits until a master card is scanned
  while (!successRead) {
    successRead = getID();
    if ( successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}Code language: Arduino (arduino)

getID()カスタム関数を見てみましょう。まず、リーダーの近くに新しいタグが配置されているかどうかを確認します。ある場合は、タグのUIDを取得する「for」ループに進みます。使用しているタグには4バイトのUID番号があるため、このループで4回の反復を行う必要があり、concat()関数を使用して、4バイトを単一の文字列変数に追加します。また、文字列のすべての文字を大文字に設定し、最後に読み取りを停止します。

uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  tagID = "";
  for ( uint8_t i = 0; i < 4; i++) {  // The MIFARE PICCs that we use have 4 byte UID
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}Code language: Arduino (arduino)

メインループに入る前に、セットアップセクションの最後で、ディスプレイに「アクセス制御」メッセージを出力するprintNormalModeMessage()カスタム関数も呼び出します。

void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}Code language: Arduino (arduino)

メインループでは、ドアが閉じているかどうかを示す近接センサーの値を読み取ることから始めます。

int proximitySensor = analogRead(A0);Code language: Arduino (arduino)

したがって、ドアが閉じている場合は、getID()カスタム関数で説明したのと同じ行を使用して、新しいタグのUIDをスキャンして取得します。ここで、「if」ステートメントの「return」行のために、タグをスキャンするまでコードが先に進まないことがわかります。

タグをスキャンしたら、そのタグが以前に登録したマスターであるかどうかを確認し、それが正しい場合はプログラムモードに入ります。このモードでは、すでに承認されているタグをスキャンすると、システムから削除されます。タグが不明な場合は、承認済みとしてシステムに追加されます。

// Checks whether the scanned tag is the master tag
    if (tagID == myTags[0]) {
      lcd.clear();
      lcd.print("Program mode:");
      lcd.setCursor(0, 1);
      lcd.print("Add/Remove Tag");
      while (!successRead) {
        successRead = getID();
        if ( successRead == true) {
          for (int i = 0; i < 100; i++) {
            if (tagID == myTags[i]) {
              myTags[i] = "";
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("  Tag Removed!");
              printNormalModeMessage();
              return;
            }
          }
          myTags[tagsCount] = strdup(tagID.c_str());
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("   Tag Added!");
          printNormalModeMessage();
          tagsCount++;
          return;
        }
      }
    }Code language: Arduino (arduino)

プログラムモードの外では、次の「for」ループで、スキャンされたタグが登録されたタグのいずれかと等しいかどうかを確認し、ドアのロックを解除するか、アクセスを拒否したままにします。 「else」ステートメントの最後で、ドアが閉じるまで待ってから、ドアをロックして、通常モードのメッセージを再度出力します。

// Checks whether the scanned tag is authorized
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170); // Unlocks the door
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  }
  // If door is open...
  else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Door Opened!");
    while (!doorOpened) {
      proximitySensor = analogRead(A0);
      if (proximitySensor > 200) {
        doorOpened = true;
      }
    }
    doorOpened = false;
    delay(500);
    myServo.write(10); // Locks the door
    printNormalModeMessage();
  }Code language: Arduino (arduino)

これでほぼすべてです。プロジェクトの完全なコードは次のとおりです。

/*
* Arduino Door Lock Access Control Project
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: MFRC522, https://github.com/miguelbalboa/rfid
*/

#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>

#define RST_PIN   9
#define SS_PIN    10

byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;

// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor

void setup() {
  // Initiating
  SPI.begin();        // SPI bus
  mfrc522.PCD_Init(); //  MFRC522
  lcd.begin(16, 2);   // LCD screen
  myServo.attach(8);  // Servo motor

  myServo.write(10); // Initial lock position of the servo motor
  // Prints the initial message
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print("    SCAN NOW");
  // Waits until a master card is scanned
  while (!successRead) {
    successRead = getID();
    if ( successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}

void loop() {
  int proximitySensor = analogRead(A0);
  // If door is closed...
  if (proximitySensor > 200) {
    if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
      return;
    }
    if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
      return;
    }
    tagID = "";
    // The MIFARE PICCs that we use have 4 byte UID
    for ( uint8_t i = 0; i < 4; i++) {  //
      readCard[i] = mfrc522.uid.uidByte[i];
      tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
    }
    tagID.toUpperCase();
    mfrc522.PICC_HaltA(); // Stop reading

    correctTag = false;
    // Checks whether the scanned tag is the master tag
    if (tagID == myTags[0]) {
      lcd.clear();
      lcd.print("Program mode:");
      lcd.setCursor(0, 1);
      lcd.print("Add/Remove Tag");
      while (!successRead) {
        successRead = getID();
        if ( successRead == true) {
          for (int i = 0; i < 100; i++) {
            if (tagID == myTags[i]) {
              myTags[i] = "";
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("  Tag Removed!");
              printNormalModeMessage();
              return;
            }
          }
          myTags[tagsCount] = strdup(tagID.c_str());
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("   Tag Added!");
          printNormalModeMessage();
          tagsCount++;
          return;
        }
      }
    }
    successRead = false;
    // Checks whether the scanned tag is authorized
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170); // Unlocks the door
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  }
  // If door is open...
  else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Door Opened!");
    while (!doorOpened) {
      proximitySensor = analogRead(A0);
      if (proximitySensor > 200) {
        doorOpened = true;
      }
    }
    doorOpened = false;
    delay(500);
    myServo.write(10); // Locks the door
    printNormalModeMessage();
  }
}

uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  tagID = "";
  for ( uint8_t i = 0; i < 4; i++) {  // The MIFARE PICCs that we use have 4 byte UID
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}

void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}Code language: Arduino (arduino)

このチュートリアルを楽しんでいただき、下のコメントセクションでお気軽に質問してください。


製造プロセス

  1. RC522を備えたArduinoRFIDロック-MIFAREプロトコル13.56Mhz
  2. ArduinoRFIDロックチュートリアル
  3. カスタマイズ可能なパンチ可能なキーボードボタンの作り方
  4. パスワードベースのドアロック
  5. ArduinoおよびOLEDベースのセルオートマトン
  6. eDOT-Arduinoベースの精密時計および気象観測所
  7. ArduinoとGoogleスプレッドシートに基づく出席システム
  8. Arduinoで音楽を作る方法
  9. Arduinoベースの自動ドア開口部の作り方
  10. ArduinoとAndroidベースのパスワードで保護されたドアロック
  11. ArduinoとProcessingIDEを使用してコンパスを作成する方法