İçindekiler:

Arduino'nuzu Manyetik Kart Okuyucuya Dönüştürün!: 9 Adım (Resimlerle)
Arduino'nuzu Manyetik Kart Okuyucuya Dönüştürün!: 9 Adım (Resimlerle)

Video: Arduino'nuzu Manyetik Kart Okuyucuya Dönüştürün!: 9 Adım (Resimlerle)

Video: Arduino'nuzu Manyetik Kart Okuyucuya Dönüştürün!: 9 Adım (Resimlerle)
Video: TİKTOK DİLENCİLERİ PART 1 DAHA NELER DEDİRTEN Video #tiktok #tiktokvideo #tiktokvideo 2024, Temmuz
Anonim
Arduino'nuzu Manyetik Kart Okuyucusuna Dönüştürün!
Arduino'nuzu Manyetik Kart Okuyucusuna Dönüştürün!
Arduino'nuzu Manyetik Kart Okuyucusuna Dönüştürün!
Arduino'nuzu Manyetik Kart Okuyucusuna Dönüştürün!
Arduino'nuzu Manyetik Kart Okuyucusuna Dönüştürün!
Arduino'nuzu Manyetik Kart Okuyucusuna Dönüştürün!

Sanırım herkes manyetik kart okuyucu kullanmıştır. Yani, bu günlerde kim nakit taşıyor? Elinize almak da zor değil ve en sevdiğim yerel elektronik mağazasına yaptığım bir gezi sırasında bu adamlarla dolu bir çöp kutusu buldum. Yani….tabii ki, bir tane aldım ve onunla ve bir AVR ile ne tür şeyler yapabileceğimi görmek için eve getirdim.

Bu talimat size bir Magtek manyetik kart okuyucusunu bir AVR'ye veya Arduino/klonuna nasıl bağlayacağınızı ve ilk kart parçasındaki verileri nasıl okuyacağınızı gösterecektir. Koltuklarınızı bağlayın; manyetik kart okuyucular yüksek bit hızına sahiptir!

Adım 1: Ekipman Listesi

Ekipman Listesi
Ekipman Listesi
Ekipman Listesi
Ekipman Listesi

İşte başlamak için ihtiyacınız olacak birkaç şey.

  • Manyetik kart okuyucu (Benimki bir Magetk 90 mm çift kafalı okuyucudur. 5,00 ABD doları)
  • AVR, Arduino veya klon (Mouser.com'dan ATmega328p ~ 4.30 $)
  • lehimsiz devre tahtası
  • biraz tel
  • Bu tür bir şeyi seviyorsan belki bir başlık.
  • seri portunuzu okuyacak bir şey. BattleDroids.net'ten AVR Terminali kullanıyorum

Başlamak için ihtiyacınız olan tek şey bu. Sonunda aldığınız magcard okuyucuya bağlı olarak, bu talimatları ve kesinlikle kodu, özel okuyucunuzla çalışmak için değiştirmeniz gerekebilir. Ancak, yazdığım kod sizi oldukça uzağa götürür, umarım.

2. Adım: Kendinden saat ayarlı Manyetik Kart Okuyucular

Kendinden saatli Manyetik Kart Okuyucular
Kendinden saatli Manyetik Kart Okuyucular
Kendinden saatli Manyetik Kart Okuyucular
Kendinden saatli Manyetik Kart Okuyucular
Kendinden saatli Manyetik Kart Okuyucular
Kendinden saatli Manyetik Kart Okuyucular
Kendinden saatli Manyetik Kart Okuyucular
Kendinden saatli Manyetik Kart Okuyucular

Manyetik kart okuyucular "kendi kendine saatlidir", yani bağlı mikrodenetleyicinin senkronize edebildiği flaş adı verilen bir saat sağladıkları anlamına gelir. Bu bir nimet. Bu, bir saat sinyali arama ve sinyali doğrudan saat darbesine merkezlemek için zamanlama konusunda endişelenmenize gerek olmadığı ve saat sinyalinin tatlı noktasında rahatsız edici salınımlar olmadığı anlamına gelir. Kart geçişlerini düşündüğünüzde bu mantıklıdır: herkes farklı bir hızda, bazıları daha yavaş, bazıları diğerlerinden daha hızlı kaydırır. Otomatik saat ayarı, tatlı büyükannemin bile bileğini kırmadan kartını kullanmasını sağlar. Bana, bir çift tıklamayı kaydetmek için tıklamalar arasında ne kadar sürenin geçerli olduğunu belirleyen ayarı değiştirmem gerektiğini hatırlatıyor….

Bu kart okuyucunun verileri, flaş hatta takılmadan önce 1.0 bizim için geçerlidir, bu nedenle kendinizi "bit zamanı"na sokmak için gecikme konusunda endişelenmenize gerek yok. Benim kullandığım gibi çift kafalı bir okuyucu için okunabilecek iki veri yolu var. Bu 'ible, başlamanıza yardımcı olmak için birincil ilk parçadan okumayı göstereceğim. Yapmanız gereken beş bağlantı vardır (kullanılan daha az G/Ç bağlantı noktası için daha fazla ince ayarlı kontrolden vazgeçmeyi düşünmüyorsanız dört bağlantı). Aşağıdaki resme bakın. Siyah kablo toprağa giderken kırmızı kablo +5V'a gider. Yeşil kablo /CARD_PRESENT; sarı kablo /STROBE ve beyaz kablo /DATA1'dir. Eğik çizgi (/), verilerin ters çevrildiği anlamına gelir. Düşük bir sinyal (yani 0) bir veya yüksek olarak okunur. Diğer konektörler /STROBE2 için kahverengi ve /DATA2 için turuncu renktedir. Bunları kullanmayacağız. İsterseniz /CARD_PRESENT'i unutabilirsiniz. Bu veri satırı, bir kartın mevcut olduğunu belirtmek için (örneğin, okuyucunuzun sahte veriler göndermesine neden olan rastgele gürültü yerine) yaklaşık 17 kafa akışı dönüşünden sonra düşer ve aldığınız verilerin kart verileri olduğunu doğrulamak için kullanılır ve Çöp değil. Veri akışında başlangıç nöbetçisini kontrol ederseniz bu bağlantıyı atlayabilirsiniz. Daha sonra. Aşağıda görebileceğiniz gibi, bir breadboard'a bağlı dik açılı bir erkek başlık kullandım ve okuyucumu buna bağladım. /STROBE'u PIND2'ye (Arduino'daki dijital pin 2), /CARD_PRESENT'i PIND3'e (örnek amaçlı) ve /DATA1'i PIND4'e bağladım. Pinlerinizin havada durmaması için bu pinlerde pullup'ları etkinleştirdiğinizden emin olun. Ayrıca Arduino'mu bir Bare Bones AVR ile takas ettim çünkü breadboard'a uyma şeklini beğendim.

Adım 3: Manyetik Kartın Temelleri

Manyetik Kart Temelleri
Manyetik Kart Temelleri

Manyetik kartı okumak için yapmanız gereken başlıca işlevler şunlardır: 1. Kartın ne zaman kaydırıldığını tespit edin 2. Veri akışını okuyun 3. Kartın ne zaman gittiğini tespit edin 4. Verileri işleyin 5. data Öncelikle, kendi kodunuzu yazmaya başladığınızda bilmeniz gereken bazı manyetik kart temellerini size tanıtacağım.

Manyetik Kart Standartları

Manyetik kartlar aşağıdaki belgelerde ISO tarafından standartlaştırılmıştır: 7810 Kredi kartı boyutunda belgenin fiziksel özellikleri 7811-1 Kabartma 7811-2 Manyetik şerit - düşük zorlama 7811-3 Kabartmalı karakterlerin yeri 7811-4 İz 1 ve 2'nin yeri 7811- 5 Parça 3'ün yeri 7811-6 Manyetik şerit - yüksek zorlayıcılık 7813 Finansal işlem kartları Gördüğünüz gibi, finansal kartlar ayrı bir belgede belirtilir ve genellikle bakkal kartınızdan veya uluslararası arama kartınızdan farklı biçimlere sahiptir. Bu farklılıklar için programlama yapmanız gerekecektir. Sadece bir kredi kartım ve sigorta kartım vardı, bu yüzden bu türler için programladım (her ikisi de B biçimindedir).

Kart Formatları

Manyetik kartlar için birkaç farklı format vardır. A ve B formatı ortaktır, B gördüğüm en yaygın olanıdır ve bu kodda desteklenir. C'den M'ye kadar olan formatlar ISO tarafından ayrılmıştır, sanırım, N'den ?? kurumsal özel kullanım için ayrılmıştır. Parça 1 Mali kartlar için, ilk parça inç başına 210 bit olarak kaydedilir ve kartın üstten ilk 0.110"'sidir. Veriler, karakter başına 7 bit olarak "kart verisi" olarak kodlanır. karakter ve biraz eşlik için. 1. izde ~ 79 alfanümerik karakter var. Fiziksel sıralama geriye doğru. Yani, veriler kartta geriye doğru yazılmıştır (ve bu nedenle, yazılımınız tarafından okunacaktır). parite garip. Kart veri formatı şöyle görünür:

[SS] [FC] [Birincil Hesap #] [FS] [Ad] [FS] [Ek veriler] [FS][ES][LRC]burada:

SS Start sentinel FC Format kodu FS Alan ayırıcı ES End sentinel LRC Boyuna Artıklık Kontrol karakteri Bir izleme SS = '%', FC = biçimlerden biri (birçok kez B olacak), FS genellikle '', ES '?' ve standartlarda belirtilmemesine rağmen LRC karakteri genellikle '<' şeklindedir. Kartta geriye doğru yazılmasının yanı sıra, veriler tek bir eşlik bitine sahiptir ve ASCII'den 0x20'dir. Verileri işlerken bunu halledeceğiz. Track 2 Track 2 0.110" genişliğindedir ve 0.110 kartın üst kısmından başlar. Kayıt yoğunluğu 75 bit/inç'tir. Veriler karakter başına 5 bittir ve yalnızca yaklaşık 40 sayısal sembolden oluşur. bu parçadaki harfler Kart veri formatı bu yapıyı takip etmelidir

[SS] [birincil hesap #] [FS] [ek veriler | isteğe bağlı veriler] [ES] [LRC]

İkinci parça için SS noktalı virgüldür: ';' ve FS '=' Bu kutsal bilgi ile, yukarıda özetlenen prosedürü uygulayan kodu görmek için sonraki adımlara geçin.

4. Adım: Bir Kartın Kaydırıldığını Algılayın

Bir Kartın Kaydırıldığını Algıla
Bir Kartın Kaydırıldığını Algıla

1. Bir kartın ne zaman kaydırıldığını tespit edin Resmi olarak, /CARD_PRESENT pininin düşüp düşmediğini kontrol etmek gerekir. Neyse ki, bu gerçekten gerekli değil. Geçerli kart olup olmadığını daha sonra kontrol edeceğiz. Alternatif olarak, flaş piminin pime ne zaman konduğunu görmek için flaş pimini okuyabilirsiniz, ancak bu size çok sayıda sıfır sıfır sağlayacaktır. Okuyucu, verilerin sunulmak üzere olduğunu size bildirmek için yaklaşık 60-70 baştaki sıfır gönderecektir. Ancak, bitleri kaydetmeye ne zaman başlayacağımızı belirlemek için ikili verilerin doğasını kullanacağız. Birinci parça için başlangıç nöbetçisi (SS), yüzde işaretidir (%). İkili değeri 0010 0101'dir, yani 1010 001 olarak saklanacak (ve okunacaktır) (7 bit olduğundan 8. bit iletilmez). Şimdi, zeki okuyucu, verilerin geriye dönük olmasına rağmen ikili ASCII değeriyle eşleşmediğini fark edecektir. Bunun nedeni, altıgenden 0x20 olmasıdır. % sembolü 0x25 ve 0100 0101 0x05'tir. Kart verisi değerden 0x20 çıkarılmıştır. Orada yüksek kemirmede asılı olan, tek parite bitidir. Değerde tek sayıda "1" olacak şekilde yerleştirilir. Dolayısıyla, geçerli bir kartın her zaman bu başlangıç sentinel ile başlayacağını bildiğimiz için ve eşlik biti 1 olduğu için, veri pininde ilk YÜKSEK - DÜŞÜK geçişi tespit ettiğimizde, o zaman henüz yeni almaya başladığımızı biliyoruz. sentinel'i bir karttan başlatın. Şimdi, bu her zaman doğru olmayacak ve ayrıca /CARD_PRESENT kartının DÜŞÜK olup olmadığını kontrol etmek kusursuz bir plan olacaktır. SS'nin başlangıcını algılamanın en basit yolu, /STROBE'nin düşen kenarında tetiklenen bir harici kesme oluşturmaktır. Veriler düşen kenardan önce 1.0 bizim için geçerlidir, bu nedenle düşen kenarı örneklediğinizde, /DATA1 pinini okuyabileceğinizi ve geçerli bir değer alabileceğinizi bilirsiniz. Düşen bir kenarda tetiklenen harici kesmenizi oluşturmak için kod burada.

voidInitInterrupt(void){ // Kurulum kesmesi BSET(EIMSK, INT0); // harici kesme maskesi BSET(EICRA, ISC01); // düşen kenar BCLR(EICRA, ISC00); // düşen kenar BSET(SREG, 7); // SREG'de I biti}

Tüm programlarıma dahil ettiğim common.h dosyamda BSET ve BCLR tanımları yer almaktadır. Bitlerin nasıl ayarlanacağıyla ilgili herhangi bir sorunuz olursa bu dosyaya bakın. Şimdi, kesme tetiklendiğinde, /DATA1'i (benim kodumda CARD_DATA olarak tanımlanır) örneklemek ve genel amaçlı bir IO kaydında bir bit ayarlamak istiyoruz. 7. bitteysek, global arabelleğimizde bir karakter olarak kayıt defterinden kaydedin. Hızlı erişim olduğu için bir GPIOR0 kaydı kullanıyorum. Sözde kod şöyle bir şeydir:

16-bit zamanlayıcıyı durdur Zamanlayıcıyı temizle VERİ DÜŞÜK ise BIT=1'i KAYDET'e ayarla BIT'i Azalt Başka 0'ları atlamamamız için bayrağı ayarla DATA YÜKSEK REGISTER'da BIT=0'ı ayarla BIT'i Azalt BIT 0 ise Ara belleğe bayt ekle Artış endeksi Sıfırla BIT

Kendinize neden artış yerine eksiltme diye soruyorsanız, verilerin geriye dönük olduğunu unutmayın, bu nedenle bitleri LSB'den MSB'ye alırken kaydetmek yerine, onları MSB'den LSB'ye kaydederiz, böylece bitleri tersine çevirmek zorunda kalmazız. daha sonra verileri işlerken. Gerçekten isterseniz, buraya 0x20 hex de ekleyebilirsiniz, ancak bu flaşlarda yaklaşık 5 us olduğu için, bu kesme hizmet rutininde işlemeyi minimumda tutuyorum.

ISR(INT0_vect){ StopTimer(); ClearTimer(); if (!BCHK(PIND, CARD_DATA1)) // ters düşük = 1 { BSET(GPIOR0, bit); --biraz; bDataPresent = 1; } else if (bDataPresent) { BCLR(GPIOR0, bit); --biraz; } if (bit < 0) { buff[idx] = (char)GPIOR0; ++idx; bit = 6; } StartTimer();} Zamanlama işinin neyle ilgili olduğunu merak ediyorsanız, kartın okuyucudan ne zaman ayrıldığını belirleme adımında ele alınmaktadır.

Adım 5: Veri Akışını Okuyun

Veri akışını okuyun

Düşen kenar harici kesmemiz için Kesinti Hizmeti Rutininin bir parçası olduğu için verileri nasıl okuyacağınızı zaten gösterdim. Alternatif bir yöntem, ISR'de bir bayrak ayarlamak ve ana döngüde bayrağı yoklamak ve verileri bu şekilde okumak olabilir, ancak sunduğum yolun daha temiz olduğuna inanıyorum. Kendi kararınız olun ve MCU'nuz izin verirse kendinizinkini yazın. Bununla birlikte, kartın bir Elvis'i çekip binadan ayrıldığını nasıl tespit edeceğimizi bulmaya devam edelim.

Adım 6: Okuyucudan Ayrılan Kartı Algılayın

Okuyucudan Ayrılan Kartı Algıla
Okuyucudan Ayrılan Kartı Algıla

Bir kartın ne zaman gittiğini tespit edin

Resmi olarak, tekrar YÜKSEK olup olmadığını görmek için /CARD_PRESENT pini örneklenir, ancak /CARD_PRESENT'in başka bir G/Ç bağlantı noktası almasına gerek yoktur. Bu zamanlayıcıların devreye girdiği yer burasıdır. /STROBE üzerinde düşen bir kenar tespit ettiğimiz için kesme her çağrıldığında, bir zamanlayıcıyı durdurur, zamanlayıcı değerini temizler ve okumaya başlarız. Okumayı bitirdiğimizde zamanlayıcıyı tekrar başlatıyoruz. Reklam mide bulantısını veya zamanlayıcı belirli bir değere ulaşana kadar tekrarlayın. Bu, son kesmenin çağrıldığı ve daha fazla veri gelmediği anlamına gelir, bu yüzden bu kadar olduğunu varsayıyoruz ve topladığımız verileri işlemeye başlıyoruz. Zamanlayıcılar için TIMER1 kullanıyoruz, yani 16 bit zamanlayıcı. AVR'me harici olarak 16 Mhz rezonatör kullanıyorum. Bir arduino kullanıyorsanız, muhtemelen siz de öylesiniz. Bu yüzden, zamanlayıcının her (16, 000, 000 / 1024) kez artacağı anlamına gelen 1024'lük bir ön ölçekleyici değeri seçtim. Yani saniyede 15,625 kez 'işaretleyecek'. /CARD_PRESENT, kartın son veri bitinden yaklaşık 150ms sonra okuyucudan ayrıldığını gösteren YÜKSEK gidecektir. Bunu bilerek, saniyenin her 1/4'ünü kontrol etmeye karar verdim. Bu şuna benzer bir şey olurdu:

(((F_CPU) / PRECALER) / 4) bu da 3900 civarında çıkıyor. Böylece, zamanlayıcı sayacı TCNT1 3900'e ulaştığında, o zaman yaklaşık 300ms olduğunu biliyorum ve kartın okuyucuyu terk ettiği sonucuna oldukça güvenli bir şekilde varabilirim. Kolay

#define PRESCALER 1024#define CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#define StartTimer() BSET(TCCR1B, CS10), BSET(TCCR1B, CS12) // 1024 precaler#define StopTimer() BCLR(TCCR1B, CS10), BCLR(TCCR1B, CS12)#define ClearTimer() (TCNT1 = 0) Her kesintide zamanlayıcının başlatıldığı, durdurulduğu ve temizlendiği ISR'de gördünüz. Şimdi, ana döngüde, zamanlayıcı sayacının hedef değerimize ulaşıp ulaşmadığını kontrol ediyoruz ve eğer öyleyse, veri işlemeyi başlatıyoruz.

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

StopTimer(); ClearTimer(); Veri işleme(); ReadData(); idx = 0; bit = 6; bDataPresent = 0; memset(&buff, 0, MAX_BUFF_SZ1); } } Artık verileri işlemek güvenli

manoli.net/csharpformat/ tarafından biçimlendirilmiş kod

7. Adım: Verileri İşleyin

Verileri İşleyin
Verileri İşleyin

Verileri işleyin

İşleme aşaması şunlardan oluşur:

  • geçerli bir SS kontrolü
  • pariteyi kontrol etme
  • ASCII'ye dönüştürme
  • geçerli bir ES olup olmadığını kontrol etme
  • LRC'yi kontrol etme

Burada, pariteyi kontrol etmekle uğraşmıyorum, çünkü o biti sıfıra ayarladım. Ayrıca bu küçük eğitim için LRC'yi hesaplamıyorum. Bu, daha tam olarak gerçekleştirilmiş bir üretici yazılımının yapmak isteyebileceği bir şey olabilir. Yukarıdaki adımları uygulayarak verileri işlemek için kod buradadır (daha önce bahsedilenler hariç). Aşağıdaki resimde bulun. Yorumlanmış ve oldukça açıklayıcı. Parite ve ASCII hakkında özel bir not: Ben sadece eşlik bitini (7. bit…yani arkasında 6 sıfır olan bir 1) siliyorum ve "kart verisinden" dönüştürmek için değere 0x20 eklemelisiniz. Bununla ilgili.

8. Adım: Verileri Görüntüleyin

Verileri Görüntüle
Verileri Görüntüle
Verileri Görüntüle
Verileri Görüntüle

Verileri göster

Ekran, özellikle bir AVR'ye RS232 veya USB üzerinden bağlanmak için yazdığım bir terminal programına gidiyor. Programın adı AVR Terminali. ReadData() yöntemi oldukça çirkin ve benim bulduğumdan daha temiz bir çözüm bulmaya teşvik ediliyorsunuz. AVR Terminalinde işlevin bir çıktısı da var. Çıktı ilk olarak bir sağlık sigortası kartının, ikincisi ise bir VISA kartının çıktısıdır. Resmin sol üst köşesindeki simgesine tıklayın ve daha iyi görmek için orijinal veya büyük resmi seçin.

9. Adım: Kod İndirme ve Özetleme

Bu talimatta, manyetik kart okuyucuların bazı temellerini tartıştım ve manyetik kartlardan veri okumaya doğru yönde başlamanız için size bazı kodlar gösterdim. 2. parçayı okumak ve kodunu çözmek, LRC'yi hesaplamak ve her bayttaki tek pariteyi hesaplamak gibi yapılabilecek daha birçok iş var. Tam kaynak kodu aşağıdan indirilebilir. AVR Studio 4.17'de yazılmıştır. Umarım bu öğreticiyi beğenmişsinizdir ve her zaman olduğu gibi, sahip olabileceğiniz her türlü yorum veya öneriyi dört gözle bekliyorum. İyi kodlamalar ve AVR'ler!

Önerilen: