جدول المحتويات:

حوّل Arduino إلى قارئ بطاقة ممغنطة: 9 خطوات (بالصور)
حوّل Arduino إلى قارئ بطاقة ممغنطة: 9 خطوات (بالصور)

فيديو: حوّل Arduino إلى قارئ بطاقة ممغنطة: 9 خطوات (بالصور)

فيديو: حوّل Arduino إلى قارئ بطاقة ممغنطة: 9 خطوات (بالصور)
فيديو: NFC Unlock Doors W/Smartphone 2024, يوليو
Anonim
حوّل Arduino إلى قارئ بطاقة ممغنطة!
حوّل Arduino إلى قارئ بطاقة ممغنطة!
حوّل Arduino إلى قارئ بطاقة ممغنطة!
حوّل Arduino إلى قارئ بطاقة ممغنطة!
حوّل Arduino إلى قارئ بطاقة ممغنطة!
حوّل Arduino إلى قارئ بطاقة ممغنطة!

أعتقد أن الجميع استخدم قارئ البطاقة الممغنطة. يعني من يحمل النقود هذه الأيام؟ ليس من الصعب الحصول عليها أيضًا ، وخلال رحلة إلى متجر الإلكترونيات المحلي المفضل لدي ، وجدت صندوقًا مليئًا بهؤلاء الرجال. لذلك … بالطبع ، التقطت واحدة وأحضرتها إلى المنزل لأرى نوع الأشياء التي يمكنني فعلها بها و AVR.

سيوضح لك هذا التوجيه كيفية توصيل قارئ بطاقة مغناطيسية Magtek بـ AVR أو Arduino / clone وقراءة البيانات من المسار الأول للبطاقة. اربطوا مقاعدكم تتمتع أجهزة قراءة البطاقات الممغنطة بمعدل بت مرتفع!

الخطوة 1: قائمة المعدات

قائمة المعدات
قائمة المعدات
قائمة المعدات
قائمة المعدات

إليك بعض الأشياء التي ستحتاجها للبدء.

  • قارئ البطاقة الممغنطة (المنجم هو قارئ Magetk 90 ملم ثنائي الرأس. 5.00 دولارات)
  • AVR أو Arduino أو clone (ATmega328p ~ 4.30 دولار من Mouser.com
  • لوح لحام
  • بعض الأسلاك
  • ربما رأس إذا كنت تحب هذا الشيء نوعًا ما.
  • شيء لقراءة المنفذ التسلسلي الخاص بك. أستخدم AVR Terminal من BattleDroids.net

هذا كل ما تحتاجه للبدء. اعتمادًا على قارئ magcard الذي تحصل عليه في النهاية ، قد تضطر إلى تعديل هذه التعليمات ، وبالتأكيد الرمز ، للعمل مع القارئ الخاص بك. ومع ذلك ، فإن الكود الذي كتبته يجب أن يجعلك بعيدة جدًا ، كما آمل.

الخطوة 2: قارئ البطاقة الممغنطة ذاتي التوقيت

قارئ البطاقة الممغنطة ذاتي التوقيت
قارئ البطاقة الممغنطة ذاتي التوقيت
قارئ البطاقة الممغنطة ذاتي التوقيت
قارئ البطاقة الممغنطة ذاتي التوقيت
قارئ البطاقة الممغنطة ذاتي التوقيت
قارئ البطاقة الممغنطة ذاتي التوقيت
قارئ البطاقة الممغنطة ذاتي التوقيت
قارئ البطاقة الممغنطة ذاتي التوقيت

تعد قارئات البطاقات المغناطيسية "ذاتية التوقيت" ، مما يعني أنها توفر ساعة تسمى ستروب ، والتي يمكن للمتحكم الدقيق المتصل المزامنة معها. هذه نعمة. هذا يعني أنه لا داعي للقلق بشأن البحث عن إشارة تسجيل الوقت وتوقيت الإشارة لتركز مباشرة على نبض الساعة ، ولا تتأرجح بشكل مزعج في البقعة الجميلة لإشارة الساعة. هذا منطقي عندما تفكر في الضربات الشديدة للبطاقات: كل شخص يقوم بالتمرير بوتيرة مختلفة ، بعضها أبطأ ، وبعضها أسرع من البعض الآخر. يتيح تسجيل الوقت الذاتي حتى لجدتي الجميلة القدرة على استخدام بطاقتها دون كسر معصمها. يذكرني بضرورة تغيير الإعداد الخاص بها الذي يحدد مقدار الوقت الصحيح بين النقرات لتسجيل نقرة مزدوجة….

بيانات قارئ البطاقة هذه صالحة 1.0 لنا قبل وضع الستروب على الخط ، لذلك لا داعي للقلق بشأن التأخير للوصول إلى "وقت البت". بالنسبة للقارئ مزدوج الرأس مثل الذي أستخدمه ، هناك مساران للبيانات متاحان للقراءة. في هذا الكتاب ، سأعرض القراءة من المسار الأول الأساسي لتبدأ. هناك خمسة اتصالات ستحتاج إلى إجرائها (أربعة إذا كنت لا تمانع في التخلي عن المزيد من التحكم الدقيق لاستخدام عدد أقل من منافذ الإدخال / الإخراج). تحقق من الصورة أدناه. يذهب السلك الأحمر إلى +5 فولت بينما يذهب السلك الأسود إلى الأرض. السلك الأخضر هو / CARD_PRESENT ؛ السلك الأصفر هو / STROBE ، والسلك الأبيض / DATA1. تعني الشرطة المائلة للأمام (/) أن البيانات معكوسة. تُقرأ الإشارة المنخفضة (أي 0) على أنها إشارة واحدة أو عالية. الموصلات الأخرى باللون البني لـ / STROBE2 والبرتقالي لـ / DATA2. لن نستخدم هذه. إذا كنت تريد ، يمكنك نسيان / CARD_PRESENT. ينخفض خط البيانات هذا بعد حوالي 17 دورة لتدفق الرأس للإشارة إلى وجود بطاقة (بدلاً من ، على سبيل المثال ، ضجيج عشوائي يتسبب في قيام القارئ بإرسال بيانات زائفة) ويتم استخدامه للتحقق من أن البيانات التي تحصل عليها هي بيانات بطاقة و ليست مهملات. يمكنك تخطي هذا الاتصال إذا قمت بالتحقق من بدء الحارس في دفق البيانات. المزيد عن ذلك لاحقًا. كما ترون أدناه ، استخدمت رأسًا بزاوية قائمة على ذكر متصلاً بلوحة خبز وربطت القارئ بذلك. لقد قمت بتوصيل / STROBE بـ PIND2 (رقم التعريف الشخصي 2 على Arduino) ، / CARD_PRESENT بـ PIND3 (لأغراض التوضيح) ، و / DATA1 إلى PIND4. تأكد من تمكين عمليات السحب على هذه المسامير حتى لا تطفو دبابيسك. لقد استبدلت أيضًا Arduino الخاص بي مقابل Bare Bones AVR لأنني أحب الطريقة التي تناسبها في اللوح.

الخطوة 3: أساسيات البطاقة الممغنطة

أساسيات البطاقة الممغنطة
أساسيات البطاقة الممغنطة

الوظائف الأساسية التي ستحتاج إلى القيام بها لقراءة البطاقة الممغنطة هي: 1. اكتشاف وقت تمرير البطاقة 2. قراءة تدفق البيانات 3. اكتشاف وقت اختفاء البطاقة 4. معالجة البيانات 5. عرض البيانات أولاً ، سأقدم لك بعض أساسيات البطاقة الممغنطة التي ستحتاج إلى معرفتها عندما تبدأ في كتابة التعليمات البرمجية الخاصة بك.

معايير البطاقة الممغنطة

تم توحيد البطاقات المغناطيسية وفقًا لمعيار 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 بت لـ الحرف وقليلًا من أجل التكافؤ. هناك حوالي 79 حرفًا أبجديًا رقميًا على المسار 1. الترتيب المادي مقلوب. أي أن البيانات مكتوبة بشكل عكسي على البطاقة (وبالتالي ، سيتم قراءتها بواسطة البرنامج الثابت الخاص بك). التكافؤ غريب. يبدو تنسيق بيانات البطاقة على النحو التالي:

[SS] [FC] [Primary Account #] [FS] [Name] [FS] [بيانات إضافية] [FS] [ES] [LRC] حيث:

SS Start Sentinel FC Format code FS فاصل الحقول ES End Sentinel LRC Longitudinal Redundancy Check character المسار الأول SS = '٪' ، FC = أحد التنسيقات (ستكون B كثيرًا) ، FS غالبًا ما تكون '' ، ES هي '؟' ويكون حرف LRC عادةً "<" على الرغم من عدم تحديده في المعايير. إلى جانب كتابتها على البطاقة للخلف ، تحتوي البيانات على بت تماثل فردي وهي 0x20 من ASCII. سنتعامل مع هذا عندما نعالج البيانات. يبلغ عرض المسار 2 للمسار الثاني 0.110 بوصة ويبدأ من 0.110 من أعلى البطاقة. وتبلغ كثافة التسجيل 75 بت لكل بوصة. تبلغ البيانات 5 بت لكل حرف وتتكون من 40 رمزًا رقميًا فقط. يجب ألا تصادف أيًا أحرف على هذا المسار. يجب أن يتبع تنسيق بيانات البطاقة هذا الهيكل

[SS] [الحساب الأساسي #] [FS] [بيانات إضافية | بيانات تقديرية] [ES] [LRC]

SS للمسار الثاني هي الفاصلة المنقوطة: '؛' و FS هو '=' مع هذه المعرفة المقدسة تحت حزامك ، تابع إلى الخطوات التالية لرؤية الكود الذي ينفذ الإجراء الموضح أعلاه.

الخطوة 4: اكتشاف وقت تمرير البطاقة

كشف عند تمرير البطاقة
كشف عند تمرير البطاقة

1. اكتشف متى تم تمرير البطاقة بشكل رسمي ، يمكن للمرء التحقق من / CARD_PRESENT الدبوس لمعرفة ما إذا كان قد تم إسقاطه في مستوى منخفض. لحسن الحظ ، هذا ليس ضروريًا حقًا. سوف نتحقق من وجود بطاقة صالحة لاحقًا. بالتناوب ، يمكنك قراءة الدبوس الوامض لمعرفة متى تم وضع الومضات على الدبوس ، ومع ذلك ، فإن هذا سيحقق لك الكثير من تسجيلات الصفر. سيرسل القارئ حوالي 60-70 صفرًا بادئًا لإعلامك بأن البيانات على وشك تقديمها. ومع ذلك ، سنستخدم طبيعة البيانات الثنائية لتحديد وقت بدء تسجيل البتات. حارس البداية (SS) للمسار الأول هو علامة النسبة المئوية (٪). القيمة الثنائية هي 0010 0101 مما يعني أنه سيتم تخزينها (وقراءتها) كـ 1010001 (إنها 7 بت لذا لا يتم نقل البتة الثامنة). الآن ، سيلاحظ القارئ الذكي أنه على الرغم من أن البيانات عكسية ، فإنها لا تتطابق مع قيمة ASCII الثنائية. هذا لأنه 0x20 خارج من سداسي عشري. الرمز٪ هو 0x25 و 0100 0101 هو 0x05. تم طرح بيانات البطاقة 0x20 من القيمة. هذا الشخص المعلق هناك في العضلة العالية هو بت التكافؤ الغريب. يتم وضعها هناك بحيث يكون هناك عدد فردي من "1" في القيمة. لذلك لأننا نعلم أن البطاقة الصالحة ستبدأ دائمًا بحارس البداية هذا ، ولأن بت التكافؤ هو 1 ، فعندما نكتشف أول انتقال من HIGH إلى LOW على دبوس البيانات ، فإننا نعلم أننا بدأنا للتو في تلقي بدء الحارس من البطاقة. الآن ، لن يكون هذا دائمًا صحيحًا ، وستكون الخطة المضمونة هي التحقق من بطاقة / CARD_PRESENT لمعرفة ما إذا كانت منخفضة بالإضافة إلى ذلك. إن أبسط طريقة للكشف عن بداية SS ، هي إنشاء مقاطعة خارجية يتم تشغيلها على الحافة المتساقطة لـ / STROBE. البيانات صالحة 1.0 لنا قبل حافة السقوط ، لذلك عندما تقوم بأخذ عينة من الحافة السقوطية ، فأنت تعلم أنه يمكنك قراءة / DATA1 pin والحصول على قيمة صالحة. إليك الكود لإنشاء المقاطعة الخارجية الخاصة بك التي يتم تشغيلها عند حافة السقوط.

voidInitInterrupt (باطل) {// Setup interrupt BSET (EIMSK، INT0) ؛ // قناع المقاطعة الخارجية BSET (EICRA ، ISC01) ؛ // حافة السقوط BCLR (EICRA ، ISC00) ؛ // حافة السقوط BSET (SREG ، 7) ؛ // I-bit في SREG}

في مشتركي الذي أقوم بتضمينه في جميع برامجي ، يمكن العثور على تعريفات BSET و BCLR. الرجوع إلى هذا الملف إذا كان لديك أي أسئلة حول كيفية تعيين البتات. الآن ، عندما يتم تشغيل المقاطعة ، نريد أخذ عينة من / DATA1 (في الكود الخاص بي المعرف باسم CARD_DATA) وتعيين بعض الشيء في سجل IO للأغراض العامة. إذا كنا في الجزء السابع ، فاحفظ السجل كشخصية في المخزن المؤقت العالمي الخاص بنا. أستخدم سجل GPIOR0 لأنه وصول سريع أنيق. الرمز الزائف هو شيء من هذا القبيل:

إيقاف مؤقت 16 بت مسح المؤقت إذا كانت DATA منخفضة مجموعة BIT = 1 في REGISTER Decrement BIT Set علامة لذلك لا نتخطى أي بيانات أخرى من 0 هي مجموعة عالية BIT = 0 في REGISTER Decrement BIT إذا كانت BIT تساوي 0 أضف بايت إلى المخزن المؤقت زيادة فهرس إعادة تعيين BIT

إذا كنت تسأل نفسك عن سبب التناقص بدلاً من الزيادة ، فتذكر أن البيانات عكسية ، لذا بدلاً من تسجيل البتات كما نحصل عليها من LSB إلى MSB ، فإننا نحفظها من MSB إلى LSB حتى لا نضطر إلى عكس البتات لاحقًا عند معالجة البيانات. إذا كنت تريد حقًا ، يمكنك أيضًا إضافة 0x20 hex هنا ، ولكن نظرًا لأن العدد يقارب 5us على هذه الومضات ، فأنا أبقي المعالجة في روتين خدمة المقاطعة هذا إلى الحد الأدنى.

ISR (INT0_vect) {StopTimer () ، ClearTimer () ، إذا (! BCHK (PIND ، CARD_DATA1)) // معكوس منخفض = 1 {BSET (GPIOR0 ، بت) ؛ --قليل؛ bDataPresent = 1 ؛ } else if (bDataPresent) {BCLR (GPIOR0، bit)؛ --قليل؛ } إذا (بت <0) {buff [idx] = (char) GPIOR0 ؛ ++ معرف ؛ بت = 6 ؛ } StartTimer () ؛} إذا كنت تتساءل عن موضوع عمل التوقيت ، فسيتم تناول ذلك في الخطوة في تحديد وقت مغادرة البطاقة للقارئ.

الخطوة 5: قراءة دفق البيانات

اقرأ دفق البيانات

حسنًا ، لقد أوضحت لك بالفعل كيفية قراءة البيانات ، لأنها جزء من روتين خدمة المقاطعة للمقاطعة الخارجية المتساقطة. تتمثل الطريقة البديلة في وضع علامة في ISR ، وفي الحلقة الرئيسية ، قم باستقصاء العلم وقراءة البيانات بهذه الطريقة ، لكنني أعتقد أن الطريقة التي قدمتها بها أكثر نظافة. كن حكماً بنفسك واكتب حكماً لكن MCU الخاص بك سيسمح بذلك ، ومع ذلك ، دعنا ننتقل إلى معرفة كيفية اكتشاف البطاقة عندما تسحب البطاقة Elvis وتغادر المبنى.

الخطوة 6: كشف البطاقة التي تترك القارئ

كشف بطاقة مغادرة القارئ
كشف بطاقة مغادرة القارئ

كشف عندما ذهبت البطاقة

بشكل رسمي ، يمكن للمرء أن يأخذ عينة من دبوس / CARD_PRESENT ليرى ما إذا كان قد ارتفع مرة أخرى ، لكننا لسنا بحاجة إلى استخدام منفذ إدخال / إخراج آخر. هذا هو المكان الذي يأتي فيه هؤلاء الموقتات. في كل مرة يتم استدعاء المقاطعة لأننا اكتشفنا حافة هبوط على / STROBE ، نوقف المؤقت ، ونمسح قيمة المؤقت ونبدأ في القراءة. عندما ننتهي من القراءة ، نبدأ تشغيل المؤقت مرة أخرى. كرر غثيان الإعلان ، أو حتى يصل المؤقت إلى قيمة معينة. هذا يعني أنه تم استدعاء المقاطعة الأخيرة ولم يتم إدخال المزيد من البيانات ، لذلك نفترض أن هذا هو الأمر ونبدأ في معالجة البيانات التي جمعناها. بالنسبة إلى أجهزة ضبط الوقت ، نستخدم TIMER1 ، أي مؤقت 16 بت. أنا أستخدم مرنانًا 16 ميجا هرتز خارجيًا لجهاز AVR الخاص بي. إذا كنت تستخدم اردوينو ، فمن المحتمل أنك كذلك. لذلك ، اخترت قيمة ما قبل المقياس 1024 مما يعني أن كل (16 ، 000 ، 000/1024) مرة سيزداد الموقت. وهذا يعني أنه سيتم "وضع علامة" 15 ، 625 مرة في الثانية. سترتفع قيمة / CARD_PRESENT للإشارة إلى أن البطاقة تركت القارئ حوالي 150 مللي ثانية بعد آخر بت بيانات. مع العلم بهذا ، قررت فقط التحقق من كل 1/4 من الثانية. سيبدو هذا شيئًا كالتالي:

(((F_CPU) / PRESCALER) / 4) الذي اتضح أنه حوالي 3900. لذلك ، عندما يصل عداد المؤقت TCNT1 إلى 3900 ، فأنا أعلم أنه كان حوالي 300 مللي ثانية ويمكنني أن أستنتج بأمان أن البطاقة تركت القارئ. سهل

#define PRESCALER 1024 # حدد CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 مللي ثانية # حدد StartTimer () BSET (TCCR1B ، CS10) ، BSET (TCCR1B ، CS12) // 1024 prescaler # حدد StopTimer () BCLR (TCCR1B ، CS10)، BCLR (TCCR1B، CS12) # تعريف ClearTimer () (TCNT1 = 0) لقد رأيت في ISR حيث يتم بدء تشغيل المؤقت وإيقافه ومحوه عند كل مقاطعة. الآن ، في الحلقة الرئيسية نتحقق فقط لمعرفة ما إذا كان عداد المؤقت قد وصل إلى القيمة المستهدفة ، وإذا كان الأمر كذلك ، فابدأ معالجة البيانات

لـ (؛ ؛) {if (TCNT1> = CHECK_TIME) {

StopTimer () ، ClearTimer () ، معالجة البيانات()؛ إقرأ البيانات()؛ معرف = 0 ؛ بت = 6 ؛ bDataPresent = 0 ؛ memset (& buff، 0، MAX_BUFF_SZ1) ؛ }} الآن يمكن معالجة البيانات بأمان

كود منسق بواسطة

الخطوة 7: معالجة البيانات

معالجة البيانات
معالجة البيانات

معالجة البيانات

تتكون مرحلة المعالجة من:

  • التحقق من SS صالح
  • التحقق من التكافؤ
  • التحويل إلى ASCII
  • التحقق من صحة ES
  • فحص LRC

هنا ، لا أزعجني بالتحقق من التكافؤ ، لأنني قمت بتعيين هذا الشيء على الصفر. أنا أيضًا لا أحسب LRC لهذا البرنامج التعليمي الصغير. قد يكون هذا شيئًا قد ترغب البرامج الثابتة التي تم تحقيقها بشكل كامل في القيام به ، إليك الكود لمعالجة البيانات بتنفيذ الخطوات المذكورة أعلاه (بدون المذكور سابقًا). ابحث عنها في الصورة أدناه. لقد تم التعليق عليها وتشرح نفسها بنفسها. ملاحظة خاصة حول التكافؤ و ASCII: أقوم ببساطة بمسح بت التكافؤ (بت 7 … أي 1 مع 6 أصفار خلفه) وللتحويل من "بيانات البطاقة" يجب إضافة 0x20 إلى القيمة. هذا عن ذلك.

الخطوة 8: عرض البيانات

اعرض البيانات
اعرض البيانات
اعرض البيانات
اعرض البيانات

اعرض البيانات

تنتقل الشاشة إلى برنامج طرفي كتبته خصيصًا للاتصال بـ AVR عبر RS232 أو USB. البرنامج يسمى AVR Terminal. طريقة ReadData () قبيحة جدًا ونحن نشجعك على إيجاد حل أنظف من الحل الذي توصلت إليه ، وهناك أيضًا ناتج عن الوظيفة في AVR Terminal. الإخراج هو الأول من بطاقة التأمين الصحي ، والثاني من بطاقة فيزا. انقر فوق في الزاوية اليسرى العليا من الصورة واختر الصورة الأصلية أو الكبيرة لرؤيتها بشكل أفضل.

الخطوة 9: تنزيل الكود واختصاره

في هذا الدليل ، ناقشت بعض أساسيات أجهزة قراءة البطاقات الممغنطة وأظهرت لك بعض التعليمات البرمجية لتبدأ في الاتجاه الصحيح في قراءة البيانات من البطاقات الممغنطة. هناك الكثير من العمل الذي يمكن القيام به ، مثل قراءة وفك تشفير المسار الثاني ، وحساب LRC وحساب التكافؤ الفردي على كل بايت. شفرة المصدر الكاملة متاحة للتنزيل أدناه. تمت كتابته في AVR Studio 4.17. أتمنى أن تكون قد استمتعت بهذه التعليمات ، وكما هو الحال دائمًا ، أتطلع إلى تلقي أي تعليقات أو اقتراحات قد تكون لديك.

موصى به: