در بازکن هوشمند RFID با آردوینو
باز کردن در اتاق یا کارگاه با یک کارت هوشمند حس خیلی خوبی داره، اما مشکل اینجاست که معمولا برای نصب قفلهای برقی باید در رو سوراخ کنیم یا تغییرات اساسی بهش بدیم. تو این پروژه از آیسیمدار قراره یه در بازکن هوشمند باحال بسازیم که با ماژول RFID کار میکنه و دستگیره در رو به صورت مکانیکی برات میکشه!
این دستگاه کاملا پشت در نصب میشه و موتور دیسی داخلیش با چرخوندن یه قرقره، طناب متصل به دستگیره رو میکشه و در رو برات باز میکنه. اگر دوست داری یه سیستم امنیتی بدون دردسر و بدون نیاز به دریلکاری برای در اتاقت بسازی، قطعاتت رو آماده کن تا قدمبهقدم این گجت کاربردی رو با هم مونتاژ کنیم.
- نباید تغییر اساسی روی در داده بشه (مثلا سوراخ)
- دستگاه باید کامل پشت در جا بشه
- سیگنال RFID باید از پشت در دریافت بشه
- در باید همچنان با کلید معمولی هم باز بشه
- اسم دستگاه باید "The D'Opener" باشه
- نباید هیچ تغییر اساسی (مثل سوراخکاری) روی در انجام بشه.
- دستگاه باید کاملا پشت در قرار بگیره و مخفی باشه.
- سیگنال RFID باید از پشت در و ضخامت اون عبور کنه و خونده بشه.
- همچنان باید بشه در رو با همون کلید سنتی و معمولی هم باز کرد.
- اسم این گجت هم قراره "D'Opener" باشه!
ایده و مکانیزم کارکرد در بازکن
برای انجام این کار، دستگاهی طراحی کردم که دقیقا زیر دستگیره در نصب میشه. پشت این دستگاه یک ماژول کارتخوان RFID قرار داره تا بتونه کارت یا تگ رو از ضخامت در اسکن کنه. کار اصلی رو یک موتور دیسی انجام میده که به یک قرقره متصل شده.
این قرقره یک طناب رو دور خودش جمع میکنه. سر دیگه این طناب به انتهای دستگیره در وصل شده؛ پس با چرخش موتور، طناب کشیده میشه، دستگیره میاد پایین و در از داخل باز میشه! برای اینکه موتور بیش از حد نچرخه، از میکروسوئیچ (Limit Switch) استفاده میکنیم تا حد بالا و پایین رو براش مشخص کنیم. کل این مجموعه هم مستقیما روی خود دستگیره سوار میشه تا نیازی به دریلکاری نداشته باشیم.
طراحی و پرینت سهبعدی قطعات
کل ساختار این سیستم جوری طراحی شده که بتونی راحت با پرینتر سهبعدی بسازیش. جعبه اصلی با یک گیره که بالای اون قرار داره، دور پایه دستگیره محکم میشه (البته طوری که دستگیره همچنان بتونه آزادانه بچرخه). برای اینکه موقع کار کردن موتور، خود جعبه تکون نخوره، یک قطعه تنظیمکننده (Shim) کوچیک هم لبه در اضافه شده.
البته بسته به فرم و زاویههای در اتاقت، شاید لازم باشه ابعادش رو کمی تغییر بدی. قرقره با یک پیچ تنظیم روی شفت موتور فیکس میشه. دور این قرقره سوراخهای زیادی طراحی شده که جای قرارگیری پیچهای کوچیکه. این پیچها قراره موقع چرخش به میکروسوئیچهای پشت قرقره برخورد کنن.
در واقع با تغییر جای این پیچها تو سوراخهای مختلف، خودت بهصورت مکانیکی "برنامهریزی" میکنی که موتور چقدر بچرخه. ماژول RFID پشت جعبه و دقیقا چسبیده به در قرار میگیره. داخل جعبه هم فضای کافی برای موتور و تمام مدارهای الکترونیکی در نظر گرفته شده. قطعات با پیچهای M3 به هم متصل میشن و برای مقاومت بیشتر بعضی جاها از مهرههای رزوهدار استفاده شده.
من تمام قطعات مکانیکی رو با فیلامنت PLA و تنظیمات پیشفرض پرینت گرفتم. چهار قطعه اصلی تو فایل STL این پروژه هست که میتونی تو نرمافزار اسلایسر اونها رو از هم جدا کنی.
علاوه بر اینها، یک قطعه کوچیک هم برای اتصال طناب به نوک دستگیره طراحی کردم که از جنس فیلامنت انعطافپذیر TPU پرینت شده. بسته به شکل دستگیره، شاید لازم باشه ابعاد این یکی رو هم شخصیسازی کنی.
بررسی مدار و قطعات الکترونیکی
تغذیه کل این مدار با یک آداپتور 12 ولت تأمین میشه. این 12 ولت از طریق یک کلید روشن/خاموش به ماژول کاهنده ولتاژ (Buck Converter) وصل میشه. البته چون جریان مصرفی تو بخش 5 ولت خیلی کمه، میتونی از یک رگولاتور خطی مثل LM7805 هم استفاده کنی.
این 5 ولت قراره تغذیه برد آردوینو و بقیه مدارهای منطقی رو تأمین کنه. تو این پروژه نیازی به پینهای آنالوگ نداریم و چون پین Reset آردوینو مقاومت پولآپ (Pull-up) داخلی داره، میتونیم اون رو هم بدون اتصال رها کنیم.
برای کنترل موتور از یک شیلد رله (Relay Shield) استفاده میکنیم که دو تا رله SPDT داره. این رلهها با خروجیهای پین D2 و D7 آردوینو کنترل میشن. با این ترکیب، اگر D2 روشن (High) و D7 خاموش (Low) باشه، موتور تو یک جهت میچرخه.
به همین ترتیب، اگر D2 خاموش و D7 روشن باشه، موتور تو جهت مخالف حرکت میکنه. اگر هر دو خاموش یا هر دو روشن باشن هم موتور کاملا متوقف میشه.
ماژول Parallax RFID از طریق پورت سریال نرمافزاری با آردوینو ارتباط برقرار میکنه. پین خروجی سریال ماژول به پین D5 آردوینو (به عنوان RX) وصل میشه. چون آردوینو نیازی به ارسال دیتا به ماژول نداره، پین TX لازم نیست متصل بشه (هرچند تو کد به پین D4 اختصاص داده شده). پین فعالساز (Enable) ماژول یعنی D3 هم برای روشن موندن باید تو حالت Low قرار بگیره.
تو این مدار یک بازر پیزو هم اضافه کردم تا وقتی کارت اسکن میشه یه بوق کوتاه بزنه. کلیدهای 2 و 3 همون میکروسوئیچهایی هستن که دامنه حرکتی قرقره رو محدود میکنن و به شکل در حالت عادی باز (Normally Open) سیمکشی شدن.
کلیدهای 4 و 5 دکمههای فشاری چراغدار هستن. دکمه "Exit" برای اینه که بتونی در رو از داخل موقتا باز کنی و دکمه "Hold" برای اینه که سیستم رو روی حالت قفل یا باز ثابت نگهداری.
کدنویسی آردوینو و منطق برنامه
من قبلا تجربه کار با ماژول Parallax RFID رو نداشتم، برای همین تو اینترنت دنبال منابع آموزشی گشتم. خوشبختانه یک آموزش فوقالعاده پیدا کردم که دقیقا همون چیزی بود که میخواستم. بخش زیادی از کدهای این پروژه رو از روی همون منبع الهام گرفتم.
حالا بریم سراغ بررسی کدها. تو بخش اول، فقط تعریف پینها و فراخوانی کتابخونه ارتباط سریال نرمافزاری (Software Serial) رو داریم.
// Firmware v1.1 for D'OPENER
// by Z3-R0
// Includes source code from Kev_MacD: "Wiring and Programming the Parallax RFID Serial Card Reader for the Arduino"
#include <SoftwareSerial.h>
//Parallax RFID Reader
#define RFIDEnablePin 3 //Pin that enables reading. Set as OUTPUT and LOW to read an RFID tag
#define RFIDSerialRate 2400 //Parallax RFID Reader Serial Port Speed
#define RxPin 5 //Pin to read data from Reader
#define TxPin 4 //Pin to write data to the Reader NOTE: The reader doesn't get written to, don't connect this line.
//#define LedPin 13 //Pin to user led
#define Relay1Pin 2 //Relay 1 to motor
#define Relay2Pin 7 //Relay 2 to motor
#define PiezoPin 6 // buzzer
#define Limit1Pin 11
#define Limit2Pin 12
#define ExitButtonPin 8
#define ToggleButtonPin 10
#define ToggleLedPin 9
اینجا همونجاییه که باید شماره اختصاصی کارتهای RFID خودت رو به صورت دستی (Hard Code) وارد کنی. جلوتر بهت میگم چطور این شمارهها رو پیدا کنی. میتونی هر چند تا کلید که خواستی به این لیست اضافه کنی، فقط یادت باشه که اسمهای متفاوتی داشته باشن.
#define CardNumber "XXXXXXXXXX"
#define FobNumber "XXXXXXXXXX"
این قسمت هم برای راهاندازی ماژول RFID و فعال کردن پورت سریال سختافزاری آردوینو برای ارتباط با کامپیوتره.
SoftwareSerial RFIDReader(RxPin, TxPin);
String RFIDTAG = ""; //Holds the RFID Code read from a tag
String DisplayTAG = ""; //Holds the last displayed RFID Tag
void setup() {
// RFID reader SOUT pin connected to Serial RX pin at 2400bps
RFIDReader.begin(RFIDSerialRate);
pinMode(RFIDEnablePin, OUTPUT);
pinMode(ToggleLedPin, OUTPUT);
pinMode(Relay1Pin, OUTPUT);
pinMode(Relay2Pin, OUTPUT);
pinMode(PiezoPin, OUTPUT);
pinMode(Limit1Pin, INPUT_PULLUP);
pinMode(Limit2Pin, INPUT_PULLUP);
pinMode(ToggleButtonPin, INPUT_PULLUP);
pinMode(ExitButtonPin, INPUT_PULLUP);
digitalWrite(RFIDEnablePin, LOW); // LOW=enable
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Hello world!"); // prints hello with ending line break
motor(false, false); // motor off
}
تو حلقه اصلی برنامه (loop)، ماژول دائم چک میکنه که آیا کارتی در دسترسه یا نه. اگر شماره کارت اسکن شده با یکی از کدهایی که بالا تعریف کردی یکی بود، در باز میشه. اگر تگهای بیشتری داری، کافیه شرطهای if بیشتری اضافه کنی.
در نهایت، حلقه برنامه وضعیت دکمهها رو بررسی میکنه و دستورات لازم رو میده. زدن دکمه Hold در رو قفل یا باز نگه میداره. دکمه Exit هم در رو به صورت لحظهای باز میکنه اما بعد از یک ثانیه دوباره قفل میشه. من برای هر دکمه یک بررسی دوگانه (Double check) هم تو کد گذاشتم تا جلوی سیگنالهای نویز و مزاحم گرفته بشه.
void loop() {
if ((RFIDReader.available() > 0)) // If data available from reader
{
ReadSerial(RFIDTAG); //Read the tag number 10 digit serial number
DisplayTAG = RFIDTAG;
Serial.println(RFIDTAG);
if ((DisplayTAG == CardNumber) || (DisplayTAG == FobNumber)) // correct ID read
{
tone(PiezoPin, 800, 1000);
door_open();
delay(1000);
door_close();
clearBuffer();
}
}
if (!digitalRead(ToggleButtonPin)) //Red button pressed to unlock
{
delay(5);
if (!digitalRead(ToggleButtonPin)) //Red button pressed to unlock (debounce)
{
door_open();
digitalWrite(ToggleLedPin, 1);
while (digitalRead(ToggleButtonPin)) {
//wait till pressed
}
door_close();
digitalWrite(ToggleLedPin, 0);
}
}
if (!digitalRead(ExitButtonPin)) //Green button pressed to exit
{
delay(5);
if (!digitalRead(ExitButtonPin)) //Green button pressed to exit (debounce)
{
door_open();
delay(1000);
door_close();
}
}
}
تابع ReadSerial کارش اینه که شماره 10 رقمی کارت RFID رو دریافت کنه و تو یک متغیر عمومی ذخیره کنه تا تو حلقه اصلی بشه ازش استفاده کرد.
void ReadSerial(String &ReadTagString) {
int bytesread = 0;
int val = 0;
char code[10];
String TagCode = "";
if (RFIDReader.available() > 0) { // If data available from reader
if ((val = RFIDReader.read()) == 10) { // Check for header
bytesread = 0;
while (bytesread < 10) { // Read 10 digit code
if (RFIDReader.available() > 0) {
val = RFIDReader.read();
if ((val == 10) || (val == 13)) { // If header or stop bytes before the 10 digit reading
break; // Stop reading
}
code[bytesread] = val; // Add the digit
bytesread++; // Ready to read next digit
}
}
if (bytesread == 10) { // If 10 digit read is complete
for (int x = 0; x < 10; x++) //Copy the Chars to a String
{
TagCode += code[x];
}
ReadTagString = TagCode; //Update the caller
while (RFIDReader.available() > 0) //Burn off any characters still in the buffer
{
RFIDReader.read();
}
}
bytesread = 0;
TagCode = "";
}
}
}
تابع clearBuffer هم بعد از هر بار خوندن تگ، حافظه رو پاک میکنه تا یک کارت به صورت پشت سر هم و بیوقفه اسکن نشه.
void clearBuffer() {
while (RFIDReader.available() > 0) {
RFIDReader.read();
}
}
تابع motor هم منطق صفر و یک بودن ورودی رلهها رو برای چرخش موتور مدیریت میکنه.
void motor(bool run, bool dir) { //control motor output pins
if (!run) {
digitalWrite(Relay1Pin, LOW); // motor off
digitalWrite(Relay2Pin, LOW);
} else {
if (dir) {
digitalWrite(Relay1Pin, LOW); // motor on CW
digitalWrite(Relay2Pin, HIGH);
} else {
digitalWrite(Relay1Pin, HIGH); // motor on CCW
digitalWrite(Relay2Pin, LOW);
}
}
}
توابع door_open و door_close هم با کمک میکروسوئیچها، عمل باز و بسته شدن مکانیکی رو به شکل دقیق اجرا میکنن.
void door_open() {
motor(true, true);
while (digitalRead(Limit2Pin)) {
//wait until limit hit
}
motor(false, false);
}
void door_close() {
motor(true, false);
while (digitalRead(Limit1Pin)) {
//wait until limit hit
}
motor(false, false);
}
کد کامل پروژه هم به صورت یکجا همینجاست که میتونی کپی و استفاده کنی.
سیمکشی و مونتاژ نهایی
برای راحتی و تمیزی بیشتر، من از یک شیلد آردوینو برای سازماندهی سیمکشیها استفاده کردم. همه اتصالات دقیقا طبق شماتیک انجام میشن. کانکتور موتور من چهار تا سیم داشت؛ دو تا ضخیم و دو تا نازک.
از سیمهای ضخیم استفاده کن، چون سیمهای نازک برای فیدبک یا انکودر هستن و تو این پروژه نیازی بهشون نداریم. حتما مطمئن شو که پایههای مشترک (COM)، حالت باز (NO) و حالت بسته (NC) رو تو کلیدها و رلهها درست تشخیص دادی. ماژول RFID رو هم که قراره پشت جعبه نصب بشه، فراموش نکن.
من یک دیاگرام آماده کردم که دقیقا نشون میده هر کدوم از قطعات جانبی چطور به شیلد آردوینو وصل میشن. چیدمان قطعات روی برد سوراخدار خیلی مهم نیست، به شرطی که سیمکشیهای زیرش رو درست انجام بدی.
در حین کار، مدار رو قدمبهقدم تست کن. اگر موتور برعکس میچرخید، کافیه جای دو تا سیم رو روی برد رله عوض کنی. میکروسوئیچها هم ممکنه نیاز به جابجایی داشته باشن. قبل از اینکه طناب رو برای تست به دستگیره در وصل کنی، دکمه Hold رو بزن و عملکرد موتور رو به صورت آزاد بررسی کن.
در آخر، پیچهای توقف رو روی قرقره نصب کن و طناب رو بهش گره بزن. ممکنه چند بار طول بکشه تا طول دقیق طناب دستت بیاد. طناب نباید اونقدر سفت باشه که فشار زیادی بیاره و کل جعبه رو از روی در بکنه! از طرفی اگر خیلی شل باشه، نمیتونه دستگیره رو تا انتها بکشه و در باز نمیشه.
برای ثبات بیشتر سیستم، یک قطعه تنظیمکننده (Shim) کوچیک هم لبه در اضافه کردم. نگران نباش، کسی اون جای پیچ کوچیک لبه در رو نمیبینه!
پیدا کردن شناسه یکتای کارت RFID
حالا که دستگاه نصب شده، وقتشه سیستم RFID رو راه بندازیم. احتمالا کد اختصاصی کارت یا تگی که داری رو نمیدونی (طبیعتا برای امنیت بیشتر، کد رو روی کلید چاپ نمیکنن). اما کدی که روی آردوینو آپلود کردیم، هر بار که کارتی اسکن میشه، شمارهاش رو تو پورت سریال چاپ میکنه.
پس برای پیدا کردن این کد، آردوینو رو با کابل USB به کامپیوترت وصل کن. تو نرمافزار Arduino IDE بخش Serial Monitor رو باز کن و Baud Rate رو روی 9600 بذار. بعد از ریست شدن دستگاه، پیغام "Hello world!" ظاهر میشه. حالا کارتت رو روی سنسور بگیر و کدی که روی صفحه چاپ میشه رو یادداشت کن.
این شماره رو کپی کن، تو کدهای آردوینو (بخش define) جایگزین کن و دوباره روی آردوینو آپلود کن. حالا میتونی مطمئن باشی که کارت اختصاصی خودت در رو باز میکنه!
رفع باگها و مشکلات پروژه
تا اینجای کار فکر میکردم پروژهام کامل شده، اما مثل هر کار مهندسی دیگهای، اینجا هم چند تا باگ وجود داشت که باید برطرف میشد.
- همه کارتهای RFID مثل هم نیستن. خیلی از کارتهای جدیدتر ویژگیهای امنیتی خاصی دارن که با این ماژول کار نمیکنن. مثلا کارت ورود به شرکت پدرم با این دستگاه شناسایی نشد و مجبور شد یه کارت جداگانه برای در اتاق همراهش داشته باشه. متأسفانه راه حل خاصی برای این موضوع وجود نداره.
- تو مونتاژ نهایی، سنسور نتونست به خوبی کارت رو از پشت در بخونه؛ در حالی که بیرون از جعبه عالی کار میکرد. متوجه شدم مشکل از موتور بزرگیه که دقیقا پشت سنسور قرار گرفته و این حجم از فلز روی سیگنالها تداخل ایجاد میکنه. راهحل این بود که ماژول RFID رو از جعبه اصلی جدا کنم تا مشکل کاملا حل بشه (هرچند شاید ظاهرش به قشنگی قبل نباشه).
طراحی کاور برای ماژول RFID
با اینکه این تغییر یه جور وصلهپینه به حساب میاومد، اما تصمیم گرفتم حداقل یه کاور برای ماژول RFID طراحی کنم و اون رو مثل یک "بغلدستی" (Sidecar) کنار جعبه اصلی نصب کنم. با این کار دیگه نیازی نبود کل قاب رو از اول پرینت کنم. فایل STL این کاور جدید رو هم تو فایلها گذاشتم.
نتیجهگیری و جمعبندی نهایی
تبریک میگم! تو الان یه دستیار هوشمند داری که در اتاقت رو با سرعت برق و باد برات باز میکنه. توسعه این پروژه پر از تجربههای عالی بود، مخصوصا یادگیری درباره تکنولوژی RFID و محدودیتهاش.
امیدوارم تو هم از این آموزش تو آیسیمدار چیزهای جدیدی یاد گرفته باشی و آماده ساخت D'Opener اختصاصی خودت باشی. وقتشه با این گجت خفن، یه خودی به اونایی که هنوز دنبال کلیدشون میگردن نشون بدی! حتما نظرت رو درباره این پروژه برامون بنویس و اگر سوالی داشتی تو کامنتها بپرس.
فایلهای پیوست
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































گفتگوهای کاربران
هنوز نظری ثبت نشده؛ تو شروع کن!
هنوز نظری ثبت نشده؛ تو شروع کن!