সুচিপত্র:

আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!: 9 টি ধাপ (ছবি সহ)
আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!: 9 টি ধাপ (ছবি সহ)

ভিডিও: আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!: 9 টি ধাপ (ছবি সহ)

ভিডিও: আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!: 9 টি ধাপ (ছবি সহ)
ভিডিও: কীভাবে একটি রিমোট কন্ট্রোল লাইট বানাবো.How To Make A Remot Control Light.Joy Barua Lablu 2024, জুলাই
Anonim
আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!
আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!
আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!
আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!
আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!
আপনার Arduino কে ম্যাগনেটিক কার্ড রিডারে পরিণত করুন!

সবাই ম্যাগনেটিক কার্ড রিডার ব্যবহার করেছে, আমি বিশ্বাস করি। মানে, আজকাল কে নগদ বহন করে? তারা আপনার হাত পেতে কঠিন নয়, হয়, এবং আমার প্রিয় স্থানীয় ইলেকট্রনিক্স দোকান একটি ভ্রমণের সময়, আমি এই ছেলেরা একটি বিন পাওয়া। তাই…। অবশ্যই, আমি একটি তুলে নিয়ে বাড়িতে নিয়ে এসেছিলাম এটা দেখতে যে আমি কি ধরনের জিনিস এবং এটি দিয়ে একটি AVR করতে পারি।

এই নির্দেশনাটি আপনাকে দেখাবে কিভাবে ম্যাগটেক ম্যাগনেটিক কার্ড রিডারকে একটি AVR বা Arduino/clone এর সাথে সংযুক্ত করতে হবে এবং কার্ডের প্রথম ট্র্যাক থেকে ডেটা পড়তে হবে। আপনার আসন বকল; চৌম্বকীয় কার্ড পাঠকদের উচ্চ বিট রেট আছে!

ধাপ 1: সরঞ্জাম তালিকা

সরঞ্জাম তালিকা
সরঞ্জাম তালিকা
সরঞ্জাম তালিকা
সরঞ্জাম তালিকা

এখানে কিছু জিনিস আছে যা আপনাকে শুরু করতে হবে।

  • ম্যাগনেটিক কার্ড রিডার (খনি একটি ম্যাগটেক 90 মিমি ডুয়াল হেড রিডার। $ 5.00)
  • AVR, Arduino, বা ক্লোন (ATmega328p 4. $ 4.30 Mouser.com থেকে
  • ঝালহীন রুটিবোর্ড
  • কিছু তার
  • আপনি যদি এই ধরণের জিনিস পছন্দ করেন তবে সম্ভবত একটি হেডার।
  • আপনার সিরিয়াল পোর্ট পড়ার জন্য কিছু। আমি BattleDroids.net থেকে AVR টার্মিনাল ব্যবহার করি

শুরু করার জন্য এটাই দরকার। আপনি যে ম্যাগকার্ড রিডারটি পেয়েছেন তার উপর নির্ভর করে, আপনার নির্দিষ্ট পাঠকের সাথে কাজ করার জন্য আপনাকে এই নির্দেশাবলী এবং সবচেয়ে নিশ্চিতভাবে কোডটি সংশোধন করতে হতে পারে। যাইহোক, আমি যে কোডটি লিখেছি তা আপনাকে বেশ দূরে নিয়ে যাবে, আমি আশা করি।

ধাপ 2: স্ব-ক্লকিং ম্যাগনেটিক কার্ড রিডার

স্ব-ক্লকিং ম্যাগনেটিক কার্ড রিডার
স্ব-ক্লকিং ম্যাগনেটিক কার্ড রিডার
স্ব-ক্লকিং ম্যাগনেটিক কার্ড রিডার
স্ব-ক্লকিং ম্যাগনেটিক কার্ড রিডার
স্ব-ক্লকিং ম্যাগনেটিক কার্ড রিডার
স্ব-ক্লকিং ম্যাগনেটিক কার্ড রিডার
স্ব-ক্লকিং ম্যাগনেটিক কার্ড রিডার
স্ব-ক্লকিং ম্যাগনেটিক কার্ড রিডার

ম্যাগনেটিক কার্ড রিডাররা "স্ব-ক্লকিং", যার অর্থ তারা একটি স্ট্রব নামে একটি ঘড়ি প্রদান করে, যার বিরুদ্ধে সংযুক্ত মাইক্রোকন্ট্রোলার সিঙ্ক করতে পারে। এটি একটি বর। এর মানে হল যে আপনাকে ক্লকিং সিগন্যাল খুঁজতে এবং সিগন্যালটি সরাসরি ঘড়ির পালসে কেন্দ্রীভূত করার জন্য চিন্তা করতে হবে না, এবং ঘড়ির সিগন্যালের মিষ্টি জায়গায় কোন বিরক্তিকর দোলনা নেই। যখন আপনি কার্ড সোয়াইপ সম্পর্কে চিন্তা করেন তখন এটি বোধগম্য হয়: প্রত্যেকে ভিন্ন গতিতে সোয়াইপ করে, কেউ ধীর, কেউ অন্যের চেয়ে দ্রুত। সেলফ ক্লকিং এমনকি আমার মিষ্টি ঠাকুরমার কব্জি না ভেঙ্গে তার কার্ড ব্যবহার করার ক্ষমতাও দেয়। আমাকে মনে করিয়ে দেয় যে তার জন্য সেটিং পরিবর্তন করতে হবে যা নির্ধারণ করে যে ডাবল-ক্লিক নিবন্ধনের জন্য ক্লিকের মধ্যে কতটা সময় বৈধ …।

স্ট্রবটি লাইনে লাগানোর আগে এই কার্ড রিডারের ডেটা 1.0 আমাদের বৈধ, তাই "বিট টাইম" এ নিজেকে বিলম্বিত করার বিষয়ে কোন চিন্তা নেই। দ্বৈত হেড রিডারের জন্য যেমন আমি ব্যবহার করছি, পড়ার জন্য দুটি ডেটা ট্র্যাক পাওয়া যায়। এই 'ible' তে, আমি আপনাকে শুরু করার জন্য প্রাথমিক প্রথম ট্র্যাক থেকে পড়া দেখাতে যাচ্ছি। পাঁচটি সংযোগ আছে যা আপনাকে করতে হবে (চারটি যদি আপনি কম I/O পোর্ট ব্যবহার করার জন্য আরো সূক্ষ্ম সুরক্ষিত নিয়ন্ত্রণ দিতে আপত্তি না করেন)। নীচের ছবি পরীক্ষা করে দেখুন। লাল তারটি +5V তে যায় যখন কালো তার মাটিতে যায়। সবুজ তারের হল /CARD_PRESENT; হলুদ তার /STROBE, এবং সাদা তার /DATA1 হয়। ফরোয়ার্ড স্ল্যাশ (/) মানে ডেটা উল্টানো। একটি নিম্ন সংকেত (অর্থাৎ 0) একটি, বা উচ্চ হিসাবে পড়া হয়। অন্যান্য সংযোগকারীগুলি /STROBE2 এর জন্য বাদামী এবং /DATA2 এর জন্য কমলা। আমরা এসব ব্যবহার করব না। আপনি চাইলে, /CARD_PRESENT এর কথা ভুলে যেতে পারেন। এই ডেটা লাইনটি প্রায় ১ head টি হেড ফ্লাক্স রোটেশনের পরে কম হয়ে যায় যা নির্দেশ করে যে একটি কার্ড উপস্থিত আছে (পরিবর্তে, বলুন, এলোমেলো শব্দ যা আপনার পাঠককে জাল তথ্য পাঠায়) এবং যা যা তথ্য আপনি পাচ্ছেন তা কার্ড ডেটা এবং যাচাই করতে ব্যবহৃত হয় না আবর্জনা. আপনি ডেটা স্ট্রীমে প্রারম্ভিক সেন্টিনেল চেক করলে আপনি এই সংযোগটি এড়িয়ে যেতে পারেন। পরে এটি সম্পর্কে আরো। আপনি নীচে দেখতে পারেন, আমি একটি রুটি বোর্ডের সাথে সংযুক্ত একটি সমকোণ পুরুষ হেডার ব্যবহার করেছি এবং আমার পাঠককে এর সাথে সংযুক্ত করেছি। আমি /STROBE কে PIND2 (একটি Arduino এ ডিজিটাল পিন 2), /CARD_PRESENT থেকে PIND3 (চিত্রের উদ্দেশ্যে), এবং /DATA1 কে PIND4 এর সাথে সংযুক্ত করেছি। নিশ্চিত করুন যে আপনি এই পিনগুলিতে পুলআপগুলি সক্ষম করেছেন যাতে আপনার পিনগুলি ভাসতে না পারে। আমি আমার আরডুইনোকে বেয়ার হাড় AVR এর জন্যও বিক্রি করেছি কারণ এটি রুটিবোর্ডে যেভাবে ফিট করে তা আমি পছন্দ করি।

ধাপ 3: চৌম্বকীয় কার্ডের মূল বিষয়

চুম্বকীয় কার্ড বুনিয়াদি
চুম্বকীয় কার্ড বুনিয়াদি

একটি চৌম্বকীয় কার্ড পড়ার জন্য আপনাকে যে প্রাথমিক কাজগুলো করতে হবে তা হল: 1. কার্ডটি কখন সোয়াইপ করা হয়েছে তা সনাক্ত করুন 2. ডেটার স্ট্রিম পড়ুন 3. কার্ডটি কখন চলে গেছে তা সনাক্ত করুন 4. ডেটা প্রক্রিয়া করুন 5. ডেটা প্রদর্শন করুন ডেটা প্রথমে, আমি আপনাকে কিছু ম্যাগনেটিক কার্ড বেসিকের সাথে পরিচয় করিয়ে দেব যা আপনার নিজের কোড লিখতে শুরু করার সময় আপনাকে জানতে হবে।

চৌম্বকীয় কার্ডের মান

নিম্নলিখিত নথিতে আইএসও দ্বারা চৌম্বকীয় কার্ডগুলি মানসম্মত হয়: 7810 ক্রেডিট কার্ড আকারের নথির শারীরিক বৈশিষ্ট্য 7811-1 এমবসিং 7811-2 চুম্বকীয় স্ট্রাইপ-কম জবরদস্তি 7811-3 এমবসড অক্ষরের অবস্থান 7811-4 ট্র্যাকের অবস্থান 1 এবং 2 7811- 5 ট্র্যাকের অবস্থান 7811-6 ম্যাগনেটিক স্ট্রাইপ - উচ্চ জবরদস্তি 7813 আর্থিক লেনদেন কার্ড যেমন আপনি দেখতে পাচ্ছেন, আর্থিক কার্ডগুলি একটি পৃথক নথিতে নির্দিষ্ট করা থাকে এবং প্রায়ই আপনার মুদি কার্ড বা আন্তর্জাতিক কলিং কার্ডের চেয়ে ভিন্ন ফরম্যাট থাকে। এই পার্থক্যগুলির জন্য আপনাকে প্রোগ্রাম করতে হবে। আমার কাছে কেবল একটি ক্রেডিট কার্ড এবং বীমা কার্ড ছিল, তাই আমি এই ধরণেরগুলির জন্য প্রোগ্রাম করেছি (যা উভয়ই ফরম্যাট বি)।

কার্ড ফরম্যাট

ম্যাগনেটিক কার্ডের জন্য বিভিন্ন ফরম্যাট আছে। বিন্যাস A এবং B সাধারণ, B এর সাথে আমি সবচেয়ে বেশি দেখা এবং এটি এই কোডে সমর্থিত। ফরম্যাট C এর মাধ্যমে M ISO দ্বারা সংরক্ষিত, আমি বিশ্বাস করি, যখন N এর মাধ্যমে ?? প্রাতিষ্ঠানিক কাস্টম ব্যবহারের জন্য সংরক্ষিত। ট্র্যাক 1 আর্থিক কার্ডের জন্য, প্রথম ট্র্যাকটি 210 বিট প্রতি ইঞ্চিতে রেকর্ড করা হয় এবং এটি উপরের থেকে কার্ডের প্রথম 0.110 "। ডেটা" কার্ড ডেটা "হিসাবে প্রতি অক্ষর 7-বিট হিসাবে এনকোড করা হয়। এটি 6-বিট চরিত্র এবং কিছুটা সমতার জন্য। ট্র্যাক 1 এ ~ 79 আলফানিউমেরিক অক্ষর রয়েছে। শারীরিক ক্রমটি পিছনের দিকে। অর্থাৎ, ডেটা কিন্তু এটি কার্ডের পিছনে লেখা আছে (এবং তাই, আপনার ফার্মওয়্যার দ্বারা পড়বে) হিসাবে। সমতা অদ্ভুত। কার্ডের ডেটা ফরম্যাট এইরকম দেখাচ্ছে:

[SS] [FC] [প্রাথমিক অ্যাকাউন্ট #] [FS] [নাম] [FS] [অতিরিক্ত তথ্য] [FS] [ES] [LRC] যেখানে:

এসএস স্টার্ট সেন্টিনেল এফসি ফরম্যাট কোড এফএস ফিল্ড বিভাজক একটি SS = '%', FC = একটি ফরম্যাট ট্র্যাক করুন (অনেক সময় B হতে যাচ্ছে), FS প্রায়ই '', ES হল '?' এবং LRC অক্ষরটি সাধারণত '<' হয় যদিও এটি মানগুলিতে নির্দিষ্ট নয়। কার্ডে পিছনে লেখা ছাড়াও, ডেটার একটি অদ্ভুত সমতা বিট এবং ASCII থেকে 0x20। ডেটা প্রসেস করার সময় আমরা এটি পরিচালনা করব। ট্র্যাক 2 ট্র্যাক দুইটি 0.110 "চওড়া এবং কার্ডের উপরে থেকে 0.110 শুরু হয়। এর রেকর্ডিং ঘনত্ব 75 ইঞ্চি প্রতি ইঞ্চি। ডেটা প্রতি অক্ষরে 5-বিট এবং প্রায় 40 টি সাংখ্যিক চিহ্ন নিয়ে গঠিত। আপনার কোনো মুখোমুখি হওয়া উচিত নয় এই ট্র্যাকের অক্ষর। কার্ডের ডেটা ফরম্যাট এই কাঠামোর অনুসরণ করা উচিত

[এসএস] [প্রাথমিক অ্যাকাউন্ট #] [এফএস] [অতিরিক্ত তথ্য | বিবেচনার তথ্য] [ES] [LRC]

ট্র্যাক দুই এর জন্য SS হল সেমিকোলন: ';' এবং FS হল '=' আপনার বেল্টের নীচে এই পবিত্র জ্ঞানের সাথে, উপরে বর্ণিত পদ্ধতিটি বাস্তবায়িত কোডটি দেখতে পরবর্তী ধাপে যান।

ধাপ 4: একটি কার্ড সোয়াইপ করা হলে সনাক্ত করুন

একটি কার্ড সোয়াইপ করা হলে সনাক্ত করুন
একটি কার্ড সোয়াইপ করা হলে সনাক্ত করুন

1. একটি কার্ড কখন আনুষ্ঠানিকভাবে সোয়াইপ করা হয়েছে তা সনাক্ত করুন, কেউ /CARD_PRESENT পিনটি পরীক্ষা করে দেখবে যে এটি কম পড়েছে কিনা। ভাগ্যক্রমে, এটি সত্যিই প্রয়োজনীয় নয়। আমরা পরে বৈধ কার্ডের জন্য চেক করব পর্যায়ক্রমে, আপনি আপনার স্ট্রব পিনটি পড়তে পারেন যখন স্ট্রবগুলি পিনে রাখা হয়েছে, তবে, এটি আপনাকে অনেক ক্লকিং জিরোতে জাল দেবে। পাঠক আপনাকে 60-70 নেতৃস্থানীয় শূন্য পাঠাবে আপনাকে জানাতে যে তথ্য উপস্থাপন করা হচ্ছে। যাইহোক, আমরা কখন বিট রেকর্ডিং শুরু করব তা নির্ধারণ করতে বাইনারি ডেটার প্রকৃতি ব্যবহার করতে যাচ্ছি। ট্র্যাক ওয়ানের জন্য প্রারম্ভিক সেন্টিনেল (এসএস) হল শতাংশ চিহ্ন (%)। এর বাইনারি মান হল 0010 0101 যার অর্থ এটি 1010 001 হিসাবে সংরক্ষণ করা হবে (এবং পড়বে) (এটি 7-বিট তাই 8 ম বিট প্রেরণ করা হয় না)। এখন, চতুর পাঠক লক্ষ্য করবেন যে ডেটা পিছনে থাকলেও এটি বাইনারি ASCII মানের সাথে মেলে না। কারণ এটি হেক্স থেকে 0x20 বন্ধ। % প্রতীক 0x25 এবং 0100 0101 হল 0x05। কার্ডের ডেটা মান থেকে 0x20 বিয়োগ করা হয়েছে। যে একটি উঁচু নিবল মধ্যে সেখানে ঝুলন্ত একটি অদ্ভুত সমতা বিট হয়। এটি সেখানে রাখা হয়েছে যাতে মানটিতে "1" গুলির একটি বিজোড় সংখ্যা থাকে। সুতরাং যেহেতু আমরা জানি যে একটি বৈধ কার্ড সর্বদা এই প্রারম্ভিক সেন্টিনেল দিয়ে শুরু হবে, এবং কারণ প্যারিটি বিট একটি 1, তারপর যখন আমরা ডেটা পিনে প্রথম উচ্চ থেকে নিম্ন সংক্রমণ সনাক্ত করি, তখন আমরা জানি যে আমরা কেবলমাত্র গ্রহণ শুরু করেছি একটি কার্ড থেকে সেন্টিনেল শুরু করুন। এখন, এটি সর্বদা সত্য হতে যাচ্ছে না, এবং একটি নিখুঁত পরিকল্পনা হবে /CARD_PRESENT কার্ডটি পরীক্ষা করে দেখতে হবে যে এটি আরও কম হয়েছে কিনা। এসএস -এর শুরু শনাক্ত করার সবচেয়ে সহজ উপায় হল, /STROBE এর পতনশীল প্রান্তে ট্রিগার করা একটি বাহ্যিক বাধা সৃষ্টি করা। পতনের প্রান্তের পূর্বে ডেটা বৈধ 1.0, তাই যখন আপনি পতনের প্রান্তের নমুনা নিবেন, তখন আপনি জানেন যে আপনি /DATA1 পিনটি পড়তে পারেন এবং একটি বৈধ মান পেতে পারেন। একটি পতনশীল প্রান্তে ট্রিগার করা আপনার বাহ্যিক বাধা তৈরি করার কোড এখানে।

voidInitInterrupt (void) {// সেটআপ ইন্টারাপ্ট BSET (EIMSK, INT0); // বহিরাগত বাধা মাস্ক BSET (EICRA, ISC01); // পতনশীল প্রান্ত BCLR (EICRA, ISC00); // পতনশীল প্রান্ত BSET (SREG, 7); // SREG তে আমি

আমার common.h যেটা আমি আমার সকল প্রোগ্রামে অন্তর্ভুক্ত করি, BSET এবং BCLR এর সংজ্ঞা পাওয়া যাবে। কিভাবে বিট সেট করবেন সে সম্পর্কে আপনার কোন প্রশ্ন থাকলে সেই ফাইলটি পড়ুন। এখন, যখন বাধা ট্রিগার হয়, আমরা /DATA1 (আমার কোডে CARD_DATA হিসাবে সংজ্ঞায়িত) নমুনা করতে চাই এবং একটি সাধারণ উদ্দেশ্য আইও রেজিস্টারে কিছুটা সেট করতে চাই। যদি আমরা 7th তম বিটে থাকি, আমাদের বৈশ্বিক বাফারে একটি চরিত্র হিসাবে রেজিস্টারটি সংরক্ষণ করুন। আমি একটি GPIOR0 রেজিস্টার ব্যবহার করি কারণ এটি দ্রুত অ্যাক্সেস। ছদ্ম কোডটি এরকম কিছু:

16-বিট টাইমার বন্ধ করুন টাইমার সাফ করুন যদি ডেটা কম থাকে বিআইটি = 1 রেজিস্টার হ্রাস বিআইটি সেট পতাকাতে যাতে আমরা আর 0 এড়িয়ে যাই না অন্যথায় ডেটা হাই সেট বিট = 0 রেজিস্টার ডিক্রিমেন্ট বিটে যদি বিট 0 থাকে তাহলে বাফারে 0 বাইট যোগ করুন বৃদ্ধি সূচক বিআইটি পুনরায় সেট করুন

যদি আপনি নিজেকে জিজ্ঞাসা করেন কেন ইনক্রিমেন্টের পরিবর্তে হ্রাস, তাহলে মনে রাখবেন যে ডেটা পিছনের দিকে, তাই আমরা বিটগুলি LSB থেকে MSB এ পাওয়ার রেকর্ড করার পরিবর্তে, আমরা তাদের MSB থেকে LSB এ সংরক্ষণ করি যাতে আমাদের বিটগুলি বিপরীত করতে না হয় পরে ডেটা প্রসেস করার সময়। আপনি যদি সত্যিই চান, আপনি এখানে 0x20 হেক্সও যোগ করতে পারেন, কিন্তু যেহেতু এই স্ট্রোবগুলিতে এটি প্রায় 5us, আমি এই বিরতি পরিষেবা রুটিনে প্রক্রিয়াকরণটি সর্বনিম্ন রেখেছি।

ISR (INT0_vect) {StopTimer (); ক্লিয়ারটাইমার (); যদি (! BCHK (PIND, CARD_DATA1)) // বিপরীত কম = 1 {BSET (GPIOR0, bit); --বিট; bDataPresent = 1; } অন্যথায় যদি (bDataPresent) {BCLR (GPIOR0, bit); --বিট; } যদি (bit <0) {buff [idx] = (char) GPIOR0; ++ আইডিএক্স; বিট = 6; } স্টার্টটাইমার ();} যদি আপনি ভাবছেন যে টাইমিং ব্যবসাটি কী, তাহলে কার্ডটি কখন পাঠককে ছেড়ে দিয়েছে তা নির্ধারণের ধাপে এটি অন্তর্ভুক্ত।

ধাপ 5: ডেটা স্ট্রিম পড়ুন

তথ্য প্রবাহ পড়ুন

ঠিক আছে, আমি ইতিমধ্যেই আপনাকে দেখিয়েছি কিভাবে ডেটা পড়তে হয়, কারণ এটি আমাদের পতনশীল প্রান্ত বাহ্যিক বিঘ্নের জন্য ইন্টারাপ্ট সার্ভিস রুটিনের অংশ। একটি বিকল্প পদ্ধতি হবে ISR- এ একটি পতাকা সেট করা, এবং প্রধান লুপে পতাকাটি জরিপ করুন এবং সেইভাবে ডেটা পড়ুন, কিন্তু আমি বিশ্বাস করি আমি যেভাবে এটি উপস্থাপন করেছি তা পরিষ্কার। আপনার নিজের বিচারক হোন এবং আপনার লিখুন তবে আপনার এমসিইউ এটির অনুমতি দেবে। বলা হচ্ছে, আসুন কিভাবে কার্ডটি একটি এলভিসকে টেনে নেয় এবং বিল্ডিং ছেড়ে চলে যায় তা কীভাবে সনাক্ত করা যায় তা খুঁজে বের করা যাক।

ধাপ 6: পাঠক ছেড়ে কার্ডটি সনাক্ত করুন

পাঠক ছেড়ে কার্ড সনাক্ত করুন
পাঠক ছেড়ে কার্ড সনাক্ত করুন

একটি কার্ড চলে গেলে সনাক্ত করুন

আনুষ্ঠানিকভাবে, কেউ /CARD_PRESENT পিনের নমুনা দেবে দেখতে হবে যে এটি আবার বেশি হয়ে গেছে কিনা, কিন্তু আমাদের অন্য স্টেঙ্কিন ' /CARD_PRESENT এর প্রয়োজন নেই অন্য একটি I /O পোর্ট নেওয়ার। এখানেই সেই টাইমারগুলি আসে Every যখন আমরা পড়া শেষ করি আমরা আবার টাইমার শুরু করি। পুনরাবৃত্তি বিজ্ঞাপন nauseum, অথবা টাইমার একটি নির্দিষ্ট মান পৌঁছায় পর্যন্ত। এর মানে হল যে শেষ বাধা বলা হয়েছে এবং আর কোন ডেটা আসেনি, তাই আমরা ধরে নিই যে এটি এবং আমরা সংগৃহীত ডেটা প্রক্রিয়াকরণ শুরু করি। টাইমারের জন্য, আমরা TIMER1 ব্যবহার করি, অর্থাৎ 16-বিট টাইমার। আমি আমার AVR এ বাহ্যিকভাবে 16 Mhz রেজোনেটর ব্যবহার করছি। যদি আপনি একটি arduino ব্যবহার করছেন, তাহলে আপনি সম্ভবত, খুব। সুতরাং, আমি 1024 এর একটি prescaler মান বেছে নিয়েছি যার অর্থ টাইমার প্রতিটি (16, 000, 000 /1024) বার বৃদ্ধি পাবে। অর্থাৎ, এটি সেকেন্ডে 15, 625 বার 'টিক' দেবে। /CARD_PRESENT উচ্চতর হবে যা ইঙ্গিত করে যে কার্ডটি শেষ ডেটা বিটের পরে পাঠককে প্রায় 150ms রেখে গেছে। এটা জেনে, আমি শুধু প্রতি সেকেন্ডের 1/4 টি চেক করার সিদ্ধান্ত নিয়েছি। যে এই মত কিছু দেখতে হবে:

(((F_CPU) / প্রেসকলার) / 4) যা 3900 এর কাছাকাছি পরিণত হয়। সুতরাং, যখন টাইমার কাউন্টার TCNT1 3900 এ পৌঁছায়, তখন আমি জানি এটি প্রায় 300ms এবং আমি বেশ নিরাপদে উপসংহারে আসতে পারি যে কার্ডটি পাঠককে ছেড়ে দিয়েছে। সহজ

#Design PRESCALER 1024#Define CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#define StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 prescaler#সংজ্ঞায়িত StopTimer () BCLR (TCLR1), CS10), BCLR (TCCR1B, CS12) #Define ClearTimer () (TCNT1 = 0) আপনি ISR- এ দেখেছেন যেখানে টাইমার শুরু হয়েছে, থামানো হয়েছে এবং প্রতিটি বাধায় সাফ করা হয়েছে। এখন, প্রধান লুপে আমরা শুধু চেক করি যে টাইমার কাউন্টার আমাদের লক্ষ্য মান পর্যন্ত পৌঁছেছে কিনা, এবং যদি তাই হয়, ডেটা প্রসেসিং শুরু করুন

জন্য (;;) {যদি (TCNT1> = CHECK_TIME) {

স্টপটাইমার (); ক্লিয়ারটাইমার (); প্রক্রিয়া তথ্য(); ReadData (); idx = 0; বিট = 6; bDataPresent = 0; মেমসেট (& বাফ, 0, MAX_BUFF_SZ1); }} এখন ডেটা প্রক্রিয়া করা নিরাপদ

কোড ফরম্যাট করা হয়েছে https://manoli.net/csharpformat/ দ্বারা

ধাপ 7: ডেটা প্রক্রিয়া করুন

ডেটা প্রসেস করুন
ডেটা প্রসেস করুন

ডেটা প্রসেস করুন

প্রক্রিয়াকরণের পর্যায়ে রয়েছে:

  • একটি বৈধ এসএস পরীক্ষা করা হচ্ছে
  • সমতা পরীক্ষা করা
  • ASCII তে রূপান্তরিত হচ্ছে
  • একটি বৈধ ES এর জন্য পরীক্ষা করা হচ্ছে
  • এলআরসি পরীক্ষা করা হচ্ছে

এখানে, আমি সমতা যাচাই নিয়ে বিরক্ত হই না, কারণ আমি সেই বিটটি শূন্যে সেট করেছি। আমি এই ছোট টিউটোরিয়ালের জন্য এলআরসি গণনা করি না। এটি এমন কিছু হতে পারে যা আরও সম্পূর্ণরূপে উপলব্ধ ফার্মওয়্যার করতে চায়। উপরের ধাপগুলোতে ডেটা প্রক্রিয়া করার কোড এখানে (পূর্বে উল্লিখিত ছাড়া)। নীচের ছবিতে এটি খুঁজুন। এটি মন্তব্য করা হয়েছে এবং বেশ স্ব-ব্যাখ্যামূলক। প্যারিটি এবং এএসসিআইআই সম্পর্কে একটি বিশেষ নোট: আমি কেবল প্যারিটি বিট (7 তম বিট… অর্থাৎ এর পিছনে 6 টি শূন্য সহ 1) সাফ করি এবং "কার্ড ডেটা" থেকে রূপান্তর করার জন্য আপনাকে মানটিতে 0x20 যোগ করতে হবে। এটা সম্বন্ধে.

ধাপ 8: ডেটা প্রদর্শন করুন

ডেটা প্রদর্শন করুন
ডেটা প্রদর্শন করুন
ডেটা প্রদর্শন করুন
ডেটা প্রদর্শন করুন

ডেটা প্রদর্শন করুন

ডিসপ্লেটি একটি টার্মিনাল প্রোগ্রামে যায় যা আমি বিশেষ করে RS232 বা USB এর মাধ্যমে AVR- এর সাথে সংযুক্ত করার জন্য লিখেছিলাম। প্রোগ্রামটির নাম AVR Terminal। ReadData () পদ্ধতিটি বেশ কুৎসিত এবং আমি যেটি নিয়ে এসেছি তার চেয়ে একটি পরিষ্কার সমাধান খুঁজে পেতে আপনি উৎসাহিত। AVR টার্মিনালে ফাংশনের একটি আউটপুটও রয়েছে। আউটপুট প্রথমে একটি স্বাস্থ্য বীমা কার্ড, এবং দ্বিতীয়টি একটি ভিসা কার্ডের। ছবির উপরের বাম কোণে ক্লিক করুন এবং এটি আরও ভাল দেখতে মূল বা বড় ছবিটি চয়ন করুন।

ধাপ 9: কোড ডাউনলোড এবং মোড়ানো

এই নির্দেশে আমি চুম্বকীয় কার্ড পাঠকদের কিছু মৌলিক বিষয় নিয়ে আলোচনা করেছি এবং চৌম্বকীয় কার্ড থেকে ডেটা পড়ার ক্ষেত্রে আপনাকে সঠিক দিক থেকে শুরু করার জন্য কিছু কোড দেখিয়েছি। আরও অনেক কাজ আছে যা করা যেতে পারে, যেমন ২ য় ট্র্যাক পড়া এবং ডিকোড করা, এলআরসি গণনা করা এবং প্রতিটি বাইটে অদ্ভুত সমতা গণনা করা। সম্পূর্ণ সোর্স কোড নীচের ডাউনলোডের জন্য উপলব্ধ। এটি AVR স্টুডিও 4.17 এ লেখা হয়েছিল। আমি আশা করি আপনি এই নির্দেশযোগ্য উপভোগ করেছেন এবং, বরাবরের মতো, আমি আপনার যে কোন মন্তব্য বা পরামর্শের জন্য উন্মুখ।

প্রস্তাবিত: