Taula de continguts:

Convertiu el vostre Arduino en un lector de targetes magnètic: 9 passos (amb imatges)
Convertiu el vostre Arduino en un lector de targetes magnètic: 9 passos (amb imatges)

Vídeo: Convertiu el vostre Arduino en un lector de targetes magnètic: 9 passos (amb imatges)

Vídeo: Convertiu el vostre Arduino en un lector de targetes magnètic: 9 passos (amb imatges)
Vídeo: Scratch Challenge: 2n seminari web 2024, Juliol
Anonim
Convertiu el vostre Arduino en un lector de targetes magnètic
Convertiu el vostre Arduino en un lector de targetes magnètic
Convertiu el vostre Arduino en un lector de targetes magnètic
Convertiu el vostre Arduino en un lector de targetes magnètic
Convertiu el vostre Arduino en un lector de targetes magnètic
Convertiu el vostre Arduino en un lector de targetes magnètic

Crec que tothom ha utilitzat un lector de targetes magnètiques. Vull dir, qui porta efectiu aquests dies? Tampoc no són difícils d’aconseguir les mans, i durant un viatge a la meva botiga d’electrònica local preferida, vaig trobar un contenidor ple d’aquests nois. Així que … per descomptat, en vaig agafar un i el vaig portar a casa per veure quin tipus de coses podia fer amb ell i un AVR.

Aquesta instrucció us mostrarà com connectar un lector de targetes magnètiques Magtek a un AVR o Arduino / clonar i llegir les dades de la primera pista de la targeta. Sivella els seients; els lectors de targetes magnètiques tenen una taxa de bits elevada.

Pas 1: la llista d'equips

La llista d’equips
La llista d’equips
La llista d’equips
La llista d’equips

Aquí hi ha algunes coses que necessiteu per començar.

  • Lector de targetes magnètiques (el meu és un lector de doble capçal Magetk de 90 mm. 5,00 $)
  • AVR, Arduino o clon (ATmega328p ~ 4,30 $ de Mouser.com
  • tauler de pa sense soldadura
  • una mica de filferro
  • potser una capçalera si us agrada això.
  • alguna cosa per llegir el vostre port sèrie. Faig servir el terminal AVR de BattleDroids.net

Això és tot el que necessiteu per començar. En funció del lector de targetes magiques que acabi obtenint, és possible que hàgiu de modificar aquestes instruccions i, amb tota seguretat, el codi, per treballar amb el vostre lector específic. Tanmateix, espero que el codi que he escrit us hagi de portar bastant lluny.

Pas 2: lectors de targetes magnètiques de rellotge automàtic

Lectors de targetes magnètiques automàtiques
Lectors de targetes magnètiques automàtiques
Lectors de targetes magnètiques automàtiques
Lectors de targetes magnètiques automàtiques
Lectors de targetes magnètiques automàtiques
Lectors de targetes magnètiques automàtiques
Lectors de targetes magnètiques automàtiques
Lectors de targetes magnètiques automàtiques

Els lectors de targetes magnètiques són "autocontrolats", és a dir, proporcionen un rellotge anomenat estroboscòpic amb el qual es pot sincronitzar el microcontrolador connectat. Això és una benedicció. Vol dir que no us heu de preocupar de buscar un senyal de rellotge i de sincronitzar el senyal per centrar-lo directament en el pols del rellotge i que no hi hagi molestos oscil·lacions cap al punt dolç del senyal del rellotge. Això té sentit quan es pensa en lliscaments de cartes: tothom llisca a un ritme diferent, alguns més lents i altres més ràpids que altres. L’autoregulació permet fins i tot a la meva dolça àvia la possibilitat d’utilitzar la seva targeta sense trencar-se el canell. Em recorda haver de canviar la configuració que determina la quantitat de temps vàlid entre clics per registrar un doble clic …

Les dades d'aquest lector de targetes són vàlides 1.0 us abans de posar el llum estroboscòpic a la línia, de manera que no cal preocupar-se per endarrerir-se per entrar en el "temps de bits". Per a un lector de doble capçal com el que estic fent servir, hi ha dues pistes de dades disponibles per llegir. En aquest tema, mostraré la lectura de la primera pista principal per començar. Hi ha cinc connexions que haureu de fer (quatre si no us importa renunciar a un control més ajustat per a menys ports d'E / S que s'utilitzen). Mireu la imatge següent. El fil vermell va a + 5 V mentre el fil negre va a terra. El fil verd és / CARD_PRESENT; el fil groc és / STROBE i el fil blanc és / DATA1. La barra inclinada (/) significa que les dades estan invertides. Un senyal de baixa (és a dir, 0) es llegeix com un o alt. La resta de connectors són marrons per a / STROBE2 i taronja per a / DATA2. No els utilitzarem. Si voleu, podeu oblidar-vos de / CARD_PRESENT. Aquesta línia de dades baixa després d’aproximadament 17 rotacions de flux de cap per indicar que hi ha una targeta (en lloc de, per exemple, un soroll aleatori que fa que el lector enviï dades falses) i s’utilitza per validar que les dades que obteniu són dades de targeta i no escombraries. Podeu ometre aquesta connexió si comproveu el sentinella inicial al flux de dades. Més informació sobre això més endavant. Com podeu veure a continuació, he utilitzat una capçalera masculina d’angle recte connectada a una placa de pa i hi he connectat el meu lector. He connectat / STROBE a PIND2 (pin digital 2 en un Arduino), / CARD_PRESENT a PIND3 (a efectes d’il·lustració) i / DATA1 a PIND4. Assegureu-vos que activeu els pullups en aquests pins perquè els pins no flotin. També vaig canviar el meu Arduino per un AVR de Bare Bones perquè m’agrada la forma en què s’adapta a la taula de treball.

Pas 3: Conceptes bàsics de les targetes magnètiques

Fonaments bàsics de la targeta magnètica
Fonaments bàsics de la targeta magnètica

Les funcions principals que haureu de fer per llegir una targeta magnètica són: 1. Detectar quan s’ha passat la targeta. 2. Llegiu el flux de dades. 3. Detecteu quan ha passat la targeta. 4. Processeu les dades. 5. Visualitzeu la dades En primer lloc, us presentaré alguns aspectes bàsics de la targeta magnètica que haureu de conèixer quan comenceu a escriure el vostre propi codi.

Normes de targeta magnètica

Les targetes magnètiques estan normalitzades per la ISO en els documents següents: 7810 Característiques físiques del document de mida de la targeta de crèdit 7811-1 Relief 7811-2 Banda magnètica - baixa coercitivitat 7811-3 Ubicació dels caràcters en relleu 7811-4 Ubicació de les pistes 1 i 2 7811- 5 Ubicació de la pista 3 7811-6 Banda magnètica: alta coercitivitat 7813 Targetes de transaccions financeres Com podeu veure, les targetes financeres s’especifiquen en un document separat i sovint tenen formats diferents de, per exemple, la vostra targeta de queviures o la vostra targeta de trucada internacional. Haureu de programar aquestes diferències. Acabo de tenir una targeta de crèdit i una targeta d’assegurança a mà, així que he programat per a aquests tipus (que tots dos tenen el format B).

Formats de la targeta

Hi ha diversos formats diferents per a targetes magnètiques. Els formats A i B són habituals, sent B el més comú que he vist i que s’admet en aquest codi. Crec que els formats C a M estan reservats per la ISO, mentre que N fins a ?? es reserven per a ús institucional personalitzat. Pista 1 Per a les targetes financeres, la primera pista es registra a 210 bits per polzada i és el primer 0.110 "de la targeta des de la part superior. Les dades es codifiquen com a" dades de la targeta "com a 7 bits per caràcter. Això és de 6 bits per el caràcter i una mica de paritat. Hi ha ~ 79 caràcters alfanumèrics a la pista 1. L'ordenació física és inversa. És a dir, les dades estan escrites cap enrere a la targeta (i, per tant, el firmware les llegirà) com. la paritat és estranya. El format de dades de la targeta té aquest aspecte:

[SS] [FC] [Número de compte principal] [FS] [Nom] [FS] [Dades addicionals] [FS] [ES] [LRC] on:

SS Start sentinel FC Codi de format FS Separador de camps ES End sentinel LRC Caràcter de verificació de la redundància longitudinal Seguiment d'un SS = '%', FC = un dels formats (serà B moltes vegades), FS sovint és '', ES és '?' i el caràcter LRC sol ser "<" encara que no està especificat a les normes. A més d’estar escrites a la targeta cap enrere, les dades tenen un bit de paritat imparell i són 0x20 d’ASCII. Nosaltres ho gestionarem quan processem les dades. Pista 2 La pista 2 té una amplada de 0,110 polzades i comença a 0,110 des de la part superior de la targeta. La densitat de gravació és de 75 bits per polzada. Les dades són de 5 bits per caràcter i consten d’uns 40 símbols numèrics. No us heu de trobar lletres en aquesta pista. El format de dades de la targeta hauria de seguir aquesta estructura

[SS] [compte principal #] [FS] [dades addicionals | dades discrecionals] [ES] [LRC]

El SS per a la pista dos és el punt i coma: ';' i el FS és '=' Amb aquest sant coneixement al vostre abast, continueu amb els passos següents per veure el codi que implementa el procediment esmentat anteriorment.

Pas 4: detecteu quan es llisca una targeta

Detectar quan es llisca una targeta
Detectar quan es llisca una targeta

1. Detectar quan una targeta s'ha lliscat formalment, es comprovaria el pin / CARD_PRESENT per veure si ha baixat. Afortunadament, això no és realment necessari. Més endavant comprovarem si hi ha una targeta vàlida. Alternativament, podeu llegir el passador estroboscòpic per veure quan s’han posat els estroboscòpics al pin, però, això us permetrà obtenir molts zero. El lector us enviarà uns 60-70 zero inicials per fer-vos saber que les dades estan a punt de ser presentades. No obstant això, utilitzarem la naturalesa de les dades binàries per determinar quan començar a gravar bits. La sentinella inicial (SS) de la primera pista és el signe percentual (%). El seu valor binari és 0010 0101, el que significa que s’emmagatzemarà (i es llegirà) com a 1010 001 (té 7 bits, de manera que no es transmet el vuitè bit). Ara, el lector astut notarà que, tot i que les dades són inverses, no coincideixen amb el valor ASCII binari. Això es deu al fet que té 0 x 20 de descompte en hexadecimal. El símbol% és 0x25 i 0100 0101 és 0x05. Les dades de la targeta s'han restat 0x20 del valor. Aquell que hi ha penjat a la picada alta és el bit de paritat estrany. S'hi posa de manera que hi hagi un nombre senar de "1" al valor. Per tant, perquè sabem que una targeta vàlida sempre començarà amb aquesta sentinella d’inici i perquè el bit de paritat és 1, quan detectem la primera transició ALTA a BAIXA al pin de dades, sabem que acabem de començar a rebre el iniciar sentinella des d'una targeta. Ara bé, això no sempre serà cert i un pla infal·lible seria comprovar la targeta / CARD_PRESENT per veure si a més ha baixat. La forma més senzilla de detectar l’inici del SS és crear una interrupció externa desencadenada a la vora descendent del / STROBE. Les dades són vàlides 1.0 us abans de la vora descendent, de manera que quan hàgiu mostrat la vora descendent, sabreu que podeu llegir el pin / DATA1 i obtenir un valor vàlid. Aquí teniu el codi per crear la vostra interrupció externa desencadenada en un extrem descendent.

voidInitInterrupt (void) {// Configuració de la interrupció BSET (EIMSK, INT0); // màscara d’interrupció externa BSET (EICRA, ISC01); // caiguda BCLR (EICRA, ISC00); // caiguda BSET (SREG, 7); // I-bit a SREG}

Al meu common.h que incloc a tots els meus programes, es poden trobar les definicions de BSET i BCLR. Consulteu aquest fitxer si teniu cap pregunta sobre com configurar bits. Ara, quan s'activa la interrupció, volem provar el / DATA1 (al meu codi definit com CARD_DATA) i establir una mica en un registre IO de propòsit general. Si som al setè bit, deseu el registre com a personatge al nostre buffer global. Faig servir un registre GPIOR0 perquè té un accés ràpid i esporàdic. El pseudocodi és una cosa així:

Atura el temporitzador de 16 bits Esborra el temporitzador Si les dades són BAIXES Estableix BIT = 1 a REGISTRAR Decrement BIT Estableix el senyalador perquè no saltem cap altre 0 Les dades són ALTRES Establir BIT = 0 a REGISTRAR Decrement BIT Si BIT és 0 Afegeix un byte al buffer Índex d'increment Restablir BIT

Si us pregunteu per què disminuir en lloc d’incrementar, recordeu que les dades es retrocedeixen, de manera que en lloc de gravar els bits tal com els obtenim de LSB a MSB, els guardem de MSB a LSB, de manera que no hem d’invertir els bits més tard en processar les dades. Si realment volíeu, també podríeu afegir hexadecimal 0x20 aquí, però com que fa uns 5us en aquests estroboscòpics, mantindré el processament d'aquesta rutina de servei d'interrupció al mínim.

ISR (INT0_vect) {StopTimer (); ClearTimer (); if (! BCHK (PIND, CARD_DATA1)) // invers invers = 1 {BSET (GPIOR0, bit); --bit; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bit); --bit; } if (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Si us pregunteu de què tracta el negoci de sincronització, es tracta del pas per determinar quan la targeta ha deixat el lector.

Pas 5: llegiu el flux de dades

Llegiu el flux de dades

Bé, ja us he mostrat com llegir les dades, ja que forma part de la rutina de servei d’interrupció per a la nostra interrupció externa de caiguda descendent. Un mètode alternatiu seria establir una bandera a la ISR i, al bucle principal, enquestar la bandera i llegir les dades d’aquesta manera, però crec que la forma en què l’he presentat és més neta. Sigui el seu propi jutge i escrigui el seu, però el MCU ho permetrà. Dit això, passem a esbrinar com detectar quan la targeta treu un Elvis i ha sortit de l'edifici.

Pas 6: detecteu la targeta que surt del lector

Detecta la targeta que surt del lector
Detecta la targeta que surt del lector

Detectar quan s'ha desaparegut una targeta

Formalment, es mostra el pin / CARD_PRESENT per veure si ha tornat a ser HIGH, però no necessitem que Steenkin '/ CARD_PRESENT ocupi un altre port d'E / S. Aquí és on entren aquests temporitzadors. Cada vegada que es crida la interrupció perquè hem detectat una caiguda a / STROBE, aturem un temporitzador, esborrem el valor del temporitzador i comencem a llegir. Quan hàgim acabat de llegir, tornem a iniciar el temporitzador. Repetiu la publicitat o fins que el temporitzador assoleixi un valor determinat. Això vol dir que s'ha trucat a l'última interrupció i no ha entrat més dades, de manera que suposem que ja està i comencem a processar les dades que hem recopilat. Per als temporitzadors, fem servir TIMER1, és a dir, el temporitzador de 16 bits. Estic fent servir un ressonador de 16 MHz externament al meu AVR. Si feu servir un arduino, probablement també ho feu. Per tant, he escollit un valor de prescaler de 1024, que significa que cada (16, 000, 000/1024) vegades s’incrementarà el temporitzador. És a dir, "marcarà" 15, 625 vegades per segon. El / CARD_PRESENT anirà ALT indicant que la targeta ha deixat el lector uns 150 ms després de l'últim bit de dades. Sabent això, només vaig decidir comprovar cada 1/4 de segon. Seria una cosa així:

((((F_CPU) / PRESCALER) / 4) que resulta al voltant de 3900. Per tant, quan el comptador de temporitzador TCNT1 arriba a 3900, sé que han passat uns 300 ms i puc concloure amb seguretat que la targeta ha deixat el lector. Fàcil

#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) Heu vist a la ISR on s’inicia, s’atura i s’esborra el temporitzador en cada interrupció. Ara, al bucle principal, només comprovem si el comptador del temporitzador ha assolit el nostre valor objectiu i, si és així, comencem el processament de dades

per a (;;) {if (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Ara és segur processar les dades

codi formatat per

Pas 7: processar les dades

Processar les dades
Processar les dades

Processar les dades

La fase de processament consisteix en:

  • comprovant si hi ha un SS vàlid
  • comprovant la paritat
  • convertint-se a ASCII
  • comprovant si hi ha un ES vàlid
  • comprovant LRC

Aquí, no em molesto a comprovar la paritat, ja que acabo de posar aquest bit a zero. Tampoc calculo el LRC d’aquest petit tutorial. Això seria una cosa que potser voldria fer un microprogramari més complet: aquí teniu el codi per processar les dades seguint els passos anteriors (sense l’esmentat anteriorment). El trobareu a la imatge següent. És comentat i s’explica per si mateix. Una nota especial sobre paritat i ASCII: simplement esborro el bit de paritat (7è bit … és a dir, un 1 amb 6 zeros darrere) i per convertir de "dades de targeta" heu d'afegir 0x20 al valor. Això és tot.

Pas 8: mostra les dades

Mostra les dades
Mostra les dades
Mostra les dades
Mostra les dades

Mostra les dades

La pantalla va a un programa terminal que he escrit específicament per connectar-me a un AVR mitjançant RS232 o USB. El programa s’anomena Terminal AVR. El mètode ReadData () és bastant lleig i us animem a trobar una solució més neta que la que he tingut. També hi ha una sortida de la funció al terminal AVR. El resultat és el primer d’una targeta d’assegurança mèdica i el segon és d’una targeta VISA. Feu clic a a l'extrem superior esquerre de la imatge i trieu la imatge original o gran per veure-la millor.

Pas 9: descàrrega i finalització de codi

En aquest instructiu he comentat alguns conceptes bàsics dels lectors de targetes magnètiques i us he mostrat alguns codis per començar a llegir la informació de les targetes magnètiques en la direcció correcta. Es pot fer molta més feina, com ara llegir i descodificar la segona pista, calcular el LRC i calcular la paritat imparella de cada byte. El codi font complet es pot descarregar a continuació. Va ser escrit a AVR Studio 4.17. Espero que us hagi agradat aquest instructiu i, com sempre, espero qualsevol comentari o suggeriment que tingueu.

Recomanat: