Isi kandungan:

Ubah Arduino Anda menjadi Pembaca Kad Magnetik !: 9 Langkah (dengan Gambar)
Ubah Arduino Anda menjadi Pembaca Kad Magnetik !: 9 Langkah (dengan Gambar)

Video: Ubah Arduino Anda menjadi Pembaca Kad Magnetik !: 9 Langkah (dengan Gambar)

Video: Ubah Arduino Anda menjadi Pembaca Kad Magnetik !: 9 Langkah (dengan Gambar)
Video: ternyata mudah ‼️ cara mengatasi kartu memori yang tidak terbaca | cara memperbaiki kartu sd rusak 2024, Julai
Anonim
Ubah Arduino Anda menjadi Pembaca Kad Magnetik!
Ubah Arduino Anda menjadi Pembaca Kad Magnetik!
Ubah Arduino Anda menjadi Pembaca Kad Magnetik!
Ubah Arduino Anda menjadi Pembaca Kad Magnetik!
Ubah Arduino Anda menjadi Pembaca Kad Magnetik!
Ubah Arduino Anda menjadi Pembaca Kad Magnetik!

Semua orang telah menggunakan pembaca kad magnetik, saya percaya. Maksud saya, siapa yang membawa wang tunai hari ini? Mereka tidak sukar untuk menggunakan tangan anda, dan semasa perjalanan ke kedai elektronik tempatan kegemaran saya, saya menjumpai tong sampah yang penuh dengan orang-orang ini. Jadi …. tentu saja, saya mengambilnya dan membawanya pulang untuk melihat apa jenis perkara yang boleh saya lakukan dengannya dan AVR.

Petunjuk ini akan menunjukkan kepada anda cara menyambungkan pembaca kad magnetik Magtek ke AVR atau Arduino / clone dan membaca data dari trek kad pertama. Lekatkan tempat duduk anda; pembaca kad magnet mempunyai kadar bit yang tinggi!

Langkah 1: Senarai Peralatan

Senarai Peralatan
Senarai Peralatan
Senarai Peralatan
Senarai Peralatan

Berikut adalah beberapa perkara yang perlu anda mulakan.

  • Pembaca kad magnetik (Tambang adalah pembaca dwi-kepala Magetk 90mm. $ 5.00)
  • AVR, Arduino, atau klon (ATmega328p ~ $ 4.30 dari Mouser.com
  • papan roti tanpa pateri
  • sebilangan dawai
  • mungkin tajuk jika anda suka perkara semacam itu.
  • sesuatu untuk membaca port bersiri anda. Saya menggunakan Terminal AVR dari BattleDroids.net

Itu sahaja yang anda perlukan untuk memulakan. Bergantung pada pembaca magcard yang akhirnya anda dapat, anda mungkin perlu mengubah arahan ini, dan pasti kodnya, untuk bekerja dengan pembaca khusus anda. Walau bagaimanapun, kod yang saya tulis semestinya memberikan anda agak jauh, saya harap.

Langkah 2: Pembaca Kad Magnetik jam sendiri

Pembaca Kad Magnetik jam sendiri
Pembaca Kad Magnetik jam sendiri
Pembaca Kad Magnetik jam sendiri
Pembaca Kad Magnetik jam sendiri
Pembaca Kad Magnetik jam sendiri
Pembaca Kad Magnetik jam sendiri
Pembaca Kad Magnetik jam sendiri
Pembaca Kad Magnetik jam sendiri

Pembaca kad magnetik adalah "self-clocking", yang bermaksud bahawa mereka menyediakan jam yang disebut strobe, yang mana mikrokontroler yang disambungkan dapat diselaraskan. Ini adalah anugerah. Ini bermaksud anda tidak perlu risau mencari isyarat jam dan menetapkan masa untuk berpusat secara langsung pada denyut jam, dan tidak mengganggu berayun ke titik manis isyarat jam. Ini masuk akal apabila anda memikirkan leret kad: semua orang meleret dengan laju yang berbeza, ada yang lebih perlahan, ada yang lebih pantas daripada yang lain. Jam sendiri membolehkan nenek saya yang manis dapat menggunakan kadnya tanpa mematahkan pergelangan tangannya. Mengingatkan saya bahawa perlu mengubah tetapan untuknya yang menentukan berapa lama masa yang berlaku antara klik untuk mendaftarkan dua kali klik….

Data pembaca kad ini sah 1,0 kita sebelum strob dimasukkan ke dalam talian, jadi tidak perlu risau untuk menunda masuk ke dalam "sedikit masa." Untuk pembaca dua kepala seperti yang saya gunakan, terdapat dua trek data yang tersedia untuk dibaca. Dalam ible ini, saya akan menunjukkan bacaan dari trek pertama utama untuk memulakan anda. Terdapat lima sambungan yang perlu anda buat (empat jika anda tidak keberatan melepaskan kawalan yang lebih baik untuk lebih sedikit port I / O yang digunakan). Lihat gambar di bawah. Kawat merah menuju ke + 5V sementara wayar hitam menuju ke tanah. Kawat hijau adalah / CARD_PRESENT; wayar kuning adalah / STROBE, dan wayar putih adalah / DATA1. Garis depan (/) bermaksud bahawa data terbalik. Isyarat rendah (iaitu 0) dibaca sebagai satu, atau tinggi. Penyambung lain berwarna coklat untuk / STROBE2 dan oren untuk / DATA2. Kami tidak akan menggunakan ini. Sekiranya anda mahu, anda boleh melupakan / CARD_PRESENT. Garis data ini menjadi rendah setelah sekitar 17 putaran fluks kepala untuk menunjukkan bahawa kad ada (bukannya, katakanlah, bunyi rawak menyebabkan pembaca anda menghantar data palsu) dan digunakan untuk mengesahkan bahawa data yang anda dapatkan adalah data kad dan bukan sampah. Anda boleh melewatkan sambungan ini jika anda memeriksa sentinel permulaan pada aliran data. Lebih lanjut mengenai itu kemudian. Seperti yang anda lihat di bawah, saya menggunakan header lelaki sudut kanan yang disambungkan ke papan roti dan menghubungkan pembaca saya dengan itu. Saya menyambung / STROBE ke PIND2 (pin digital 2 pada Arduino), / CARD_PRESENT ke PIND3 (untuk tujuan ilustrasi), dan / DATA1 ke PIND4. Pastikan anda mengaktifkan penarik pada pin ini agar pin anda tidak melayang. Saya juga menukar Arduino saya untuk Bare Bones AVR kerana saya suka cara ia sesuai dengan papan roti.

Langkah 3: Asas Kad Magnetik

Asas Kad Magnetik
Asas Kad Magnetik

Fungsi utama yang perlu anda lakukan untuk membaca kad magnetik adalah: 1. Mengesan bila kad telah dileret 2. Membaca aliran data 3. Mengesan bila kad telah habis 4. Memproses data 5. Memaparkan data Pertama, saya akan memperkenalkan kepada anda beberapa asas kad magnetik yang perlu anda ketahui semasa anda mula menulis kod anda sendiri.

Piawaian Kad Magnetik

Kad magnetik diseragamkan oleh ISO dalam dokumen berikut: 7810 Ciri fizikal dokumen ukuran kad kredit 7811-1 Embossing 7811-2 Jalur magnet - daya paksaan rendah 7811-3 Lokasi watak timbul 7811-4 Lokasi trek 1 & 2 7811- 5 Lokasi trek 3 7811-6 Jalur magnet - daya tarikan tinggi 7813 Kad urus niaga kewangan Seperti yang anda lihat, kad kewangan dinyatakan dalam dokumen yang berasingan dan sering mempunyai format yang berbeza daripada, katakanlah, kad runcit atau kad panggilan antarabangsa anda. Anda harus memprogram perbezaan ini. Saya hanya mempunyai kad kredit dan kad insurans, jadi saya memprogramkan jenis ini (yang keduanya berformat B).

Format Kad

Terdapat beberapa format yang berbeza untuk kad magnetik. Format A dan B adalah biasa, dengan B adalah yang paling biasa yang pernah saya lihat, dan yang disokong dalam kod ini. Saya percaya, format C hingga M disediakan oleh ISO, sementara N hingga ?? dikhaskan untuk penggunaan khas institusi. Trek 1 Untuk kad kewangan, trek pertama dicatat pada 210 bit per inci dan kad pertama adalah 0.110 "dari atas. Data dikodkan sebagai" data kad "sebagai 7-bit per watak. Itulah 6-bit untuk watak dan sedikit untuk kesamaan. Terdapat ~ 79 aksara alfanumerik di trek 1. Susunan fizikal adalah ke belakang. Maksudnya, data tetapi ditulis ke belakang pada kad (dan oleh itu, akan dibaca oleh firmware anda) sebagai. pariti adalah ganjil. Format data kad kelihatan seperti ini:

[SS] [FC] [Akaun Utama #] [FS] [Nama] [FS] [Data tambahan] [FS] [ES] [LRC] di mana:

SS Mula sentinel FC Format kod FS Pemisah medan ES Sentinel akhir LRC Longitudinal Redundancy Periksa watak Jejak satu SS = '%', FC = salah satu format (akan menjadi B berkali-kali), FS sering '', ES adalah '?' dan watak LRC biasanya '<' walaupun tidak dinyatakan dalam standard. Selain ditulis pada kad ke belakang, data mempunyai bit pariti ganjil dan 0x20 dari ASCII. Kami akan mengatasinya semasa kami memproses data. Jalur 2 Trek dua berukuran 0.110 "dan bermula 0.110 dari bahagian atas kad. Ketumpatan rakamannya ialah 75 bit per inci. Data berukuran 5-bit per watak dan terdiri daripada sekitar 40 simbol angka sahaja. Anda tidak boleh menemui huruf di trek ini. Format data kad harus mengikut struktur ini

[SS] [akaun utama #] [FS] [data tambahan | data budi bicara] [ES] [LRC]

SS untuk trek dua adalah titik koma: ';' dan FS adalah '=' Dengan pengetahuan suci ini di bawah tali pinggang anda, teruskan ke langkah seterusnya untuk melihat kod yang melaksanakan prosedur yang dinyatakan di atas.

Langkah 4: Kesan Apabila Kad Dileret

Mengesan Apabila Kad Dileret
Mengesan Apabila Kad Dileret

1. Kesan kad dileret secara rasmi, seseorang akan memeriksa pin / CARD_PRESENT untuk melihat apakah kad itu jatuh rendah. Nasib baik, ini tidak diperlukan. Kami akan memeriksa kad yang sah kemudian. Sebagai alternatif, anda boleh membaca pin strob anda untuk melihat kapan strob telah dimasukkan ke pin, namun, ini akan memberi anda banyak sifar jam. Pembaca akan menghantar sekitar 60-70 sifar depan untuk memberitahu anda bahawa data akan disampaikan. Walau bagaimanapun, kami akan menggunakan sifat data binari untuk menentukan kapan hendak memulakan rakaman bit. Sentinel permulaan (SS) untuk trek satu adalah tanda peratusan (%). Nilai binari adalah 0010 0101 yang bermaksud ia akan disimpan (dan dibaca) sebagai 1010 001 (ia 7-bit sehingga bit ke-8 tidak dihantar). Sekarang, pembaca yang cerdik akan menyedari bahawa walaupun data ke belakang tidak sesuai dengan nilai ASCII binari. Ini kerana diskaun 0x20 daripada hex. Simbol% ialah 0x25 dan 0100 0101 ialah 0x05. Data kad telah dikurangkan 0x20 dari nilainya. Yang melepak di sana dalam gegaran tinggi adalah sedikit pariti ganjil. Ia diletakkan di sana sehingga terdapat nilai ganjil "1" s. Oleh kerana kita tahu bahawa kad yang sah akan selalu dimulakan dengan sentinel permulaan ini, dan kerana bit paritas adalah 1, maka apabila kita mengesan peralihan TINGGI ke RENDAH pertama pada pin data, maka kita tahu kita baru mula menerima mulakan sentinel dari kad. Sekarang, ini tidak selalu berlaku, dan rancangan yang mudah dibuat adalah dengan memeriksa kad / CARD_PRESENT untuk melihat sama ada kad tersebut RENDAH. Cara termudah untuk mengesan permulaan SS, adalah dengan membuat gangguan luaran yang dicetuskan di pinggir jatuh / STROBE. Data tersebut sah 1,0 kita sebelum jatuh, jadi apabila anda mencontohkan tepi jatuh, maka anda tahu anda dapat membaca pin / DATA1 dan mendapatkan nilai yang sah. Inilah kod untuk membuat gangguan luaran anda yang dicetuskan di tepi yang jatuh.

voidInitInterrupt (void) {// Persediaan mengganggu BSET (EIMSK, INT0); // topeng gangguan luaran BSET (EICRA, ISC01); // jatuh BCLR (EICRA, ISC00); // jatuh BSET tepi (SREG, 7); // Saya-bit di SREG}

Secara umum.h yang saya sertakan dalam semua program saya, definisi BSET dan BCLR boleh didapati. Rujuk fail tersebut sekiranya anda mempunyai pertanyaan mengenai cara menetapkan bit. Sekarang, apabila gangguan dicetuskan, kami ingin mencuba / DATA1 (dalam kod saya yang ditentukan sebagai CARD_DATA) dan menetapkan sedikit dalam daftar IO tujuan umum. Sekiranya kita berada di bit ke-7, simpan daftar sebagai watak dalam penyangga global kita. Saya menggunakan daftar GPIOR0 kerana aksesnya pantas. Kod semu adalah seperti ini:

Hentikan pemasa 16-bit Hapus pemasa Jika DATA RENDAH BIT = 1 di BEG Setkan BEG Tetapkan bendera sehingga kami tidak melewatkan lagi 0 lagi DATA adalah TINGGI BIT = 0 di DAFTAR BIT Penurunan Jika BIT adalah 0 Tambahkan bait ke penyangga Indeks kenaikan Tetapkan semula BIT

Sekiranya anda bertanya kepada diri sendiri mengapa penurunan dan bukan kenaikan, ingatlah bahawa data mundur, jadi daripada merakam bit ketika kami mendapatkannya dari LSB ke MSB, kami menyimpannya dari MSB ke LSB sehingga kami tidak perlu membalikkan bit kemudian semasa memproses data. Sekiranya anda benar-benar mahukan, anda juga boleh menambah hex 0x20 di sini, tetapi kerana ia kira-kira 5us pada strob ini, saya meminimumkan pemprosesan dalam rutin perkhidmatan gangguan ini.

ISR (INT0_vect) {StopTimer (); ClearTimer (); jika (! BCHK (PIND, CARD_DATA1)) // kebalikan rendah = 1 {BSET (GPIOR0, bit); --bit; bDataPresent = 1; } lain jika (bDataPresent) {BCLR (GPIOR0, bit); --bit; } jika (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Sekiranya anda tertanya-tanya tentang apa perniagaan masa, perkara tersebut akan diliputi dalam menentukan waktu kad tersebut meninggalkan pembaca.

Langkah 5: Baca Aliran Data

Baca aliran data

Baiklah, saya sudah menunjukkan kepada anda cara membaca data, kerana ini adalah sebahagian daripada Rutin Servis Interrupt untuk gangguan luaran kami. Kaedah alternatif adalah dengan menetapkan bendera di ISR, dan dalam gelung utama meninjau bendera dan membaca data dengan cara itu, tetapi saya percaya cara saya menyampaikannya lebih bersih. Jadilah hakim anda sendiri dan tulis hakim anda tetapi MCU anda akan membenarkannya. Oleh itu, mari kita terus mengetahui bagaimana untuk mengesan bila kad menarik Elvis dan telah meninggalkan bangunan.

Langkah 6: Kesan Kad Meninggalkan Pembaca

Kesan Kad Meninggalkan Pembaca
Kesan Kad Meninggalkan Pembaca

Kesan bila kad sudah habis

Secara rasmi, seseorang akan mencuba pin / CARD_PRESENT untuk melihat apakah pin itu TINGGI lagi, tetapi kami tidak memerlukan steenkin / CARD_PRESENT yang mengambil port I / O yang lain. Di sinilah pemasa masuk. Setiap kali gangguan dipanggil kerana kami mengesan kelebihan jatuh pada / STROBE, kami menghentikan pemasa, membersihkan nilai pemasa dan mula membaca. Setelah selesai membaca, kami memulakan pemasa semula. Ulangi nauseum iklan, atau sehingga pemasa mencapai nilai tertentu. Ini bermaksud bahawa gangguan terakhir telah dipanggil dan tidak ada lagi data masuk, jadi kami menganggap itu sahaja dan mula memproses data yang telah kami kumpulkan. Untuk pemasa, kami menggunakan TIMER1, iaitu pemasa 16-bit. Saya menggunakan resonator 16 Mhz secara luaran ke AVR saya. Sekiranya anda menggunakan arduino, anda mungkin juga. Oleh itu, saya telah memilih nilai prescaler 1024 yang bermaksud setiap (16, 000, 000/1024) kali pemasa akan meningkat. Maksudnya, ia akan 'menandakan' 15, 625 kali sesaat. / CARD_PRESENT akan TINGGI menunjukkan kad telah meninggalkan pembaca sekitar 150ms selepas bit data terakhir. Mengetahui hal ini, saya hanya memutuskan untuk memeriksa setiap 1/4 saat. Itu akan kelihatan seperti ini:

(((F_CPU) / PRESCALER) / 4) yang ternyata sekitar 3900. Oleh itu, apabila penghitung pemasa TCNT1 mencapai 3900, maka saya tahu sudah kira-kira 300ms dan saya dapat menyimpulkan bahawa kad tersebut telah meninggalkan pembaca. Mudah

#define PRESCALER 1024 # define CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms # define StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 prescaler # define StopTimer () BCLR (TCCR1B), CS10), BCLR (TCCR1B, CS12) #tentukan ClearTimer () (TCNT1 = 0) Anda telah melihat di ISR di mana pemasa dimulakan, berhenti dan dihapus pada setiap gangguan. Sekarang, di gelung utama kita hanya memeriksa untuk melihat apakah penghitung pemasa telah mencapai nilai sasaran kita, dan jika demikian, mulailah pemprosesan data

untuk (;;) {if (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); ProsesData (); BacaData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Sekarang selamat memproses data

kod diformat oleh

Langkah 7: Memproses Data

Memproses Data
Memproses Data

Memproses data

Fasa pemprosesan terdiri daripada:

  • memeriksa SS yang sah
  • memeriksa pariti
  • menukar ke ASCII
  • memeriksa ES yang sah
  • memeriksa LRC

Di sini, saya tidak peduli dengan memeriksa pariti, kerana saya hanya menetapkan bit ke sifar. Saya juga tidak mengira LRC untuk tutorial kecil ini. Itu akan menjadi sesuatu yang mungkin ingin dilakukan firmware yang lebih sedar. Inilah kod untuk memproses data dengan melakukan langkah-langkah di atas (tanpa disebutkan sebelumnya). Dapatkannya dalam gambar di bawah. Ia dikomentari dan cukup jelas. Nota khas mengenai pariti dan ASCII: Saya hanya membersihkan bit pariti (bit ke-7 … iaitu angka 1 dengan 6 angka nol di belakangnya) dan untuk menukar dari "data kad" anda mesti menambah 0x20 ke nilai. Itu sahaja.

Langkah 8: Paparkan Data

Paparkan Data
Paparkan Data
Paparkan Data
Paparkan Data

Paparkan data

Paparan pergi ke program terminal yang saya tulis khusus untuk menyambung ke AVR melalui RS232 atau USB. Program ini dipanggil Terminal AVR. Kaedah ReadData () cukup jelek dan anda digalakkan untuk mencari penyelesaian yang lebih bersih daripada yang saya buat. Terdapat juga output fungsi di Terminal AVR. Keluarannya pertama adalah kad insurans kesihatan, dan yang kedua adalah kad VISA. Klik di sudut kiri atas gambar dan pilih gambar asli atau besar untuk melihatnya dengan lebih baik.

Langkah 9: Muat turun dan Pembungkus Kod

Dalam arahan ini saya telah membincangkan beberapa asas pembaca kad magnetik dan menunjukkan kepada anda beberapa kod untuk memulakan anda ke arah yang betul dalam membaca data dari kad magnetik. Masih banyak lagi kerja yang boleh dilakukan, seperti membaca dan menyahkod trek ke-2, mengira LRC dan mengira pariti ganjil pada setiap bait. Kod sumber penuh tersedia untuk dimuat turun di bawah. Ia ditulis di AVR Studio 4.17. Saya harap anda menikmati pengajaran ini dan, seperti biasa, saya menantikan komen atau cadangan yang mungkin anda ada. Selamat membuat pengekodan dan AVR'ing!

Disyorkan: