فهرست مطالب:

تبدیل آردوینو به کارت خوان مغناطیسی!: 9 مرحله (همراه با تصاویر)
تبدیل آردوینو به کارت خوان مغناطیسی!: 9 مرحله (همراه با تصاویر)

تصویری: تبدیل آردوینو به کارت خوان مغناطیسی!: 9 مرحله (همراه با تصاویر)

تصویری: تبدیل آردوینو به کارت خوان مغناطیسی!: 9 مرحله (همراه با تصاویر)
تصویری: حرکات زشت سحر قریشی در باشگاه مردانه در دبی#سحرقریشی #امیرتتلو #تتلو #سحر_قریشی 2024, نوامبر
Anonim
آردوینو خود را به کارت خوان مغناطیسی تبدیل کنید!
آردوینو خود را به کارت خوان مغناطیسی تبدیل کنید!
آردوینو خود را به کارت خوان مغناطیسی تبدیل کنید!
آردوینو خود را به کارت خوان مغناطیسی تبدیل کنید!
آردوینو خود را به کارت خوان مغناطیسی تبدیل کنید!
آردوینو خود را به کارت خوان مغناطیسی تبدیل کنید!

من معتقدم که همه از کارت خوان مغناطیسی استفاده کرده اند. منظورم این است که این روزها چه کسی پول نقد حمل می کند؟ به دست آوردن آنها نیز کار سختی نیست و در سفری که به مغازه لوازم الکترونیکی مورد علاقه ام داشتم ، سطل پر از این بچه ها را پیدا کردم. بنابراین … البته ، من یکی را برداشتم و به خانه آوردم تا ببینم با آن و AVR چه نوع کارهایی می توانم انجام دهم.

این دستورالعمل به شما نشان می دهد که چگونه یک کارت خوان مغناطیسی Magtek را به AVR یا Arduino/clone متصل کرده و داده ها را از اولین مسیر کارت بخوانید. صندلی های خود را ببندید ؛ کارت خوانهای مغناطیسی نرخ بیت بالایی دارند!

مرحله 1: لیست تجهیزات

لیست تجهیزات
لیست تجهیزات
لیست تجهیزات
لیست تجهیزات

در اینجا چند مورد است که برای شروع نیاز دارید.

  • کارت خوان مغناطیسی (Mine یک دستگاه خوان دو سر 90 میلیمتری Magetk است. 5.00 دلار)
  • AVR ، Arduino یا کلون (ATmega328p 4. 4.30 دلار از Mouser.com
  • تخته نان بدون لحیم
  • مقداری سیم
  • اگر آن چیز را دوست دارید شاید یک سرصفحه باشد.
  • چیزی برای خواندن پورت سریال شما من از ترمینال AVR از BattleDroids.net استفاده می کنم

این تنها چیزی است که برای شروع نیاز دارید. بسته به خواننده magcard که در نهایت به دست می آورید ، ممکن است مجبور شوید این دستورالعمل ها و مطمئناً کد را برای کار با خواننده خاص خود تغییر دهید. با این حال ، امیدوارم کدی که من نوشته ام شما را بسیار نزدیک کند.

مرحله 2: کارت خوانهای مغناطیسی خودکار

کارت خوانهای مغناطیسی خودکار
کارت خوانهای مغناطیسی خودکار
کارت خوانهای مغناطیسی خودکار
کارت خوانهای مغناطیسی خودکار
کارت خوان های مغناطیسی خودکار
کارت خوان های مغناطیسی خودکار
کارت خوان های مغناطیسی خودکار
کارت خوان های مغناطیسی خودکار

کارت خوانهای مغناطیسی "خودکار" هستند ، به این معنی که آنها یک ساعت به نام استروب ارائه می دهند ، که میکروکنترلر متصل به آن می تواند همگام شود. این یک نعمت است. این بدان معناست که شما نگران این نباشید که به دنبال یک سیگنال زمان سنج باشید و زمان سیگنال را مستقیماً روی نبض ساعت متمرکز کنید ، و هیچ نوسان مزاحم در نقطه شیرین سیگنال ساعت ایجاد نشود. وقتی به کشیدن کارت فکر می کنید این امر منطقی است: همه با سرعت متفاوتی ضربه می زنند ، برخی کندتر ، برخی سریعتر از دیگران. تنظیم خودکار حتی به مادربزرگ نازنینم این امکان را می دهد که از کارت خود بدون شکستن مچ دست خود استفاده کند. به من یادآوری می کند که باید تنظیماتی را برای او انجام دهم که تعیین می کند چقدر زمان بین کلیک ها برای ثبت دوبار کلیک معتبر است….

داده های این کارت خوان 1.0 بار قبل از قرار دادن استروب در خط معتبر است ، بنابراین هیچ نگرانی در مورد تاخیر در وارد شدن به "زمان کمی" وجود ندارد. برای خواننده دو سر مانند دستگاهی که من استفاده می کنم ، دو آهنگ داده برای خواندن وجود دارد. در این قسمت ، برای شروع کار ، خواندن را از اولین آهنگ اصلی نشان می دهم. پنج اتصال وجود دارد که باید انجام دهید (اگر نمی خواهید با استفاده از پورت های ورودی/خروجی کمتر ، کنترل تنظیم دقیق تری را کنار بگذارید) چهار اتصال وجود دارد. تصویر زیر را بررسی کنید. سیم قرمز به +5V می رود در حالی که سیم سیاه به زمین می رود. سیم سبز /CARD_PRESENT است ؛ سیم زرد /STROBE و سیم سفید /DATA1 است. اسلش رو به جلو (/) به این معنی است که داده ها معکوس هستند. سیگنال کم (یعنی 0) به عنوان یک یا بالا خوانده می شود. اتصالات دیگر قهوه ای برای /STROBE2 و نارنجی برای /DATA2 هستند. ما از اینها استفاده نمی کنیم در صورت تمایل می توانید /CARD_PRESENT را فراموش کنید. این خط داده پس از حدود 17 چرخش شار سر پایین می آید و نشان می دهد که یک کارت وجود دارد (به عنوان مثال ، به عنوان مثال ، سر و صدای تصادفی باعث می شود خواننده شما اطلاعات جعلی ارسال کند) و برای تأیید اینکه داده هایی که دریافت می کنید داده های کارت و آشغال نیست. اگر برای نگهبان شروع در جریان داده ها بررسی کنید ، می توانید از این اتصال صرف نظر کنید. بعداً در مورد آن بیشتر توضیح دهید. همانطور که در زیر مشاهده می کنید ، من از یک سربرگ زاویه راست مردانه متصل به یک تخته نان استفاده کردم و خواننده خود را به آن متصل کردم. من /STROBE را به PIND2 (پین دیجیتال 2 در آردوینو) ، /CARD_PRESENT را به PIND3 (برای اهداف تصویرسازی) ، و /DATA1 را به PIND4 متصل کردم. مطمئن شوید که کشش ها را روی این پین ها فعال کرده اید تا پین های شما شناور نشوند. من همچنین آردوینو خود را با Bare Bones AVR عوض کردم زیرا از نحوه قرار گرفتن آن در تخته نان خوشم می آید.

مرحله 3: اصول اولیه کارت مغناطیسی

اصول کارت مغناطیسی
اصول کارت مغناطیسی

عملکردهای اولیه ای که برای خواندن کارت مغناطیسی باید انجام دهید عبارتند از: 1. تشخیص زمانی که کارت کشیده شده است 2. جریان داده ها را خوانده است data ابتدا من برخی از اصول اولیه کارت مغناطیسی را به شما معرفی می کنم که هنگام نوشتن کد خود باید بدانید.

استانداردهای کارت مغناطیسی

کارتهای مغناطیسی بر اساس ISO در اسناد زیر استاندارد می شوند: 7810 مشخصات فیزیکی سند اندازه کارت اعتباری 7811-1 برجسته سازی 7811-2 نوار مغناطیسی-اجبار کم 7811-3 موقعیت کاراکترهای برجسته 7811-4 محل آهنگهای 1 و 2 7811- 5 محل ردیف 3 7811-6 نوار مغناطیسی - فشار زیاد 7813 کارت های تراکنش مالی همانطور که مشاهده می کنید ، کارت های مالی در یک سند جداگانه مشخص شده اند و اغلب فرمت های متفاوتی نسبت به ، مثلاً کارت خواربارفروشی یا کارت تلفن بین المللی شما دارند. شما باید برای این تفاوت ها برنامه ریزی کنید. من فقط یک کارت اعتباری و یک کارت بیمه داشتم ، بنابراین برای این نوع برنامه ها برنامه ریزی کردم (که هر دو به صورت B هستند).

فرمت های کارت

چندین فرمت مختلف برای کارت های مغناطیسی وجود دارد. قالب A و B رایج هستند ، B معمولی ترین موردی است که من دیده ام و در این کد پشتیبانی می شود. من معتقدم که قالب های C تا M توسط ISO محفوظ است ، در حالی که N تا ؟؟ برای استفاده سفارشی سازمانی محفوظ است. مسیر 1 برای کارت های مالی ، اولین آهنگ با 210 بیت در اینچ ضبط می شود و اولین 0.110 اینچ کارت از بالا است. داده ها به عنوان "داده کارت" به صورت 7 بیت برای هر کاراکتر رمزگذاری می شوند. این 6 بیت برای شخصیت و کمی برای برابری. characters 79 کاراکتر الفبایی در مسیر 1 وجود دارد. ترتیب فیزیکی برعکس است. یعنی داده ها برعکس روی کارت نوشته شده است (و بنابراین ، توسط سیستم عامل شما خوانده می شود) به عنوان. برابری فرد است. قالب داده کارت به این شکل است:

[SS] [FC] [حساب اصلی #] [FS] [نام] [FS] [اطلاعات اضافی] [FS] [ES] [LRC] که در آن:

SS شروع نگهبان FC قالب فرمت کد FS جدا کننده فیلد ES پایان نگهبان LRC بررسی طول اضافی کاراکتر یک SS = '٪' را دنبال کنید ، FC = یکی از فرمت ها (بارها B می شود) ، FS اغلب '' ، ES ''؟ ' و کاراکتر LRC معمولاً "<" است اگرچه در استانداردها مشخص نشده است. علاوه بر اینکه روی کارت به عقب نوشته شده است ، داده ها دارای یک عدد برابری فرد هستند و از ASCII 0x20 هستند. هنگامی که داده ها را پردازش می کنیم ، این کار را انجام می دهیم. Track 2 Track two دارای عرض 0.110 اینچ است و 0.110 از بالای کارت شروع می شود. تراکم ضبط آن 75 بیت در اینچ است. داده ها 5 بیت برای هر کاراکتر است و فقط شامل حدود 40 نماد عددی است. شما نباید با هیچ کدام برخورد کنید حروف موجود در این آهنگ. قالب داده کارت باید از این ساختار پیروی کند

[SS] [حساب اصلی #] [FS] [اطلاعات اضافی | داده های اختیاری] [ES] [LRC]

SS برای مسیر دو نقطه ویرگول است: '؛' و FS است '=' با داشتن این دانش مقدس ، مراحل بعدی را ادامه دهید تا کد اجرای روش فوق را مشاهده کنید.

مرحله 4: تشخیص دهید که یک کارت کشیده می شود

تشخیص زمانی که کارت کشیده می شود
تشخیص زمانی که کارت کشیده می شود

1. هنگامی که یک کارت به طور رسمی کشیده شده است را تشخیص دهید ، پین /CARD_PRESENT را بررسی می کنید تا ببینید آیا کم است یا خیر. خوشبختانه ، این واقعا ضروری نیست. بعداً کارت معتبر را بررسی می کنیم. متناوباً ، می توانید پین استروب خود را بخوانید تا ببینید چه زمانی استروب ها روی سنجاق قرار گرفته اند ، با این حال ، این امر صفرهای زیادی را برای شما به ارمغان می آورد. خواننده حدود 60-70 صفر را ارسال می کند تا به شما اطلاع دهد که اطلاعات در حال ارائه است. با این حال ، ما قصد داریم از ماهیت داده های دودویی برای تعیین زمان شروع ضبط بیت ها استفاده کنیم. نگهبان شروع (SS) برای مسیر یک علامت درصد (٪) است. مقدار دودویی آن 0010 0101 است ، به این معنی که ذخیره می شود (و خوانده می شود) به عنوان 1010 001 (7 بیت است ، بنابراین بیت 8 منتقل نمی شود). در حال حاضر ، خواننده زیرک متوجه می شود که اگرچه داده ها معکوس هستند ، اما با مقدار ASCII باینری مطابقت ندارند. دلیل آن این است که 0x20 از hex فاصله دارد. نماد٪ 0x25 و 0100 0101 0x05 است. داده های کارت 0x20 از مقدار کم شده است. آن یکی که در آنجا با صدای بلند آویزان است ، مقدار برابری عجیب است. آن را طوری قرار داده است که عدد فرد "1" در مقدار وجود داشته باشد. بنابراین از آنجا که می دانیم یک کارت معتبر همیشه با این نگهبان شروع می شود و چون بیت برابری 1 است ، هنگامی که اولین گذر HIGH به LOW را در پین داده تشخیص می دهیم ، می دانیم که تازه شروع به دریافت نگهبان را از کارت شروع کنید در حال حاضر ، این همیشه درست نخواهد بود ، و یک برنامه بی عیب و نقص این است که کارت /CARD_PRESENT را بررسی کنید تا ببینید آیا علاوه بر این ، پایین آمده است یا خیر. ساده ترین راه برای تشخیص شروع SS ، ایجاد یک وقفه خارجی است که در لبه در حال سقوط /STROBE ایجاد می شود. داده ها قبل از سقوط لبه 1.0 معتبر هستند ، بنابراین وقتی از لبه در حال سقوط نمونه برداری کردید ، می دانید که می توانید پین /DATA1 را بخوانید و یک مقدار معتبر دریافت کنید. در اینجا کد ایجاد وقفه خارجی شما ایجاد شده است که در لبه در حال سقوط فعال می شود.

voidInitInterrupt (void) {// Setup interrupt BSET (EIMSK، INT0)؛ // ماسک وقفه خارجی BSET (EICRA، ISC01)؛ // لبه سقوط BCLR (EICRA ، ISC00) ؛ // لبه در حال سقوط BSET (SREG ، 7) ؛ // I-bit در SREG}

در Common.h من که در همه برنامه های خود گنجانده ام ، تعاریف BSET و BCLR را می توان یافت. اگر در مورد نحوه تنظیم بیت ها س questionsالی دارید ، به آن فایل مراجعه کنید. اکنون ، وقتی وقفه فعال می شود ، می خواهیم از /DATA1 (در کد من که به عنوان CARD_DATA تعریف شده است) نمونه برداری کرده و کمی را در یک ثبت IO با هدف کلی تنظیم کنیم. اگر در بیت 7 هستیم ، ثبت نام را به عنوان یک کاراکتر در بافر جهانی خود ذخیره کنید. من از رجیستر GPIOR0 استفاده می کنم زیرا دسترسی سریع دارد. کد شبه چیزی شبیه به این است:

توقف تایمر 16 بیتی پاک کردن تایمر اگر DATA LOW باشد BIT = 1 در REGISTER Decrement BIT تنظیم پرچم ، بنابراین دیگر 0 را رد نمی کنیم DATA HIGH است BIT = 0 در REGISTER BIT کاهش اگر BIT 0 باشد به بافر اضافه کنید شاخص افزایش بازنشانی BIT

اگر از خود می پرسید چرا به جای افزایش ، کاهش می یابد ، به یاد داشته باشید که داده ها برعکس هستند ، بنابراین به جای ثبت بیت ها از LSB به MSB ، آنها را از MSB به LSB ذخیره می کنیم تا مجبور نباشیم بیت ها را معکوس کنیم. بعدا هنگام پردازش داده ها اگر واقعاً می خواهید ، می توانید 0x20 hex را نیز در اینجا اضافه کنید ، اما از آنجا که در این بارق ها حدود 5 درجه است ، من پردازش در این روال سرویس وقفه را به حداقل می رسانم.

ISR (INT0_vect) {StopTimer ()؛ ClearTimer () ؛ if (! BCHK (PIND، CARD_DATA1)) // معکوس کم = 1 {BSET (GPIOR0 ، بیت) ؛ -بیت bDataPresent = 1 ؛ } else if (bDataPresent) {BCLR (GPIOR0 ، بیت) ؛ -بیت } if (بیت <0) {buff [idx] = (char) GPIOR0؛ ++ idx؛ بیت = 6 ؛ } StartTimer ()؛} اگر از خود می پرسید که زمان بندی کسب و کار چیست ، این مرحله در تعیین زمان خروج کارت از خواننده توضیح داده شده است.

مرحله 5: جریان داده ها را بخوانید

جریان داده ها را بخوانید

خوب ، من قبلاً نحوه خواندن داده ها را به شما نشان دادم ، زیرا بخشی از روال سرویس وقفه برای وقفه خارجی خارجی است. یک روش جایگزین این است که یک پرچم در ISR تنظیم کنید ، و در حلقه اصلی پرچم را انتخاب کنید و داده ها را به این شکل بخوانید ، اما من معتقدم که شیوه ارائه آن پاک تر است. قضاوت خودتان باشید و نظر خود را بنویسید به هر حال MCU شما اجازه می دهد. با این اوصاف ، بیایید به چگونگی تشخیص اینکه وقتی کارت الویس را کشیده و ساختمان را ترک کرده است ، پی ببریم.

مرحله 6: تشخیص کارت خروج از خواننده

تشخیص کارت خروج از خواننده
تشخیص کارت خروج از خواننده

تشخیص دهید وقتی کارت رفته است

به طور رسمی ، می توانید پین /CARD_PRESENT را نمونه گیری کنید تا ببینید آیا دوباره بالا رفته است ، اما نیازی به استفاده از پورت ورودی /خروجی دیگر نداریم. این جایی است که آن تایمرها وارد می شوند. هر بار که وقفه فراخوانی می شود زیرا در لبه /STROBE یک لبه در حال سقوط را تشخیص داده ایم ، یک تایمر را متوقف می کنیم ، مقدار تایمر را پاک می کنیم و شروع به خواندن می کنیم. وقتی خواندن را به پایان رساندیم ، تایمر را دوباره شروع می کنیم. حالت تهوع را تکرار کنید ، یا تا زمانی که زمان سنج به مقدار مشخصی برسد. این بدان معناست که آخرین وقفه فراخوانی شده است و اطلاعات بیشتری وارد نشده است ، بنابراین ما فرض می کنیم که تمام شده است و پردازش داده های جمع آوری شده را شروع می کنیم. برای تایمرها ، ما از TIMER1 ، یعنی تایمر 16 بیتی استفاده می کنیم. من از یک رزوناتور 16 مگاهرتز به صورت خارجی برای AVR خود استفاده می کنم. اگر از آردوینو استفاده می کنید ، احتمالاً شما نیز استفاده می کنید. بنابراین ، من مقدار پیش فروش 1024 را انتخاب کرده ام که به این معنی است که هر زمان (16 ، 000 ، 000 /1024) زمان سنج افزایش می یابد. به این معنا که 15 ، 625 بار در ثانیه "تیک" می زند. /CARD_PRESENT بالا می رود و نشان می دهد که کارت بعد از آخرین بیت اطلاعات 150 میلی ثانیه از خواننده خارج شده است. با دانستن این موضوع ، من فقط تصمیم گرفتم هر 1/4 ثانیه را بررسی کنم. این چیزی شبیه به این خواهد بود:

((((F_CPU) / PRESCALER) / 4) بنابراین ، هنگامی که شمارنده تایمر TCNT1 به 3900 برسد ، من می دانم که حدود 300ms بوده است و می توانم با خیال راحت نتیجه بگیرم که کارت خوان را ترک کرده است. آسان

#تعریف PRESCALER 1024#تعریف CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#تعریف StartTimer () BSET (TCCR1B، CS10) ، BSET (TCCR1B، CS12) // 1024 prescaler#define StopTimer () BCLR (TCCR1 ، CS10) ، BCLR (TCCR1B ، CS12)#تعریف ClearTimer () (TCNT1 = 0) شما در ISR مشاهده کرده اید که تایمر در هر وقفه شروع به کار ، متوقف و پاک می شود. اکنون ، در حلقه اصلی ، ما فقط بررسی می کنیم که آیا شمارنده تایمر به مقدار مورد نظر ما رسیده است یا خیر ، و اگر چنین است ، پردازش داده را شروع کنید

برای (؛؛) {if (TCNT1> = CHECK_TIME) {

StopTimer ()؛ ClearTimer () ؛ ProcessData () ؛ ReadData () ؛ idx = 0؛ بیت = 6 ؛ bDataPresent = 0 ؛ ممست (& buff، 0، MAX_BUFF_SZ1)؛ }} اکنون پردازش داده ها ایمن است

قالب بندی شده توسط

مرحله 7: پردازش داده ها

پردازش داده ها
پردازش داده ها

داده ها را پردازش کنید

مرحله پردازش شامل موارد زیر است:

  • بررسی SS معتبر
  • بررسی برابری
  • تبدیل به ASCII
  • بررسی ES معتبر
  • بررسی LRC

در اینجا ، من برای بررسی برابری زحمت نمی کشم ، زیرا فقط آن بیت را به صفر رساندم. من همچنین LRC را برای این آموزش کوچک محاسبه نمی کنم. این چیزی است که یک سیستم عامل کاملاً درک شده ممکن است بخواهد انجام دهد. در اینجا کد پردازش داده ها در مراحل بالا (بدون موارد ذکر شده قبلی) آمده است. آن را در تصویر زیر پیدا کنید. کامنت گذاری شده و کاملاً قابل توضیح است. نکته ویژه در مورد برابری و ASCII: من به سادگی بیت برابری (بیت 7 … یعنی 1 با 6 صفر پشت آن) را پاک می کنم و برای تبدیل از "داده های کارت" باید 0x20 را به مقدار اضافه کنید. این در مورد آن است.

مرحله 8: نمایش داده ها

نمایش داده ها
نمایش داده ها
نمایش داده ها
نمایش داده ها

نمایش داده ها

صفحه نمایش به برنامه پایانه ای می رود که من مخصوص اتصال به AVR از طریق RS232 یا USB نوشتم. این برنامه AVR Terminal نام دارد. روش ReadData () بسیار زشت است و شما تشویق می شوید که راه حلی تمیزتر از راه حلی را که من به آن دست یافته ام ، بیابید. همچنین یک خروجی از عملکرد در ترمینال AVR وجود دارد. خروجی اول کارت بیمه درمانی است ، و کارت دوم کارت ویزا است. روی در گوشه سمت چپ بالای تصویر کلیک کنید و تصویر اصلی یا بزرگ را انتخاب کنید تا بهتر دیده شود.

مرحله 9: بارگیری و بسته بندی کد

در این دستورالعمل برخی از اصول دستگاه های خواننده کارت های مغناطیسی را مورد بحث قرار داده و برخی از کد ها را به شما نشان داده ام تا بتوانید در خواندن داده ها از کارت های مغناطیسی در جهت درست شروع به کار کنید. کارهای بیشتری می توان انجام داد ، مانند خواندن و رمزگشایی آهنگ دوم ، محاسبه LRC و محاسبه برابری فرد در هر بایت. کد منبع کامل برای بارگیری در زیر موجود است. در AVR Studio 4.17 نوشته شده است. امیدوارم از این دستورالعمل لذت برده باشید و مانند همیشه ، منتظر نظرات یا پیشنهادات شما هستم. کد نویسی و AVR'ing مبارک!

توصیه شده: