Mündəricat:

Arduino -nuzu Maqnit Kart Oxuyucusuna çevirin: 9 addım (şəkillərlə)
Arduino -nuzu Maqnit Kart Oxuyucusuna çevirin: 9 addım (şəkillərlə)

Video: Arduino -nuzu Maqnit Kart Oxuyucusuna çevirin: 9 addım (şəkillərlə)

Video: Arduino -nuzu Maqnit Kart Oxuyucusuna çevirin: 9 addım (şəkillərlə)
Video: www.bakucctv.com 2024, Sentyabr
Anonim
Arduino -nuzu maqnit kart oxuyucusuna çevirin!
Arduino -nuzu maqnit kart oxuyucusuna çevirin!
Arduino -nuzu maqnit kart oxuyucusuna çevirin!
Arduino -nuzu maqnit kart oxuyucusuna çevirin!
Arduino -nuzu maqnit kart oxuyucusuna çevirin!
Arduino -nuzu maqnit kart oxuyucusuna çevirin!

Hər kəs bir maqnit kart oxuyucusundan istifadə etdi, inanıram. Demək istəyirəm ki, bu gün nağd pulu kim daşıyır? Əlinizə keçmək də çətin deyil və ən sevdiyim yerli elektronika mağazasına gedərkən bu adamlarla dolu bir çömçə tapdım. Beləliklə …. Əlbəttə ki, birini götürüb evə gətirdim ki, bununla nə edə biləcəyimi və AVR -i görüm.

Bu təlimat, Magtek maqnit kart oxuyucusunu bir AVR və ya Arduino/klona necə bağlayacağınızı və kartın ilk hissəsindəki məlumatları necə oxuyacağınızı göstərəcək. Oturacaqlarınızı bağlayın; maqnit kart oxuyanların yüksək bit sürəti var!

Addım 1: Avadanlıqların siyahısı

Avadanlıqların siyahısı
Avadanlıqların siyahısı
Avadanlıqların siyahısı
Avadanlıqların siyahısı

İşə başlamaq üçün lazım olan bir neçə şey var.

  • Maqnit kart oxuyucusu (Mine, Magetk 90mm cüt başlı oxuyucudur. 5.00 dollar)
  • AVR, Arduino və ya klon (Mouser.com saytından ATmega328p ~ $ 4.30
  • lehimsiz çörək taxtası
  • bir az tel
  • bu kimi bir şeyi xoşlayırsınızsa bəlkə də başlıq.
  • serial portunuzu oxumaq üçün bir şey. BattleDroids.net -dən AVR Terminalını istifadə edirəm

Başlamaq üçün lazım olan hər şey budur. Alacağınız magcard oxuyucusundan asılı olaraq, xüsusi oxucunuzla işləmək üçün bu təlimatları və şübhəsiz ki kodu dəyişdirməli ola bilərsiniz. Ancaq yazdığım kod sizi çox uzaqlara aparmalıdır, inşallah.

Addım 2: Öz-özünə işləyən Maqnit Kart Oxuyucular

Öz-özünə işləyən maqnit kart oxuyucular
Öz-özünə işləyən maqnit kart oxuyucular
Öz-özünə işləyən maqnit kart oxuyucular
Öz-özünə işləyən maqnit kart oxuyucular
Öz-özünə işləyən maqnit kart oxuyucular
Öz-özünə işləyən maqnit kart oxuyucular
Öz-özünə işləyən maqnit kart oxuyucular
Öz-özünə işləyən maqnit kart oxuyucular

Maqnit kart oxuyucular "öz-özünə" işləyirlər, yəni bağlı mikrokontrolörün sinxronizasiya edə biləcəyi bir strobe adlı bir saat təmin edirlər. Bu bir nemətdir. Bu, bir saat siqnalı axtarmağın və siqnalın birbaşa saat nəbzinin mərkəzində olması üçün narahat olmağınızın və saat siqnalının şirin yerinə heç bir narahatlıq yaratmadığınız deməkdir. Kart sürüşdürmələri haqqında düşünəndə bu məntiqlidir: hamı fərqli sürətlə, bəziləri daha yavaş, bəziləri digərlərindən daha sürətli sürüşür. Self-clocking hətta şirin nənəmə belə biləyini sındırmadan kartından istifadə etməyə imkan verir. Mənə iki dəfə klik etmək üçün tıklamalar arasında nə qədər vaxtın keçəcəyini təyin edən onun parametrini dəyişdirməli olduğumu xatırladır.

Bu kart oxuyucusunun məlumatları, strobe xəttə qoyulmamışdan əvvəl 1.0 bizə etibarlıdır, buna görə özünüzü "bit vaxtına" daxil etməyi gecikdirməkdən narahat olmayın. İstifadə etdiyim kimi ikili baş oxuyucusu üçün oxumaq üçün iki məlumat parçası var. Bu kitabda, işə başlamağınız üçün əsas ilk parçadan oxu göstərəcəyəm. Etməli olduğunuz beş əlaqə var (daha az istifadə olunan I/O portu üçün daha yaxşı tənzimlənmiş nəzarətdən imtina etməyinizdən asılı olmayaraq dörd). Aşağıdakı şəkilə baxın. Qırmızı tel +5V -ə, qara tel isə yerə gedir. Yaşıl tel /CARD_PRESENT; sarı tel /STROBE, ağ tel isə /DATA1. İrəli meyl (/), məlumatların ters çevrildiyini bildirir. Aşağı bir siqnal (yəni 0) bir və ya yüksək olaraq oxunur. Digər bağlayıcılar /STROBE2 üçün qəhvəyi və /DATA2 üçün narıncıdır. Bunlardan istifadə etməyəcəyik. İstəsəniz /CARD_PRESENT haqqında unuda bilərsiniz. Bu məlumat xətti, bir kartın olduğunu göstərmək üçün təxminən 17 baş axını fırlandıqdan sonra aşağı düşür (oxucunuzun saxta məlumat göndərməsinə səbəb olan təsadüfi səs -küy əvəzinə) və əldə etdiyiniz məlumatların kart məlumatları olduğunu təsdiq etmək üçün istifadə olunur. zibil deyil Məlumat axınında başlanğıc nəzarətçisini yoxlasanız, bu əlaqəni atlaya bilərsiniz. Bu barədə daha sonra. Aşağıda gördüyünüz kimi, bir çörək taxtasına qoşulmuş dik açılı kişi başlığı istifadə etdim və oxucumu buna bağladım. PIND2 -yə (bir Arduino -da rəqəmsal pin 2), /CARD_PRESENT -ə PIND3 -ə (təsvir məqsədləri üçün) və /DATA1 -i PIND4 -ə bağladım /STROBE etdim. Pimlərinizin üzməməsi üçün bu pinlərdə çəkmələri aktiv etdiyinizə əmin olun. Çörək taxtasına uyğunlaşma tərzini bəyəndiyim üçün Arduino -nu Bare Bones AVR -ə də satdım.

Addım 3: Maqnit Kartının Əsasları

Maqnit Kartının Əsasları
Maqnit Kartının Əsasları

Maqnit kartı oxumaq üçün etməli olduğunuz əsas funksiyalar bunlardır: 1. Kartın sürüşdürüldüyünü aşkar edin 2. Məlumat axınını oxuyun 3. Kartın getdiyini aşkar edin 4. Məlumatları emal edin 5. Ekran data Birincisi, sizə öz kodunuzu yazmağa başlayanda bilməli olduğunuz bəzi maqnit kart əsasları ilə tanış olacağam.

Maqnit Kart Standartları

Maqnit kartları ISO tərəfindən aşağıdakı sənədlərdə standartlaşdırılmışdır: 7810 Kredit kartı ölçüsü sənədinin fiziki xüsusiyyətləri 7811-1 Kabartma 7811-2 Maqnit zolağı-aşağı məcburiyyət 7811-3 Kabartmalı simvolların yeri 7811-4 Parçaların yeri 1 və 2 7811- 5 Trasın yeri 3 7811-6 Maqnit zolağı - yüksək məcburiyyət 7813 Maliyyə əməliyyatı kartları Gördüyünüz kimi, maliyyə kartları ayrı bir sənəddə göstərilmişdir və tez -tez ərzaq kartınızdan və ya beynəlxalq danışıq kartınızdan fərqli formata malikdir. Bu fərqlər üçün proqramlaşdırmalı olacaqsınız. Sadəcə bir kredit kartım və sığorta kartım var idi, buna görə də bu növlər üçün proqramlaşdırdım (hər ikisi də B formatında olur).

Kart formatları

Maqnit kartları üçün bir neçə fərqli format var. A və B formatı çox yaygındır, B ən çox gördüyüm formatdır və bu kodda dəstəklənir. C -dən M -ə qədər formatlar ISO tərəfindən qorunur, inanıram ki, N -dən ?? institusional xüsusi istifadə üçün ayrılmışdır. Parça 1 Maliyyə kartları üçün, ilk trek düym başına 210 bit olaraq qeyd olunur və yuxarıdakı kartın ilk 0.110 "dir. Məlumatlar" kart məlumatları "olaraq hər bir xarakter üçün 7 bit olaraq kodlanır. Bu, 6 bit üçün xarakter və bir az paritet üçün. 1 -ci yolda ~ 79 alfasayısal simvol var. Fiziki sifariş geridir. Yəni məlumatlar ancaq kartın arxasına yazılır (və buna görə də firmware tərəfindən oxunacaq) kimi. paritet qəribədir. Kart məlumat formatı belə görünür:

[SS] [FC] [Əsas Hesab #] [FS] [Ad] [FS] [Əlavə məlumatlar] [FS] [ES] [LRC] burada:

SS Başlanğıc FC Format kodu FS Sahə ayırıcısı ES End Sentinel LRC Uzunlamasına Redundancy Xarakteri yoxlayın Bir SS = '%', FC = formatlardan birini izləyin (çox vaxt B olacaq), FS tez -tez '', ES '?' və LRC xarakteri standartlarda göstərilməsə də ümumiyyətlə '<' olur. Kartda geriyə yazılmaqla yanaşı, məlumatlar tək bir paritet bitə malikdir və ASCII -dən 0x20 -dir. Veriləri işləyərkən bunu həll edəcəyik. Track 2 İkinci parça 0.110 "genişliyindədir və kartın yuxarı hissəsindən 0.110 başlayır. Qeyd sıxlığı düym üçün 75 bitdir. Məlumat hər bir xarakter üçün 5 bitdir və yalnız təxminən 40 ədəd rəqəmdən ibarətdir. Heç bir şeylə qarşılaşmamalısınız. bu yolda məktublar. Kart məlumat formatı bu quruluşa uyğun olmalıdır

[SS] [əsas hesab #] [FS] [əlavə məlumat | ixtiyari məlumatlar] [ES] [LRC]

İkinci iz üçün SS nöqtəli vergüldür: ';' və FS '=' Kəməriniz altındakı bu müqəddəs biliklə yuxarıda göstərilən proseduru həyata keçirən kodu görmək üçün növbəti addımlara davam edin.

Addım 4: Kartın sürüşdürüldüyünü təyin edin

Kartın sürüşdürüldüyünü təyin edin
Kartın sürüşdürüldüyünü təyin edin

1. Bir kartın rəsmi olaraq sürüşdürüldüyünü təyin edin, aşağı düşdüyünü görmək üçün /CARD_PRESENT pinini yoxlayın. Xoşbəxtlikdən, bu həqiqətən lazım deyil. Daha sonra etibarlı kartı yoxlayacağıq. Alternativ olaraq, çubuğun pin üzərində nə vaxt qoyulduğunu görmək üçün strobe pininizi oxuya bilərsiniz, lakin bu sizə çoxlu sıfır sıfırlarını vuracaq. Oxucu, məlumatların təqdim olunacağını bildirmək üçün təxminən 60-70 aparıcı sıfır göndərəcək. Bununla birlikdə, bit yazmağa nə vaxt başlayacağımızı təyin etmək üçün ikili məlumatların xüsusiyyətindən istifadə edəcəyik. Birinci trek üçün başlanğıc gözətçisi (SS) faiz işarəsidir (%). İkili dəyəri 0010 0101-dir, yəni 1010 001 olaraq saxlanılacaq (və oxunacaq) deməkdir (7 bitdir, buna görə də 8-ci bit ötürülmür). İndi zəkalı oxucu, məlumatların geridə olmasına baxmayaraq ikili ASCII dəyərinə uyğun gəlmədiyini görəcək. Bunun səbəbi onaltının 0x20 olmasıdır. % Simvolu 0x25, 0100 0101 isə 0x05 -dir. Kart məlumatları dəyərdən 0x20 çıxarıldı. Orada yüksək sancaqda asılı olan tək paritetdir. Dəyərdə tək ədəd "1" lərin olması üçün ora qoyulur. Etibarlı bir kartın hər zaman bu başlanğıc gözətçisi ilə başlayacağını bildiyimiz üçün və parite biti 1 olduğuna görə, məlumat pinində ilk YÜKSƏKDƏN aşağı keçidi aşkar etdiyimiz zaman, yeni qəbul etməyə başladığımızı bilirik. bir kartdan gözətçiyə başlayın. İndi bu həmişə doğru olmayacaq və ağılsız bir plan, əlavə olaraq LOW aşağı getdiyini görmək üçün /CARD_PRESENT kartını yoxlamaq olacaq. SS -nin başlanğıcını aşkar etməyin ən sadə yolu, /STROBE -un düşən kənarında tetiklenen xarici bir fasilə yaratmaqdır. Məlumat düşən kənarda 1.0 bizə etibarlıdır, buna görə düşən kənarı nümunə götürdükdə, /DATA1 pinini oxuya və etibarlı bir dəyər əldə edə biləcəyinizi bilirsiniz. Düşən bir kənarda tetiklenen xarici fasilənizi yaratmaq üçün kod budur.

voidInitInterrupt (void) {// BSET (EIMSK, INT0) kəsilməsini qurun; // xarici fasilə maskası BSET (EICRA, ISC01); // düşən kənar BCLR (EICRA, ISC00); // düşən kənar BSET (SREG, 7); // SREG-də bit-in}

Bütün proqramlarımda daxil etdiyim ümumi.h -də BSET və BCLR anlayışlarına rast gəlmək olar. Bitlərin necə qurulacağına dair hər hansı bir sualınız olarsa həmin fayla baxın. İndi, fasilə tetiklendiğinde, /DATA1 nümunəsini (kodumda CARD_DATA olaraq təyin olunur) nümunə götürmək və ümumi təyinatlı bir IO reyestrinə bir az təyin etmək istəyirik. 7 -ci bitdə olsaq, qlobal tamponumuzda bir qeyd olaraq qeydiyyatdan keçin. GPIOR0 qeydiyyat sistemindən istifadə edirəm, çünki çox sürətlidir. Yalançı kod belədir:

16 bitlik taymeri dayandırın VERİ QEYDİYYATDAN BİT = 1 QEYDİYYAT BİT = 1 azaldılırsa bayrağı təyin edin, beləliklə artıq 0-ı atlamırıq DATA YÜKSƏK QEYDİYYATDA BİT = 0 BİT 0 olarsa tampona bayt əlavə edin Artım indeksi BIT sıfırlayın

Özünüzə artım yerinə niyə azalmanın olduğunu soruşsanız, məlumatların geridə olduğunu unutmayın, buna görə LSB -dən MSB -ə aldığımız zaman bitləri qeyd etmək əvəzinə MSB -dən LSB -ə saxlayırıq, buna görə bitləri geri çevirmək məcburiyyətində deyilik. daha sonra məlumatları emal edərkən. Həqiqətən istəsəniz, bura 0x20 hex əlavə edə bilərsiniz, ancaq bu vuruşlarda təxminən 5us olduğu üçün bu kəsilmə xidməti rutinindəki emal minimuma endirilir.

ISR (INT0_vect) {StopTimer (); ClearTimer (); əgər (! BCHK (PIND, CARD_DATA1)) // tərs aşağı = 1 {BSET (GPIOR0, bit); -bit; bDataPresent = 1; } başqa əgər (bDataPresent) {BCLR (GPIOR0, bit); -bit; } əgər (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Zamanlama işinin nə ilə əlaqəli olduğunu düşünürsünüzsə, bu, kartın oxucudan nə vaxt ayrıldığını təyin etmək üçün nəzərdə tutulmuş addımdır.

Addım 5: Məlumat axını oxuyun

Məlumat axını oxuyun

Yaxşı, sizə məlumatların necə oxunacağını göstərmişəm, çünki bu, kənara çıxan kənar fasiləmiz üçün kəsilmə xidməti proqramının bir hissəsidir. Alternativ bir üsul, ISR -də bir bayraq qurmaq olar və əsas döngədə bayrağı sorğu -sual etmək və məlumatları bu şəkildə oxumaq olar, amma inandığım şəkildə daha təmiz olduğuna inanıram. Öz hakiminiz olun və MCU'nun icazə verəcəyi halda özünüz yazın. Bununla birlikdə, kartın bir Elvis çəkərək binanı tərk etdiyini necə aşkar edəcəyimizi öyrənək.

Addım 6: Oxucudan çıxan kartı aşkar edin

Oxucudan çıxan kartı aşkar edin
Oxucudan çıxan kartı aşkar edin

Bir kartın nə vaxt çıxdığını təyin edin

Rəsmi olaraq, /CARD_PRESENT pinindən yenidən YÜKSƏK olub olmadığını yoxlamaq olar, amma başqa bir I /O portu götürmək üçün steenkin /CARD_PRESENT ehtiyacımız yoxdur. Bura o taymerlərin daxil olduğu yerdir. Hər dəfə fasilə çağırıldıqda /STROBE -da düşən bir kənar aşkar etdiyimiz üçün bir taymeri dayandırırıq, taymerin dəyərini təmizləyirik və oxumağa başlayırıq. Oxumağı bitirdikdən sonra taymeri yenidən işə salırıq. Reklam bulantısını və ya taymer müəyyən bir dəyərə çatana qədər təkrarlayın. Bu o deməkdir ki, son fasilə çağırıldı və artıq heç bir məlumat daxil olmadı, buna görə də bunun olduğunu zənn edirik və topladığımız məlumatları emal etməyə başlayırıq. Taymerlər üçün TIMER1, yəni 16 bitlik taymerdən istifadə edirik. AVR -ə xaricdən 16 Mhz rezonatordan istifadə edirəm. Bir arduino istifadə edirsinizsə, ehtimal ki, siz də. Beləliklə, 1024 dəyərini seçdim ki, bu da taymerin hər (16000, 000 /1024) dəfə artacağı deməkdir. Yəni saniyədə 15, 625 dəfə 'gənə vuracaq'. /CARD_PRESENT, kartın son məlumat bitindən təxminən 150 ms sonra oxucunu tərk etdiyini göstərən yüksək olacaq. Bunu bildiyim üçün saniyənin hər 1/4 hissəsini yoxlamağa qərar verdim. Bu belə bir şeyə bənzəyəcək:

(((F_CPU) / PRESCALER) / 4) təxminən 3900 olduğu ortaya çıxır. Beləliklə, TCNT1 sayğacı 3900 -ə çatdıqda, təxminən 300 ms olduğunu bilirəm və kartın oxucudan ayrıldığı qənaətinə gələ bilərəm. Asan

#define PRESCALER 1024#CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#define StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 prescaler#define StopTimer () BCLR (TCCR1), CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) ISR -də timerin başladığı, dayandırıldığı və hər fasilədə təmizləndiyini gördünüz. İndi, əsas döngədə, taymer sayğacının hədəf dəyərimizə çatıb -çatmadığını yoxlayırıq və əgər belədirsə, məlumatların işlənməsinə başlayın.

üçün (;;) {if (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} İndi məlumatları emal etmək təhlükəsizdir

manoli.net/csharpformat/ tərəfindən formatlanmış kod

Addım 7: Məlumatları emal edin

Məlumatları emal edin
Məlumatları emal edin

Məlumatları emal edin

Emal mərhələsi aşağıdakılardan ibarətdir:

  • etibarlı bir SS yoxlanılır
  • paritet yoxlanılır
  • ASCII -ə çevrilir
  • etibarlı bir ES yoxlanılması
  • LRC yoxlanılır

Bu biti sıfıra qoyduğum üçün pariteti yoxlamaqla narahat olmuram. Bu kiçik dərs üçün LRC -ni də hesablamıram. Bu, daha tam həyata keçirilmiş bir firmware -in etmək istədiyi bir şey olardı. Burada yuxarıda göstərilən addımları yerinə yetirən məlumatları emal etmək üçün kod var (əvvəllər qeyd olunmamışdır). Aşağıdakı şəkildə tapın. Bu şərh və olduqca özünü izah edir. Paritet və ASCII ilə bağlı xüsusi qeyd: Paritet bitini (7 -ci bit… yəni arxasında 6 sıfır olan 1) təmizləyirəm və "kart məlumatlarından" çevirmək üçün dəyərə 0x20 əlavə etməlisiniz. Bu barədə.

Addım 8: Məlumatları göstərin

Məlumatları göstərin
Məlumatları göstərin
Məlumatları göstərin
Məlumatları göstərin

Məlumatları göstərin

Ekran, RS232 və ya USB vasitəsilə AVR -ə qoşulmaq üçün xüsusi olaraq yazdığım bir terminal proqramına gedir. Proqram AVR Terminal adlanır. ReadData () metodu olduqca çirkindir və siz mənim tapdığımdan daha təmiz bir həll tapmağınız məsləhət görülür. AVR Terminalında funksiyanın bir çıxışı da var. Çıxış birinci tibbi sığorta kartından, ikincisi isə VISA kartından gedir. Şəklin sol üst küncündəki düyməsini basın və daha yaxşı görmək üçün orijinal və ya böyük bir şəkil seçin.

Addım 9: Kod Yükləmə və Toplama

Bu təlimatda, maqnit kart oxuyucusunun bəzi əsaslarını müzakirə etdim və maqnit kartlarından məlumat oxumağa düzgün istiqamətdə başlamağınız üçün sizə bəzi kodlar göstərdim. 2 -ci parçanın oxunması və deşifr edilməsi, LRC -nin hesablanması və hər baytdakı tək paritetin hesablanması kimi daha çox işlər görülə bilər. Tam mənbə kodu aşağıda yükləmək üçün mövcuddur. AVR Studio 4.17 -də yazılmışdır. Ümid edirəm ki, bu dərsdən zövq aldınız və hər zaman olduğu kimi hər hansı bir şərh və ya təklifinizi gözləyirəm. Xoşbəxt kodlaşdırma və AVR'!

Tövsiyə: