یک قفل سخت افزاری بسازیم

یک قفل سخت افزاری بسازیم . :
پورت موازی Parallel یکی از مفیدترین و پرکاربردترین پورتهای کامپیوتر است که کاربران و طراحان برای متصل کردن مداراتی که طراحی کرده اند از آن استفاده میکنند . در این مقاله سعی بر ان میکنم که نحوه استفاده از این پورت را فرا بگیرید . جالب است بدانید که حتی میتوانید با این پورت یک ربات را نیز کنترل کنید . اما در اینجا مبنای کار را در طراحی یک قفل سخت افزاری میگذاریم .
حتما شده است که قفلهای سخت افزاری نرم افزارهای مختلف را در هنگام خرید نرم افزار نیز خریده باشید . شاید برایتان جالب باشد بدانید این قفل چگونه طراحی شده است و اساس کار ان چیست ؟
اگر این مقاله را بخوانید بزودی متوجه خواهید شد که درون تراشه ای که به شما بعنوان قفل سخت افزاری داده شده است چیزی چندان پیچیده نخواهد بود ...
در ابتدا چند تذکر میدهم اینکه :‌
پورت موازی PC ها بسیار حساس هستند کافیست با کمی اشتباه در کار کردن با این پورت کل این پورت را از بین ببرید . اکثرا هم تعمیر این پورت پرهزینه است و شاید بصرفه تر باشد تا یک مادربرد جدید بخرید . بنابراین پیشنهاد میکنم اگر از صحت عملکرد خود و یا مداری که قرار است به این پورت متصل شود اطمینان ندارید یک کارت I/O بخرید و با ان پورت کار کنید . که اگر هم قرار شد ان را خراب کنید . فقط همان کارت را تعویض کنید . این کارت شما میتواند روی اسلات PCI/ISA باشد .
تشریح پورت موازی Parallel
یک پورت موازی 25 پین ماده دارد که عموما برای اتصال پرینتر به کامپیوتر مورد استفاده قرار میگیرد . اما خیلی از سخت افزار ها میتوانند از این پورت اتصال برقرار کنند .
تمام این 25 پین همیشه مورد استفاده نیستند . شاید گاهی تنها یک پین را بخواهید استفاده کنید . parsx
ابتدا به معرفی پین های این پورت میپردازیم :

در شکل فوق شمایی از یک پورت موازی را میبینید که اصولا این پینها از راست به چپ و از بالا به پایین شماره گذاری میشوند . یعنی بالایی ترین و سمت راست ترین پین ، پین شماره 1 و سمت چپ ترین و بالاترین پین شماره 13 و پایین ترین و سمت چپ ترین پین شماره 25 است .
این 25 پین به چهار گروه تقسیم بندی میشوند :

دوازده پین از 25 پین فوق نقش خروجی را دارند و اطلاعات را از کامپیوتر به خارج میفرستند . که هشت پین از این دوازده پین از پین شماره 2 تا 9 هستند که روی هم یک بایت را تشکیل میدهند و به این هشت پین پینهای Data گویند.
پین های 18 تا 25 که در شکل سبز رنگ هستند پینهای GND زمین هستند . از لحاظ منطقی مقدار ارزشی صفر و از لحاظ مفهومی انگار که به زمین متصل هستند .که در این مبحث کاری به آنها نداریم .
پینهای 10 و 11 و 12 و 13 و 15 که به رنگ قرمز رنگ هستند به عنوان ورودی کاربرد دارند . که مقادیر پیشفرض آنها یک است و پین شماره 11 مقدار پیشفرض صفر دارد. بنابراین بایت ورودی که متشکل از پینهای 10 تا 15 هست ( در شکل با S7 تا S3 نمایش داده شده اند) مقدار پیشفرض 127 دارد که معادل دودویی آن 01111111 می باشد .
پینهای شماره 1 و 14 و 16 و 17 نیز بیتهای خروجی هستند که به این چهار پین پینهای STATUS گویند ، که در این مبحث کاری با این پین ها نداریم .parsx
بنابراین نتیجه می گیریم اگر قرار باشد این پورت به پرینتر متصل باشد از طریق پین های شماره 2 تا 9 اطلاعات را به پرینتر می فرستد . و اگر قرار باشد اطلاعاتی را به کامپیوتر از طریق این پورت وارد کنیم م تنها از طریق پینهای شماره 10 تا 13 و 15 می توانیم این کار را انجام دهیم .


حال که با پورت Parallel آشنا شدید نوبت به مقدار دهی پین های این پورت میرسد . همانطور که گفتیم برای قفلمان تنها از دو قسمت ورودی و خروجی این پورت استفاده می کنیم .
عملکرد یک قفل سخت افزاری به این صورت میتواند باشد که هرلحظه یا در زمان معینی برنامه شما ورودی پورت Parallel را چک کند اگر برابر مقداریست که شما در برنامه خود تعیین کرده اید انگاه قفل به پورت متصل است . اما اگر قفل شما به پورت متصل نیست یعنی قفل از پورت جدا شده است یا اتفاقی افتاده است که قفل درست کار نمیکند .
پس باید بتوانیم مقدار را از پورت بخوانیم . (پینهای ورودی) اما چطور می توان اطلاعات را به این پورت وارد کرد . برای انجام این کار میتوانید از قسمت خروجی پورت استفاده کنید . در ساده ترین حالت یعنی مقداری را به خروجی بفرستید و آنگاه همان مقدار را در ورودی بخوانید . اگر این اتفاق ساده در طول اجرای برنامه بیفتد قفل درست کار می کند .
بنابراین باید پینهای خروجی را به پین های ورودی متصل کنید . یک رشته سیم تلفن را بردارید و پین شماره 2 را به پین شماره 15 متصل کنید . بنابراین از این پس هروقت ما پین شماره 2 را صفر کنیم پین شماره 15 هم بصورت خودکار 0 می شود و اگر این سیم را قطع کنیم این پین همان مقدار پیشفرض خود یعنی یک باقی می ماند . که در این مثال این مقدار را صفر می کنیم در نتیجه خروجی ما به صورت 01110111 در می آید که معادل 119 می باشد .
در این مثال ساده ترین حالت ممکن را بیان کردیم می توانید از 5 رشته سیم هم برای ارتباط پین های خروجی به ورودی هم استفاده کنید . مثلا پینهای شماره 2و4و5و6و7 را به پینهای شماره 11و12و13و15و10 متصل کنید یا میتوانید پینهای شماره 9و8و2و3و4 را به پین های شماره 12و13و11و10و15 متصل کنید . و صدها حالت مختلف دیگر . این بستگی به سلیقه خود شما دارد . چرا که مهم این است که در ورودی چه مقداری می خوانید . همانطور که می بینید می توانید از یک رشته سیم یا حداکثر از 5 رشته سیم ( چون حداکثر 5 پین ورودی داریم ) برای ارتباط پین ها استفاده کنید .
پس از ارتباط پین ها می توانید باز هم به دلخواه خودتان هرکدام را که می خواهید روشن یا خاموش کنید ( یعنی مقدار 1 یا 0 بدهید ) . برای خاموش یا روشن کردن این پین ها باید فرآیندی را طی کنید به این صورت که هر مقدار دلخواه بین 0 تا 255 ( چون تنها هشت بیت خروجی داریم پس می توانیم تنها یک بایت اطلاعات بفرستیم ) را به خروجی بفرستید و آنگاه ببینید در ورودی چه مقداری حاصل می شود که این مقدار ورودی دقیقا بستگی به این دارد که چه تعداد از پینهای خروجی را به پین های ورودی متصل کرده اید ؟ آیا مثل ما از یک رشته سیم استفاده کرده اید یا 3 رشته یا از هر 5 رشته استفاده کرده اید ؟ آیا پین شماره 2 را به پین شماره 10 متصل کرده اید یا به پین شماره 11 ؟‌
همانطور که می بینید مقدار ورودی شما بستگی به این دارد که پین ها را چگونه به هم متصل کرده اید و هم اینکه چه مقداری را در خروجی فرستاده اید .
برای اینکه متوجه شویم چه مقداری در ورودی خوانده شده است باید برنامه ای بنویسید که این مقدار ورودی را به شما نمایش دهد . یااگر کمی مهارت در trace کردن برنامه داشته باشید می توانید بدون نوشتن این برنامه اضافی برای خواندن پورت مقدار خوانده شده از پورت ورودی را بخوانید .


ارتباط Visual Basic با پورت موازی :
Microsoft Visual Basic6 را از آن جهت انتخاب کردیم که یادگیری آن نسبت به باقی نرم افزارهای برنامه نویسی ساده ترو همچنین در بین کاربران عمومی تر می باشد . ضمنا بحث های پیچیده سخت افزاری را نیز ندارد .
اما Visual Basic از انجایی که سطح بالاست . قدرت ارتباط با سخت افزار کامپیوتر را مانند زبانهای برنامه نویسی C و مخصوصا اسمبلی را ندارد . هرچند QBasic این قابلیت را دارد !!!
اما این نقطه ضعف این نرم افزار نیست بلکه این برنامه با استفاده از Dynamic Linked Library یا DLL ها میتواند این نقصان را برطرف کند .
بنابراین برای ارتباط با پورت موازی یا هر قطعه سخت افزاری شما میتوانید با زبان برنامه نویسی دیگری برنامه ای بصورت DLL بنویسید و انرا وارد VB کنید .
بنابراین برای نوشتن این قفل به یک فایل Dll نیاز داریم تا بتوانیم با قفل ارتباط برقرار کنیم . این فایل را می توانید به راحتی با جستجوی iodll در اینترنت به صورت رایگان دانلود کنید .
پس از دانلود فایل io.dll آن را در شاخه سیستم خود کپی کنید :

%systemroot%\system32


برای استفاده از فایل در پروژه باید انرا در بخش module استفاده کنید تا برای کل پروژه قابل تعریف شده باشد . ( برای اضافه کردن ماژول به پروژه روی نام پروژه در پنجره project کلیک راست کنید و گزینه add module را انتخاب کنید . )
بنابراین در ماژول یک کد زیر را وارد کنید :

Public Declare Sub PortOut Lib "io.dll" (ByVal Port As Integer, ByVal value As Byte)
Public Declare Function PortIn Lib "io.dll" (ByVal Port As Integer) As Byte
دکلریشن اولی برای ساب پراسیجر portout ‌ میباشد . که دو ارگومان دارد اولی ادرس پورت است بصورت int که ادرس انرا باید از systeminfo یا از device manager پیدا کنید . اما بیشتر در اکثر کامپیوتر ها ادرسهای 378H برای بخش خروجی پورت پرینتر LPT1 و ادرس 379H برای ورودی می باشد .
که برای استفاده انها در portout برنامه ما باید انها رابه دسیمال تبدیل کنید یعنی بترتیب 888 ، 889 در این قسمت مقدار 888 را میفرستید . پس آدرس پورت موازی ما طبق استاندارد گفته شده برای قسمت خروجی 888 می باشد . اما آرگومان دوم PortOut مقداریست که به خروجی می فرستید . این مقدار همانطور که قبلا هم گفتیم می تواند بین 0 تا 255 باشد . ما بدلخواه عدد 0 را می فرستیم .
در تابع PortIn ادرس پورت ورودی را وارد میکنید 889 . این تابع مقدار خوانده شده از پین های ورودی را بر می گرداند .
همانطور که گفتیم ما در قفلمان پین شماره 2 را به پین شماره 15 توسط تنها یک رشته متصل می کنیم. آنگاه عدد دلخواهمان که 0 بود را به خروجی می فرستیم . حال باید ببینیم در ورودی چه مقداری خوانده می شود .
از یک برنامه کمکی برای خواندن مقدار ورودی استفاده می کنیم بنابراین برنامه دیگری موقتا می نویسیم و در آن با تعریف ماژول گفته شده مقدار ورودی را چاپ می کنیم . تا بدانیم در برنامه اصلی که قرار است قفل برای آن باشد چه مقداری خوانده شود .
یک دکمه در فرم برنامه موقتتان قرار دهید و در کد دکمه کد زیر را وارد کنید :

Call PortOut(888,0)
lckTemp = PortIn(889)
 label1.text = lckTemp

در label1 که در فرم برنامه تان قرار داده اید مقدار خوانده شده چاپ می شود . که در مثال ما عدد 119 خوانده می شود .
حال که مقدار ورودی را می دانیم شروع به نوشتن برنامه اصلی می کنیم .

نحوه عملکرد برنامه در ارتباط با قفل :
قرار بر این است که برنامه به شرطی اجرا شود که این قفل ساده ما (یک رشته سیم گفته شده ) به پورت متصل باشد بنابراین مداما در طول اجرای برنامه باید مقدار ورودی پورت موازی را با عددی که در برنامه فوق بدست آوردیم چک کنیم . عدد بدست آمده در برنامه گفته شده مقدار 119 بود .
در ویژوال بیسیک کنترلی به نام تایمر میتواند بصورت مداوم عملیات مورد نظر شما را تکرار کند . عملیات مورد نظر ما خواندن مقدار پورت موازی و چک کردن مقدار آن با مقدار مورد نظرمان که 119 می باشد است . در صورتیکه این مقدار خوانده نشود برنامه باید از کار بیفتد یا حداقل با پیغامی به کاربر بگوید که قفل را سر جایش قرار دهید .
حال می خواهیم توسط یک تایمر همیشه این مقدار ورودی را چک کنیم . بمحض اینکه این مقدار تغییر کند یا از بین برود ( قفل از جایش در بیاید )‌ برنامه بحالت معلق در بیاید و درخواست قفل کند .
کد تایمر شما می تواند به این صورت باشد :
Private Sub lcktmr_Timer()
Dim lckTemp As Integer
Call PortOut(888, 0)
lckTemp = PortIn(889)
If lckTemp <> 119 Then
 Call MsgBox("Insert Hardware-Lock in Parallel Port" _
    , vbOKCancel, "Warning...")
End
   End If
تشریح کد :
Call PortOut(888, 0)
lckTemp = PortIn(889)

در این خط عدد 0 را به خروجی ارسال کرده ایم که پینهای 2 تا 9 را مقدار دهی میکند .
If lckTemp <> 119 Then

در اینجاست که بودن یا نبودن قفل مشخص میشود . چون مقدار 0 را ارسال کرده ایم انتظار داریم مقدار 119 خوانده شود وگرنه قفل یا خراب است یا نیست . بنابراین مقدار خوانده شده در lckTemp چک میشود که مخالف 119 است .

Call MsgBox("Insert Hardware-Lock in Parallel Port" _
    , vbOKCancel, "Warning...")
End

پس بعد از دادن اخطار از برنامه خارج می شود .


همانطور که مشاهده کردید به همین راحتی می توانید یک قفل سخت افزاری طراحی کنید . اما خوب قفل های سخت افزاری موجود در بازار هم درست است که از این منطق استفاده می کنند . اما بهرحال با استفاده از چیپ هایی که در پشت قفل قرار می دهند روند کار را پیچیده تر می کنند .

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد