Daftar Isi:

Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!: 9 Langkah (dengan Gambar)
Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!: 9 Langkah (dengan Gambar)

Video: Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!: 9 Langkah (dengan Gambar)

Video: Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!: 9 Langkah (dengan Gambar)
Video: SULTAN MEDAN INDRAKENZ NAIK JET PRIBADI KE PULAU PRIBADI!! 2024, Juli
Anonim
Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!
Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!
Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!
Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!
Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!
Ubah Arduino Anda Menjadi Pembaca Kartu Magnetik!

Setiap orang telah menggunakan pembaca kartu magnetik, saya percaya. Maksudku, siapa yang membawa uang tunai hari ini? Mereka juga tidak sulit untuk didapatkan, dan selama perjalanan ke toko elektronik lokal favorit saya, saya menemukan tempat sampah yang penuh dengan orang-orang ini. Jadi….tentu saja, saya mengambil satu dan membawanya pulang untuk melihat apa yang bisa saya lakukan dengannya dan AVR.

Instruksi ini akan menunjukkan kepada Anda cara menghubungkan pembaca kartu magnetik Magtek ke AVR atau Arduino/klon dan membaca data dari jalur kartu pertama. Gesper kursi Anda; pembaca kartu magnetik memiliki bit rate yang tinggi!

Langkah 1: Daftar Peralatan

Daftar Peralatan
Daftar Peralatan
Daftar Peralatan
Daftar Peralatan

Berikut adalah beberapa hal yang Anda perlukan untuk memulai.

  • Pembaca kartu magnetik (Milik saya adalah pembaca dua kepala Magetk 90mm. $5,00)
  • AVR, Arduino, atau kloning (ATmega328p ~ $4,30 dari Mouser.com
  • papan tempat memotong roti tanpa solder
  • beberapa kawat
  • mungkin header jika Anda suka hal semacam itu.
  • sesuatu untuk membaca port serial Anda. Saya menggunakan Terminal AVR dari BattleDroids.net

Itu saja yang Anda butuhkan untuk memulai. Bergantung pada pembaca magcard yang akhirnya Anda dapatkan, Anda mungkin harus memodifikasi instruksi ini, dan yang paling pasti kodenya, untuk bekerja dengan pembaca spesifik Anda. Namun, kode yang saya tulis akan membuat Anda cukup jauh, saya harap.

Langkah 2: Pembaca Kartu Magnetik Self-clocking

Pembaca Kartu Magnetik self-clocking
Pembaca Kartu Magnetik self-clocking
Pembaca Kartu Magnetik self-clocking
Pembaca Kartu Magnetik self-clocking
Pembaca Kartu Magnetik self-clocking
Pembaca Kartu Magnetik self-clocking
Pembaca Kartu Magnetik self-clocking
Pembaca Kartu Magnetik self-clocking

Pembaca kartu magnetik adalah "pencatat waktu sendiri", yang berarti bahwa mereka menyediakan jam yang disebut strobo, yang dapat disinkronkan oleh mikrokontroler yang terhubung. Ini adalah anugerah. Ini berarti Anda tidak perlu khawatir tentang mencari sinyal clocking dan mengatur waktu sinyal ke pusat langsung pada pulsa clock, dan tidak mengganggu berosilasi ke sweet spot sinyal clock. Ini masuk akal ketika Anda memikirkan gesekan kartu: semua orang menggesek dengan kecepatan yang berbeda, beberapa lebih lambat, beberapa lebih cepat dari yang lain. Self-clocking memungkinkan bahkan nenek saya yang manis kemampuan untuk menggunakan kartunya tanpa mematahkan pergelangan tangannya. Mengingatkan saya harus mengubah pengaturan untuknya yang menentukan berapa banyak waktu yang valid antara klik untuk mendaftar klik dua kali….

Data pembaca kartu ini valid 1.0 us sebelum strobo dipasang, jadi tidak perlu khawatir menunda untuk memasukkan diri Anda ke "waktu bit". Untuk pembaca kepala ganda seperti yang saya gunakan, ada dua trek data yang tersedia untuk dibaca. Dalam 'ible ini, saya akan menunjukkan bacaan dari trek pertama utama untuk membantu Anda memulai. Ada lima koneksi yang perlu Anda buat (empat jika Anda tidak keberatan melepaskan kontrol yang lebih baik karena lebih sedikit port I/O yang digunakan). Lihat gambar di bawah ini. Kabel merah menuju ke +5V sedangkan kabel hitam menuju ke ground. Kabel hijau adalah /CARD_PRESENT; kabel kuning adalah /STROBE, dan kabel putih adalah /DATA1. Garis miring (/) berarti data dibalik. Sinyal rendah (yaitu 0) dibaca sebagai satu, atau tinggi. Konektor lainnya berwarna coklat untuk /STROBE2 dan oranye untuk /DATA2. Kami tidak akan menggunakan ini. Jika mau, Anda bisa melupakan /CARD_PRESENT. Jalur data ini menjadi rendah setelah sekitar 17 putaran fluks kepala untuk menunjukkan bahwa ada kartu (bukan, katakanlah, suara acak yang menyebabkan pembaca Anda mengirim data palsu) dan digunakan untuk memvalidasi bahwa data yang Anda dapatkan adalah data kartu dan bukan sampah. Anda dapat melewati koneksi ini jika Anda memeriksa penjaga awal pada aliran data. Lebih lanjut tentang itu nanti. Seperti yang Anda lihat di bawah, saya menggunakan header pria sudut kanan yang terhubung ke papan roti dan menghubungkan pembaca saya dengan itu. Saya menghubungkan /STROBE ke PIND2 (pin digital 2 pada Arduino), /CARD_PRESENT ke PIND3 (untuk tujuan ilustrasi), dan /DATA1 ke PIND4. Pastikan Anda mengaktifkan pullup pada pin ini agar pin Anda tidak mengapung. Saya juga menukar Arduino saya dengan AVR Bare Bones karena saya suka cara itu cocok dengan papan tempat memotong roti.

Langkah 3: Dasar-dasar Kartu Magnetik

Dasar-dasar Kartu Magnetik
Dasar-dasar Kartu Magnetik

Fungsi utama yang perlu Anda lakukan untuk membaca kartu magnetik adalah: 1. Mendeteksi saat kartu digesek 2. Membaca aliran data 3. Mendeteksi saat kartu hilang 4. Memproses data 5. Menampilkan data Pertama, saya akan memperkenalkan Anda pada beberapa dasar kartu magnetik yang perlu Anda ketahui saat Anda mulai menulis kode Anda sendiri.

Standar Kartu Magnetik

Kartu magnetik distandarisasi oleh ISO dalam dokumen berikut: 7810 Karakteristik fisik dokumen ukuran kartu kredit 7811-1 Embossing 7811-2 Strip magnetik - koersivitas rendah 7811-3 Lokasi karakter timbul 7811-4 Lokasi trek 1 & 2 7811- 5 Lokasi jalur 3 7811-6 Garis magnet - koersivitas tinggi 7813 Kartu transaksi keuangan Seperti yang Anda lihat, kartu keuangan ditentukan dalam dokumen terpisah dan seringkali memiliki format yang berbeda dari, katakanlah, kartu belanjaan atau kartu panggil internasional Anda. Anda harus memprogram untuk perbedaan ini. Saya baru saja memiliki kartu kredit dan kartu asuransi, jadi saya memprogram untuk jenis ini (yang keduanya merupakan format B).

Format Kartu

Ada beberapa format berbeda untuk kartu magnetik. Format A dan B adalah umum, dengan B menjadi yang paling umum yang pernah saya lihat, dan yang didukung dalam kode ini. Format C hingga M dicadangkan oleh ISO, saya percaya, sedangkan N hingga ?? dicadangkan untuk penggunaan adat institusional. Track 1 Untuk kartu keuangan, track pertama direkam pada 210 bit per inci dan merupakan 0,110" pertama dari kartu dari atas. Data dikodekan sebagai "data kartu" sebagai 7-bit per karakter. Itu 6-bit untuk karakter dan sedikit untuk paritas. Ada ~ 79 karakter alfanumerik di trek 1. Urutan fisiknya mundur. Artinya, data ditulis terbalik pada kartu (dan karenanya, akan dibaca oleh firmware Anda) sebagai. paritas ganjil. Format data kartu terlihat seperti ini:

[SS] [FC] [Akun Utama #] [FS] [Nama] [FS] [Data Tambahan] [FS][ES][LRC]di mana:

SS Mulai sentinel FC Kode format FS Pemisah bidang ES End sentinel LRC Longitudinal Redundansi Periksa karakter Lacak satu SS = '%', FC = salah satu format (akan sering menjadi B), FS sering '', ES adalah '?' dan karakter LRC biasanya '<' meskipun tidak ditentukan dalam standar. Selain ditulis pada kartu mundur, data memiliki bit paritas ganjil dan 0x20 dari ASCII. Kami akan menangani ini saat kami memproses data. Track 2 Track dua lebarnya 0,110" dan dimulai 0,110 dari bagian atas kartu. Kerapatan perekamannya adalah 75 bit per inci. Datanya 5-bit per karakter dan terdiri dari sekitar 40 simbol numerik saja. Anda seharusnya tidak menemukan apapun huruf di trek ini. Format data kartu harus mengikuti struktur ini

[SS] [akun utama #] [FS] [data tambahan | data pilihan] [ES] [LRC]

SS untuk trek dua adalah titik koma: ';' dan FS adalah '=' Dengan pengetahuan suci ini, lanjutkan ke langkah berikutnya untuk melihat kode yang menerapkan prosedur yang diuraikan di atas.

Langkah 4: Deteksi Saat Kartu Digesek

Deteksi Saat Kartu Digesek
Deteksi Saat Kartu Digesek

1. Mendeteksi ketika kartu telah digesek Secara formal, seseorang akan memeriksa pin /CARD_PRESENT untuk melihat apakah pin itu jatuh rendah. Untungnya, ini tidak terlalu diperlukan. Kami akan memeriksa kartu yang valid nanti. Sebagai alternatif, Anda dapat membaca pin strobo Anda untuk melihat kapan strobo telah dipasang ke pin, namun, ini akan memberi Anda banyak clocking nol. Pembaca akan mengirimkan sekitar 60-70 angka nol di depan untuk memberi tahu Anda bahwa data akan segera disajikan. Namun, kita akan menggunakan sifat data biner untuk menentukan kapan mulai merekam bit. Sentinel awal (SS) untuk trek satu adalah tanda persentase (%). Nilai binernya adalah 0010 0101 yang berarti akan disimpan (dan dibaca) sebagai 1010 001 (ini adalah 7-bit sehingga bit ke-8 tidak ditransmisikan). Sekarang, pembaca yang cerdik akan melihat bahwa meskipun datanya mundur, data tersebut tidak cocok dengan nilai ASCII biner. Itu karena 0x20 off dari hex. Simbol % adalah 0x25 dan 0100 0101 adalah 0x05. Data kartu telah dikurangi 0x20 dari nilainya. Yang nongkrong di sana di gigitan tinggi adalah bit paritas yang aneh. Itu diletakkan di sana sehingga ada angka ganjil "1" dalam nilainya. Jadi karena kita tahu bahwa kartu yang valid akan selalu dimulai dengan start sentinel ini, dan karena bit paritasnya adalah 1, maka ketika kita mendeteksi transisi HIGH ke LOW pertama pada pin data, maka kita tahu bahwa kita baru saja mulai menerima mulai penjaga dari kartu. Sekarang, ini tidak selalu benar, dan rencana yang sangat mudah adalah memeriksa kartu /CARD_PRESENT untuk melihat apakah kartunya juga RENDAH. Cara paling sederhana untuk mendeteksi permulaan SS, adalah dengan membuat interupsi eksternal yang dipicu di tepi jatuh /STROBE. Data ini valid 1.0 us sebelum tepi jatuh, jadi ketika Anda telah mengambil sampel tepi jatuh, maka Anda tahu bahwa Anda dapat membaca pin /DATA1 dan mendapatkan nilai yang valid. Inilah kode untuk membuat interupsi eksternal Anda terpicu di ujung yang jatuh.

voidInitInterrupt(void){ // Setup interupsi BSET(EIMSK, INT0); // topeng interupsi eksternal BSET(EICRA, ISC01); // tepi jatuh BCLR(EICRA, ISC00); // tepi jatuh BSET(SREG, 7); // I-bit di SREG}

Dalam common.h saya yang saya sertakan dalam semua program saya, definisi BSET dan BCLR dapat ditemukan. Lihat file itu jika Anda memiliki pertanyaan tentang cara mengatur bit. Sekarang, ketika interupsi dipicu, kami ingin mengambil sampel /DATA1 (dalam kode saya didefinisikan sebagai CARD_DATA) dan mengatur sedikit dalam register IO tujuan umum. Jika kita berada di bit ke-7, simpan register sebagai karakter di buffer global kita. Saya menggunakan register GPIOR0 karena akses cepat yang keren. Kode semu adalah seperti ini:

Hentikan timer 16-bit Hapus timer Jika DATA LOW Set BIT=1 di REGISTER Turunkan BIT Setel flag agar kita tidak melewatkan 0 lagi DATA HIGH Set BIT=0 di REGISTER Turunkan BIT Jika BIT 0 Tambahkan byte ke buffer Indeks kenaikan Setel ulang BIT

Jika Anda bertanya pada diri sendiri mengapa penurunan bukannya kenaikan, ingatlah bahwa datanya mundur, jadi alih-alih merekam bit saat kami mendapatkannya dari LSB ke MSB, kami menyimpannya dari MSB ke LSB sehingga kami tidak perlu membalikkan bit nanti saat mengolah data. Jika Anda benar-benar menginginkannya, Anda juga dapat menambahkan 0x20 hex di sini, tetapi karena sekitar 5us pada lampu ini, saya menjaga pemrosesan dalam rutin layanan interupsi ini seminimal mungkin.

ISR(INT0_vect){ StopTimer(); ClearTimer(); if (!BCHK(PIND, CARD_DATA1)) // inverse low = 1 { BSET(GPIOR0, bit); --sedikit; bDataPresent = 1; } else if (bDataPresent) { BCLR(GPIOR0, bit); --sedikit; } if (bit < 0) { buff[idx] = (char)GPIOR0; ++idx; sedikit = 6; } StartTimer();} Jika Anda bertanya-tanya tentang apa bisnis pengaturan waktu, itu tercakup dalam langkah menentukan kapan kartu telah meninggalkan pembaca.

Langkah 5: Baca Aliran Data

Baca aliran data

Yah, saya telah menunjukkan kepada Anda cara membaca data, karena ini adalah bagian dari Rutin Layanan Interupsi untuk interupsi eksternal tepi jatuh kami. Metode alternatif adalah dengan menetapkan bendera di ISR, dan di loop utama polling bendera dan membaca data seperti itu, tapi saya yakin cara saya menyajikannya lebih bersih. Jadilah hakim Anda sendiri dan tulis milik Anda bagaimanapun MCU Anda akan mengizinkannya. Karena itu, mari kita lanjutkan untuk mencari tahu cara mendeteksi ketika kartu menarik Elvis dan telah meninggalkan gedung.

Langkah 6: Deteksi Kartu Meninggalkan Pembaca

Deteksi Kartu Meninggalkan Pembaca
Deteksi Kartu Meninggalkan Pembaca

Deteksi saat kartu hilang

Secara formal, seseorang akan mengambil sampel pin /CARD_PRESENT untuk melihat apakah pin tersebut sudah HIGH lagi, tetapi kita tidak perlu steenkin' /CARD_PRESENT mengambil port I/O lain. Di sinilah penghitung waktu itu masuk. Setiap kali interupsi dipanggil karena kami mendeteksi adanya penurunan pada /STROBE, kami menghentikan penghitung waktu, menghapus nilai penghitung waktu dan mulai membaca. Setelah selesai membaca, kami memulai penghitung waktu lagi. Ulangi ad naueum, atau sampai timer mencapai nilai tertentu. Itu berarti bahwa interupsi terakhir telah dipanggil dan tidak ada lagi data yang masuk, jadi kami berasumsi hanya itu dan mulai memproses data yang telah kami kumpulkan. Untuk timer, kami menggunakan TIMER1, yaitu timer 16-bit. Saya menggunakan resonator 16 Mhz secara eksternal ke AVR saya. Jika Anda menggunakan arduino, maka Anda mungkin juga. Jadi, saya telah memilih nilai prescaler 1024 yang berarti setiap (16.000, 000 / 1024) kali timer akan bertambah. Artinya, itu akan 'mencentang' 15,625 kali per detik. /CARD_PRESENT akan menjadi TINGGI yang menunjukkan kartu telah meninggalkan pembaca sekitar 150 ms setelah bit data terakhir. Mengetahui hal ini, saya memutuskan untuk memeriksa setiap 1/4 detik. Itu akan terlihat seperti ini:

(((F_CPU) / PRESCALER) / 4) yang ternyata sekitar 3900. Jadi, ketika penghitung waktu TCNT1 mencapai 3900, maka saya tahu sudah sekitar 300 ms dan saya dapat menyimpulkan dengan aman bahwa kartu 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)#define ClearTimer() (TCNT1 = 0) Anda telah melihat di ISR di mana timer dimulai, dihentikan, dan dihapus pada setiap interupsi. Sekarang, di loop utama kami hanya memeriksa untuk melihat apakah penghitung waktu telah mencapai nilai target kami, dan jika demikian, mulai pemrosesan data

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

StopTimer(); ClearTimer(); Data proses(); BacaData(); idx = 0; sedikit = 6; bDataPresent = 0; memset(&buff, 0, MAX_BUFF_SZ1); } } Sekarang aman untuk memproses data

kode diformat oleh

Langkah 7: Memproses Data

Memproses Data
Memproses Data

Memproses datanya

Tahap pengolahan terdiri dari:

  • memeriksa SS yang valid
  • memeriksa paritas
  • mengubah ke ASCII
  • memeriksa ES yang valid
  • memeriksa LRC

Di sini, saya tidak repot-repot memeriksa paritas, karena saya hanya mengatur bit itu ke nol. Saya juga tidak menghitung LRC untuk tutorial kecil ini. Itu akan menjadi sesuatu yang mungkin ingin dilakukan oleh firmware yang lebih lengkap. Berikut kode untuk memproses data dengan melakukan langkah-langkah di atas (tanpa yang disebutkan sebelumnya). Temukan pada gambar di bawah ini. Itu dikomentari dan cukup jelas. Catatan khusus tentang paritas dan ASCII: Saya cukup menghapus bit paritas (bit ke-7…yaitu 1 dengan 6 angka nol di belakangnya) dan untuk mengonversi dari "data kartu" Anda harus menambahkan 0x20 ke nilainya. Itu saja.

Langkah 8: Tampilkan Data

Menampilkan Data
Menampilkan Data
Menampilkan Data
Menampilkan Data

Menampilkan data

Layar menuju ke program terminal yang saya tulis khusus untuk menghubungkan ke AVR melalui RS232 atau USB. Program ini disebut Terminal AVR. Metode ReadData() cukup jelek dan Anda didorong untuk menemukan solusi yang lebih bersih daripada yang saya buat. Ada juga output dari fungsi di Terminal AVR. Keluaran yang pertama adalah kartu jaminan kesehatan, dan yang kedua adalah kartu VISA. Klik di sudut kiri atas gambar dan pilih gambar asli atau besar untuk melihatnya dengan lebih baik.

Langkah 9: Unduh dan Bungkus Kode

Dalam instruksi ini saya telah membahas beberapa dasar pembaca kartu magnetik dan menunjukkan kepada Anda beberapa kode untuk membantu Anda memulai ke arah yang benar dalam membaca data dari kartu magnetik. Masih banyak pekerjaan lain yang bisa dilakukan, seperti membaca dan mendekode trek ke-2, menghitung LRC, dan menghitung paritas ganjil pada setiap byte. Kode sumber lengkap tersedia untuk diunduh di bawah ini. Itu ditulis di AVR Studio 4.17. Saya harap Anda menikmati instruksi ini dan, seperti biasa, saya menantikan komentar atau saran yang mungkin Anda miliki. Selamat coding dan AVR!

Direkomendasikan: