RFIDの仕組みとArduinoベースのRFIDドアロックの作り方
このチュートリアルでは、RFIDとは何か、RFIDがどのように機能するか、ArduinoベースのRFIDドアロックを作成する方法を学びます。詳細については、次のビデオを見るか、以下のチュートリアルを読むことができます。
RFIDは無線周波数識別の略です これは非接触テクノロジーであり、人員追跡、アクセス制御、サプライチェーン管理、図書館での書籍追跡、料金所システムなどのタスクで多くの業界で広く使用されています。[/ column]
RFIDシステムは、識別したいオブジェクトに配置されているトランスポンダーまたはタグと、トランシーバーまたはリーダーの2つの主要コンポーネントで構成されています。
RFIDリーダーは、無線周波数モジュール、制御ユニット、および高周波電磁界を生成するアンテナコイルで構成されています。一方、タグは通常、アンテナと電子マイクロチップのみで構成されるパッシブコンポーネントであるため、トランシーバーの電磁界に近づくと、誘導によりアンテナコイルに電圧が発生します。電圧はマイクロチップの電力として機能します。
タグに電力が供給されると、送信されたメッセージをリーダーから抽出でき、メッセージをリーダーに送り返すために、ロード操作と呼ばれる手法を使用します。タグのアンテナで負荷のオンとオフを切り替えると、リーダーのアンテナの消費電力に影響します。これは、電圧降下として測定できます。この電圧の変化は1と0としてキャプチャされ、それがデータがタグからリーダーに転送される方法です。
後方散乱結合と呼ばれる、リーダーとタグ間のデータ転送の別の方法もあります。この場合、タグは受信電力の一部を使用して、リーダーのアンテナによって拾われる別の電磁界を生成します。
これが基本的な動作原理です。次に、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番号のみを使用します。
RFIDドアロックプロジェクトのコードを実行する前に、このプロジェクトのコンポーネントと回路図を見てみましょう。
RFIDモジュールに加えて、ドアが閉じているか開いているかをチェックするための近接センサー、ロック機構用のサーボモーター、および文字表示を使用します。
このArduinoチュートリアルに必要なコンポーネントは、以下のリンクから入手できます。
プロジェクトのワークフローは次のとおりです。最初にマスタータグを設定する必要があり、次にシステムが通常モードになります。不明なタグをスキャンするとアクセスは拒否されますが、マスターをスキャンするとプログラムモードに入り、そこから不明なタグを追加して承認できます。したがって、タグをもう一度スキャンすると、アクセスが許可され、ドアを開けることができます。
ドアを閉めると、ドアは自動的にロックされます。システムからタグを削除したい場合は、プログラムモードに戻り、既知のタグをスキャンすると削除されます。
それでは、コードを見てみましょう。 したがって、最初に、RFIDモジュール、ディスプレイ、およびサーボモーターのライブラリを含め、以下のプログラムに必要ないくつかの変数を定義し、ライブラリのインスタンスを作成する必要があります。
セットアップセクションでは、最初にモジュールを初期化し、サーボモーターの初期値をロック位置に設定します。次に、最初のメッセージをディスプレイに出力し、次の「while」ループを使用して、マスタータグがスキャンされるまで待機します。 getID()カスタム関数はタグUIDを取得し、それをmyTags[0]配列の最初の場所に配置します。
getID()カスタム関数を見てみましょう。まず、リーダーの近くに新しいタグが配置されているかどうかを確認します。ある場合は、タグのUIDを取得する「for」ループに進みます。使用しているタグには4バイトのUID番号があるため、このループで4回の反復を行う必要があり、concat()関数を使用して、4バイトを単一の文字列変数に追加します。また、文字列のすべての文字を大文字に設定し、最後に読み取りを停止します。
メインループに入る前に、セットアップセクションの最後で、ディスプレイに「アクセス制御」メッセージを出力するprintNormalModeMessage()カスタム関数も呼び出します。
メインループでは、ドアが閉じているかどうかを示す近接センサーの値を読み取ることから始めます。
したがって、ドアが閉じている場合は、getID()カスタム関数で説明したのと同じ行を使用して、新しいタグのUIDをスキャンして取得します。ここで、「if」ステートメントの「return」行のために、タグをスキャンするまでコードが先に進まないことがわかります。
タグをスキャンしたら、そのタグが以前に登録したマスターであるかどうかを確認し、それが正しい場合はプログラムモードに入ります。このモードでは、すでに承認されているタグをスキャンすると、システムから削除されます。タグが不明な場合は、承認済みとしてシステムに追加されます。
プログラムモードの外では、次の「for」ループで、スキャンされたタグが登録されたタグのいずれかと等しいかどうかを確認し、ドアのロックを解除するか、アクセスを拒否したままにします。 「else」ステートメントの最後で、ドアが閉じるまで待ってから、ドアをロックして、通常モードのメッセージを再度出力します。
これでほぼすべてです。プロジェクトの完全なコードは次のとおりです。
このチュートリアルを楽しんでいただき、下のコメントセクションでお気軽に質問してください。
RFIDとArduino
ArduinoRFIDドアロックアクセス制御プロジェクト
#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
Code language: Arduino (arduino)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)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)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)// 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)// 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)
製造プロセス
- RC522を備えたArduinoRFIDロック-MIFAREプロトコル13.56Mhz
- ArduinoRFIDロックチュートリアル
- カスタマイズ可能なパンチ可能なキーボードボタンの作り方
- パスワードベースのドアロック
- ArduinoおよびOLEDベースのセルオートマトン
- eDOT-Arduinoベースの精密時計および気象観測所
- ArduinoとGoogleスプレッドシートに基づく出席システム
- Arduinoで音楽を作る方法
- Arduinoベースの自動ドア開口部の作り方
- ArduinoとAndroidベースのパスワードで保護されたドアロック
- ArduinoとProcessingIDEを使用してコンパスを作成する方法