ساخت یک قفل دیجیتال

مقدمه : در ابتدا لازم می دانم توضیحاتی در رابطه با دو نرم افزاری که قرار است با آن ها این پروژه را انجام دهیم ، بدهم . برای شبیه سازی سخت افزاری پروژه از نرم افزار Proteusو برای کد نویسی از نرم افزار CodeVision AVR استفاده می کنم.فرض را بر این می گذاریم که شما خواننده عزیز این مقاله نحوه استفاده و متصل کردن آن ها و آشنایی با زبان C دارید.در ابتدا و قبل از نوشتن کد های برنامه لازم است داخل نرم افزار Proteus یک پروژه جدید ایجاد کرده و شروع به شبیه سازی سخت افزار می کنیم.فصل اول : ابتدا من یک نمایشگر یا Display با نام LM016L با مشخصات 16x2 ، Alphanumeric LCD از داخل کتابخانه نرم افزار انتخاب نموده و به پروژه اضافه می کنم.این نمایشگر برای نمایش دادن اطلاعات ورودی کاربر و تایید یا عدم تایید رمز عبور به کار می رود. تصویر این نمایشگر را در زیر می توانید مشاهده کنید :در ادامه به توضیح پایه های مورد نیاز برای انجام این پروژه می پردازیم.سپس به سراغ دومین المان یعنی صفحه کلید برای دریافت ورودی از کاربر می رویم.از صفحه کلید با نام Keypad-Phone که یک صفحه کلید 3x4 است استفاده می کنیم. این صفحه کلید دارای کلید های 0 تا 9 و همچنین * و # می باشد. که از اعداد برای دریافت ورودی و از دو نماد دیگر می توان برای دریافت تایید و یا پاک کردن استفاده نمود.تصویر این صفحه کلید را در زیر مشاهده می نمایید :تا اینجا فقط در رابطه با ورودی و خروجی قفل دیجیتالی مورد نظر صحبت کردیم. حال می رسیم به بخش اصلی یعنی بخش پردازش کننده اطلاعات.همانطور که می دانید ما برای پردازش اینکه آیا رمز وارد شده صحیح است یا خیر و سایر عملیات های لازم در این پروژه از میکروکنترلر AVR با نام ATMEGA8 که دارای 1088 بایت SRAM و 512 بایت EEPROMمی باشد استفاده می کنیم.تصویر این پردازنده را در زیر مشاهده می کنید :و در آخر برای نمایش صحیح بودن رمز وارد شده توسط کاربر یک LED قرار می دهیم که در صورت صحت سنجی رمز توسط پردازنده روشن خواهد شد که مدار آن به صورت زیر خواهد بود :از مقدمات و معرفی قطعات سخت افزاری که بگذریم به نحوه اتصال و ساخت مدار این قفل دیجیتالی می رسیم. بیایید با هم رفته رفته این مدار را تکمیل و تفسیر نماییم.در ابتدا برای دریافت ورودی از کاربر باید صفحه کلید را به میکروکنترل وصل نماییم. پایه ها را به ترتیب جدول به هم وصل می نماییم :بعد از متصل کردن پایه های گفته شده به یکدیگر مدار ما به صورت زیر خواهد شد :بعد ورود اطلاعات توسط کاربر عمل پردازش داخل میکروکنترلر صورت می گیرد که منطق آن را در ادامه داخل نرم افزار کد ویژن خواهیم نوشت.اما حال فرض می کنیم همه چیز مهیا است و ما باید خروجی مناسبی به کاربر نمایش دهیم برای این کار باید نمایشگر خود را هم به میکروکنترلر وصل نماییم.برای این کار هم مانند قبل پایه ها را طبق جدول زیر به یکدیگر وصل میکنیم :بعد از متصل کردن اتصالات گفته شده مدار به شکل زیر خواهد بود :آخرین بخش از رسم مدار بخش چراغ سبزاست که در صورت صحیح بودن رمز از سوی کاربر روشن خواهد شد و با متصل کردن این مورد مدار ما کامل شده و می توانیم به سراغ کد های این پروژه برویم.شکل کلی مدار به صورت زیر خواهد بود :فصل دوم : کد نویسی و توضیح خط به خط کد ها.همانطور که در تصویر زیر می بینید در ابتدا ما header و ماکرو های مورد نیاز را تعریف می کنیم. از کتابخانه string برای کار با رشته ها و از کتابخانه delay برای استفاده از تاخیر و از alcdبرای کار با نمایشگر استفاده می کنیم.برای این پروژه سه ماکرو هم با نام های DELETE , ENTER , LOCK تعریف شده اند که کلید * به نام DELETE و با مقدار 10 و کلید # با نام ENTER و با مقدار 11 تعریف شده اند.در ادامه تابع GetKey() را مشاهده می کنید که برای رخداد مناسب جهت فشرده شدن کلید های * و # و عملیات های مربوط به صفحه کلید به کار می رود.در تصویر بالا تمام تابع GetKey() قابل رویت است. همانطور که مشاهده می کنید این تابع تمام کار های مربوط به صفحه کلید را انجام می دهد و در نهایت مقدار key_code برگشت داده می شود.برای نمونه می توان به تشخیص اینکه کاربر کدام کلید را فشار داده است اشاره کرد. ( اگر در درک کد ها مشکل دارید می توانید به منابع زبان C مراجعه نمایید.)تا اینجا به بررسی ورودی از صفحه کلید و تحلیل آن که مثلا کاربر چه کلیدی را فشرده است پرداختیم حال اجازه دهید به پردازش روی ادامه کد ها و تابع اصلی و پردازشگر کل پروژه بپردازیم.تابعی که رمز عبور از کاربر را دریافت و آن را با مقدار رمز عبوری که در ابتدا برای سیستم تعریف کرده ایم مقایسه می کند.چانچه رمز عبور تایید شد چراغ سبزی که در فصل طراحی آن را به میکروکنترلر متصل کردیم را روشن می کند.این تابع چون اهمیت بالایی دارد لازم می دانم آن را خط به خط تفسیر نمایم. در ابتدای این تابع متغیری با نام k تعریف شده است که مقدار برگشتی از تابع GetKey() در آن ذخیره می شود. DDRC.0 = 1 مقدار دهی شده است این بدان معنا است که پورت cروی میکروکنترلر به عنوان پورت خروجی تعریف شده است و همچنین ،مشاهده می کنید که DDRD = 0xF0 تعریف شده است که برای ارتباط با صفحه کلید می باشد.در ادامه به خط lcd_init(16); می رسیم که این بدان معناست که نمایشگرمان را به صورت 16 ستونی دسته بندی کرده ایم.اما اصل این تابع در حلقه while (1) وجود دارد. که نوعی حلقه بی نهایت است. روال کار در این حلقه به ان صورت است که ما منتظر فشرده شدن یک کلید از سمت کاربر می مانیم و بسته به اینکه کلید فشرده شده از سمت کاربر چه می باشد فعالیت های لازمه صورت می گیرد.قاعدتا کلیدی که کاربر انتخاب می کند یا کلید عددی است مانند 0 تا 9 و یا Enter، Deleteمی باشد.اگر این کلید ها عددی بودند قرار بر این است که ارقام را یک به یک از کاربر دریافت کرده و آن ها را در آرایه ای که تحت عنوان User_Code در ابتدای برنامه تعریف کردیم قرار دهد.اولین کاری که در حلقه while انجام دادیم این است که Lock = 0 قرار داده ایم این بدان معناست که خروجی خاموش باشد.بعد نمایشگر را پاک کردیم و مکان نما را به ستون شماره 3 و سطر 0 منتقل کرده ایم و عبارت Lock : OFF را در آن محل نمایش داده ایم.سپس مکان نما را به مختصات (1و0) منتقل کرده و عبارت Pass : را نمایش داده ایم.عبارت GET_KEY یک برچسب می باشد که در ادامه متوجه علت نوشته شدن آن خواهید شد.در حلقه do همانطور که مشخص است در هر مرحله ورود اعداد از سمت کاربر آن ها را یکی یکی خوانده و در k قرار می دهیم. در واقع معنی کلی این حلقه این است که تا زمانی که کاربر هیچ عددی را فشار نداده است برنامه در همین حلقه درجا می زند.یک تاخیر نیم ثانیه ای در ادامه مشاهده می کنید که بدان معناست که منتظر می مانیم تا کاربر دست خود را از کلید فشرده شده بردارد و while زیر این تاخیر برای اطمینان از برداشته شدن دست کاربر از روی کلید می باشد.چنانچه کاربر دست خود را از روی کلید برندارد و کلید را رها نکند برنامه در همین حلقه درجا می زند.بعد از اینکه کاربر کلید را رها کرد برنامه ما به سه قسمت اصلی تقسیم می شود که عبارتند از :الف – آیا کلید فشرده شده عدد است ؟ب – آیا کلید فشرده شده Enter است ؟ج – آیا کلید فشرده شده Delete است ؟که جواب این سوالات با حقله های ادامه برنامه بررسی می شود.اگر مورد الف اتفاق بیافتد :در ابتدا تعداد ارقام ورودی را چک می کنیم که باید کوچکتر از آرایه تعریف شده باشد در صورتی که این شرط بر قرار باشد عملیات های زیر انجام می پذیرد.کد های اسکی ارقام را بدست آورده و آن را در آرایه ذخیره می کنیم اما بر روی نمایشگر کاراکتر * نمایش داده می شود.اگر مورد ب اتفاق بیافتد :در این مرحله کد وارد شده از سمت کاربر با کد پیش فرض مقایسه می گردد.چنانچه نتیجه مقایسه درست بود و کاربر کد را صحیح وارد کرده بود عبارتی مناسب بر روی صفحه نمایش نشان داده می شود و چراغ سبز روشن خواهد شد اما اگر چنانچه کد اشتباه باشد عبارت مناسبی به کاربر نمایش داده می شود و سپس متغیر User_Codeو اندیس ها و صفحه نمایش به طور کامل بعد از تاخیر تعریف شده پاک خواهند شد.اگر مورد ج اتفاق بیافتد :با تابع strcpyf مقدار User_Code به طور کل پاک خواهد شد و بعد از آن اندیس ها نیز پاک خواهند شد.توجه : این پست صرفا یک مقاله ی دانشجویی می باشد چنانچه غلط املایی یا علمی مشاهده نمودید به بنده اطلاع بدید.