Orodha ya maudhui:

Badilisha Arduino Yako Kuwa Msomaji wa Kadi ya Magnetic!: Hatua 9 (na Picha)
Badilisha Arduino Yako Kuwa Msomaji wa Kadi ya Magnetic!: Hatua 9 (na Picha)

Video: Badilisha Arduino Yako Kuwa Msomaji wa Kadi ya Magnetic!: Hatua 9 (na Picha)

Video: Badilisha Arduino Yako Kuwa Msomaji wa Kadi ya Magnetic!: Hatua 9 (na Picha)
Video: Как использовать термопару MAX6675 типа k с Arduino 2024, Julai
Anonim
Badilisha Arduino yako kuwa Msomaji wa Kadi ya Magnetic!
Badilisha Arduino yako kuwa Msomaji wa Kadi ya Magnetic!
Badilisha Arduino yako kuwa Msomaji wa Kadi ya Magnetic!
Badilisha Arduino yako kuwa Msomaji wa Kadi ya Magnetic!
Badilisha Arduino yako kuwa Msomaji wa Kadi ya Magnetic!
Badilisha Arduino yako kuwa Msomaji wa Kadi ya Magnetic!

Kila mtu ametumia msomaji wa kadi ya sumaku, naamini. Namaanisha, ni nani hubeba pesa siku hizi? Sio ngumu kupata mikono yako, pia, na wakati wa safari ya duka langu la kupendeza la elektroniki, nilipata pipa iliyojaa hawa watu. Kwa hivyo…. Kwa kweli, nilichukua moja na kuileta nyumbani ili kuona ni aina gani ya vitu ambavyo ningeweza kufanya nayo na AVR.

Mafundisho haya yatakuonyesha jinsi ya kuunganisha kisomaji cha kadi ya sumaku ya Magtek kwa AVR au Arduino / clone na usome data kutoka kwa wimbo wa kwanza wa kadi. Bandika viti vyako; wasomaji wa kadi ya sumaku wana kiwango kidogo!

Hatua ya 1: Orodha ya Vifaa

Orodha ya Vifaa
Orodha ya Vifaa
Orodha ya Vifaa
Orodha ya Vifaa

Hapa kuna mambo kadhaa ambayo unahitaji kuanza.

  • Msomaji wa kadi ya sumaku (Yangu ni msomaji wa kichwa-mbili wa Magetk 90mm. $ 5.00)
  • AVR, Arduino, au Clone (ATmega328p ~ $ 4.30 kutoka Mouser.com
  • mkate wa mkate usiouzwa
  • waya fulani
  • labda kichwa ikiwa unapenda kitu hicho cha aina.
  • kitu cha kusoma bandari yako ya serial. Ninatumia Kituo cha AVR kutoka BattleDroids.net

Hiyo ndiyo yote unayohitaji kuanza. Kulingana na msomaji magcard unayemaliza kupata, itabidi ubadilishe maagizo haya, na hakika nambari, kufanya kazi na msomaji wako maalum. Walakini, nambari niliyoandika inapaswa kukufikisha mbali, natumai.

Hatua ya 2: Wasomaji wa Kadi ya Magnetic ya Kujitegemea

Wasomaji wa Kadi ya Magnetic ya kujifunga
Wasomaji wa Kadi ya Magnetic ya kujifunga
Wasomaji wa Kadi ya Magnetic ya kujifunga
Wasomaji wa Kadi ya Magnetic ya kujifunga
Wasomaji wa Kadi ya Magnetic ya kujifunga
Wasomaji wa Kadi ya Magnetic ya kujifunga
Wasomaji wa Kadi ya Magnetic ya kujifunga
Wasomaji wa Kadi ya Magnetic ya kujifunga

Wasomaji wa kadi ya sumaku ni "saa ya kujitegemea," ikimaanisha kuwa hutoa saa inayoitwa strobe, ambayo microcontroller inayounganishwa inaweza kusawazisha. Hii ni neema. Inamaanisha huna haja ya kuwa na wasiwasi juu ya kutafuta ishara ya saa na muda wa ishara ili uingie moja kwa moja kwenye mapigo ya saa, na hakuna shida inayosumbua kwenye eneo tamu la ishara ya saa. Hii ina maana wakati unafikiria juu ya swipe za kadi: kila mtu hutembea kwa kasi tofauti, wengine polepole, wengine haraka kuliko wengine. Kujifunga kwa saa kunaruhusu hata bibi yangu mtamu uwezo wa kutumia kadi yake bila kuvunja mkono wake. Inanikumbusha juu ya kulazimika kubadilisha mpangilio wake ambao huamua ni muda gani halali kati ya mibofyo kusajili bonyeza mara mbili….

Takwimu za msomaji wa kadi hii ni halali ya 1.0 kabla ya strobe kuwekwa kwenye laini, kwa hivyo hakuna wasiwasi juu ya kuchelewesha kujiingiza katika "muda kidogo." Kwa msomaji mkuu wa kichwa kama vile ninayotumia, kuna nyimbo mbili za data zinazopatikana kusoma. Katika hii ible, nitaonyesha kusoma kutoka kwa wimbo wa kwanza wa kwanza ili uanze. Kuna miunganisho mitano utahitaji kufanya (nne ikiwa haujali kutoa udhibiti mzuri zaidi wa bandari chache za I / O zinazotumiwa). Angalia picha hapa chini. Waya nyekundu huenda kwa + 5V wakati waya mweusi huenda chini. Waya wa kijani ni / CARD_PRESENT; waya wa manjano ni / STROBE, na waya mweupe ni / DATA1. Kufyeka mbele (/) kunamaanisha kuwa data imegeuzwa. Ishara ya chini (yaani 0) inasomwa kama moja, au juu. Viunganishi vingine ni hudhurungi kwa / STROBE2 na machungwa kwa / DATA2. Hatutatumia hizi. Ikiwa unataka, unaweza kusahau kuhusu / CARD_PRESENT. Mstari huu wa data huenda chini baada ya kuzunguka kwa kichwa 17 kuonyesha kwamba kadi iko (badala ya, tuseme, kelele ya nasibu inayosababisha msomaji wako kutuma data bandia) na hutumiwa kudhibitisha kuwa data unayopata ni data ya kadi na sio taka. Unaweza kuruka muunganisho huu ikiwa utatafuta sentinel ya kuanza kwenye mkondo wa data. Zaidi juu ya hayo baadaye. Kama unavyoona hapa chini, nilitumia kichwa cha kiume cha pembe ya kulia kilichounganishwa na ubao wa mkate na niliunganisha msomaji wangu kwa hiyo. Niliunganisha / STROBE kwa PIND2 (pini ya dijiti 2 kwenye Arduino), / CARD_PRESENT kwa PIND3 (kwa madhumuni ya kielelezo), na / DATA1 hadi PIND4. Hakikisha unawezesha kuvuta kwenye pini hizi ili pini zako zisielea. Pia niliuza Arduino yangu kwa Bare Bones AVR kwa sababu napenda jinsi inavyofaa kwenye ubao wa mkate.

Hatua ya 3: Misingi ya Kadi ya Magnetic

Misingi ya Kadi ya Magnetic
Misingi ya Kadi ya Magnetic

Kazi za msingi ambazo utahitaji kufanya kusoma kadi ya sumaku ni: 1. Tambua wakati kadi imebadilishwa 2. Soma mkondo wa data 3. Tambua wakati kadi imeenda 4. Tengeneza data 5. Onyesha data Kwanza, nitakujulisha kwa misingi ya kadi ya sumaku ambayo utahitaji kujua unapoanza kuandika nambari yako mwenyewe.

Viwango vya Kadi ya Magnetic

Kadi za sumaku zimesanifishwa na ISO katika hati zifuatazo: 7810 Tabia za mwili za hati ya saizi ya kadi ya mkopo 7811-1 Embossing 7811-2 Mstari wa sumaku - ushawishi mdogo 7811-3 Mahali pa wahusika embossed 7811-4 Mahali pa nyimbo 1 & 2 7811- 5 Mahali pa wimbo 3 7811-6 Mstari wa sumaku - ushawishi mkubwa 7813 Kadi za manunuzi ya kifedha Kama unavyoona, kadi za kifedha zimetajwa katika hati tofauti na mara nyingi zina muundo tofauti na, tuseme, kadi yako ya mboga au kadi ya simu ya kimataifa. Itabidi upange kwa tofauti hizi. Nilikuwa na kadi ya mkopo na kadi ya bima inayofaa, kwa hivyo nikapanga aina hizi (ambazo zote zinatokea kuwa muundo B).

Miundo ya Kadi

Kuna fomati kadhaa tofauti za kadi za sumaku. Fomati A na B ni ya kawaida, na B kuwa ya kawaida nimeona, na ambayo inasaidiwa katika nambari hii. Miundo C kupitia M imehifadhiwa na ISO, naamini, wakati N kupitia ?? zimehifadhiwa kwa matumizi ya kitamaduni. Fuatilia 1 Kwa kadi za kifedha, wimbo wa kwanza umerekodiwa kwa bits 210 kwa inchi na ndio 0.110 ya kwanza "ya kadi kutoka juu. Takwimu zimesimbwa kama" data ya kadi "kama biti 7 kwa kila herufi. Hiyo ni bits 6 kwa tabia na kidogo kwa usawa Kuna wahusika ~ alphanumeric 79 kwenye wimbo 1. Kuagiza kwa mwili kunarudi nyuma. Hiyo ni kwamba, data ni lakini imeandikwa nyuma kwenye kadi (na kwa hivyo, itasomwa na firmware yako) kama. Usawa ni wa kawaida. Fomati ya data ya kadi inaonekana kama hii:

[SS] [FC] [Akaunti ya Msingi #] [FS] [Jina] [FS] [Data ya ziada] [FS] [ES] [LRC] ambapo:

SS Anza sentinel FC Fomati ya nambari FS Field separator ES End sentinel LRC Longitudinal Redundancy Angalia tabia Fuatilia moja SS = '%', FC = moja ya fomati (itakuwa B mara nyingi), FS mara nyingi ", ES ni '?' na tabia ya LRC kawaida '<' ingawa haijaainishwa katika viwango. Licha ya kuandikwa kwenye kadi nyuma, data ina usawa kidogo na ni 0x20 kutoka ASCII. Tutashughulikia hii wakati tutashughulikia data. Kufuatilia 2 Kufuatilia mbili ni 0.110 "pana na huanza 0.110 kutoka juu ya kadi. Uzito wa kurekodi ni bits 75 kwa inchi. Takwimu ni bits 5 kwa kila mhusika na ina alama karibu 40 za nambari tu. Haupaswi kukutana na yoyote herufi kwenye wimbo huu. Fomati ya data ya kadi inapaswa kufuata muundo huu

[SS] [akaunti msingi #] [FS] [data ya ziada | data ya hiari] [ES] [LRC]

SS ya wimbo wa pili ni semicoloni: ';' na FS ni '=' Ukiwa na maarifa haya matakatifu chini ya mkanda wako, endelea kwa hatua zifuatazo kuona nambari inayotekeleza utaratibu ulioainishwa hapo juu.

Hatua ya 4: Tambua Wakati Kadi Inatiririka

Gundua Wakati Kadi Inatiririka
Gundua Wakati Kadi Inatiririka

1. Tambua wakati kadi imebadilishwa rasmi, mtu angeangalia pini ya / CARD_PRESENT kuona ikiwa imeshuka chini. Kwa bahati nzuri, hii sio lazima sana. Tutaangalia kadi halali baadaye. Vinginevyo, unaweza kusoma pini yako ya strobe ili uone wakati strobes zimewekwa kwenye pini, hata hivyo, hii itakupa muda mwingi wa saa. Msomaji atatuma karibu sifuri 60-70 zinazoongoza kukujulisha kuwa data inakaribia kuwasilishwa. Walakini, tutatumia hali ya data ya kibainolojia kuamua wakati wa kuanza kurekodi bits. Sentinel ya kuanza (SS) ya wimbo wa kwanza ni ishara ya asilimia (%). Thamani ya kibinadamu ni 0010 0101 ambayo inamaanisha itahifadhiwa (na kusoma) kama 1010 001 (ni bits 7 kwa hivyo kitita cha 8 hakijasambazwa). Sasa, msomaji mwenye busara atagundua kuwa ingawa data iko nyuma hailingani na dhamana ya ASCII. Hiyo ni kwa sababu ni 0x20 mbali ya hex. Alama ya% ni 0x25 na 0100 0101 ni 0x05. Data ya kadi imeondolewa 0x20 kutoka kwa thamani. Kwamba mtu anayepachikwa pale kwenye nibble ya juu ni usawa kidogo. Imewekwa hapo ili kuwe na idadi isiyo ya kawaida ya "1" s katika thamani. Kwa hivyo kwa sababu tunajua kuwa kadi halali itaanza kila wakati na sentinel hii ya kuanza, na kwa sababu usawa ni 1, basi tunapogundua mpito wa kwanza wa HALI YA juu hadi chini kwenye pini ya data, basi tunajua tumeanza kupokea anza sentinel kutoka kwa kadi. Sasa, hii haitakuwa kweli kila wakati, na mpango wa ujinga utakuwa kuangalia kadi ya / CARD_PRESENT ili kuona ikiwa imepita LOW kwa kuongeza. Njia rahisi zaidi ya kugundua mwanzo wa SS, ni kuunda usumbufu wa nje uliosababishwa kwenye ukingo wa kuanguka kwa / STROBE. Takwimu ni halali 1.0 sisi kabla ya ukingo unaoanguka, kwa hivyo wakati umechukua sampuli ya ukingo unaoanguka, basi unajua unaweza kusoma pini ya / DATA1 na kupata thamani halali. Hapa kuna nambari ya kuunda usumbufu wako wa nje uliosababishwa kwenye kingo zinazoanguka.

voidInitInterrupt (batili) {// Usanidi usumbue BSET (EIMSK, INT0); // mask ya nje ya kukatiza BSET (EICRA, ISC01); // kuanguka kwa BCLR (EICRA, ISC00); // kuanguka kwa BSET (SREG, 7); // I-bit katika SREG}

Katika kawaida yangu ambayo ninajumuisha katika mipango yangu yote, ufafanuzi wa BSET na BCLR unaweza kupatikana. Rejea faili hiyo ikiwa unapaswa kuwa na maswali yoyote juu ya jinsi ya kuweka bits. Sasa, wakati usumbufu unaposababishwa, tunataka kuchukua sampuli ya / DATA1 (katika nambari yangu iliyofafanuliwa kama CARD_DATA) na kuweka kidogo katika daftari la jumla la IO. Ikiwa tuko kwenye kitengo cha 7, weka rejista kama tabia katika bafa yetu ya ulimwengu. Ninatumia rejista ya GPIOR0 kwa sababu ni ufikiaji wa haraka wa spiffy. Nambari ya uwongo ni kitu kama hiki:

Acha kipima muda cha 16-bit Ondoa kipima wakati DATA ni ya chini Weka BIT = 1 katika USAJILI Punguza BIT Weka bendera ili tusiruke zaidi 0 nyingine DATA ni HIGH Set BIT = 0 katika REGISTER Decrement BIT Ikiwa BIT ni 0 Ongeza baiti kwa bafa Kiwango cha nyongeza Rudisha BIT

Ikiwa unajiuliza kwanini upunguzaji badala ya nyongeza, kumbuka kuwa data iko nyuma, kwa hivyo badala ya kurekodi bits tunapozipata kutoka LSB hadi MSB, tunawaokoa kutoka MSB kwenda LSB kwa hivyo hatuhitaji kurudisha nyuma bits baadaye wakati wa kusindika data. Ikiwa unataka kweli, unaweza pia kuongeza hex 0x20 hapa, lakini kwa kuwa ni karibu 5us kwenye strobes hizi, ninaweka usindikaji katika utaratibu huu wa usumbufu wa huduma.

ISR (INT0_vect) {StopTimer (); ClearTimer (); ikiwa (! BCHK (PIND, CARD_DATA1)) // inverse low = 1 {BSET (GPIOR0, bit); - siti; bDataPresent = 1; } mwingine ikiwa (bDataPresent) {BCLR (GPIOR0, bit); - siti; } ikiwa (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; kidogo = 6; } StartTimer ();} Ikiwa unajiuliza biashara ya wakati ni nini, hiyo imefunikwa katika hatua ya kuamua wakati kadi imeacha msomaji.

Hatua ya 5: Soma Mtiririko wa Takwimu

Soma mkondo wa data

Kweli, tayari nimekuonyesha jinsi ya kusoma data, kwani ni sehemu ya Utaratibu wa Kukatiza Huduma kwa usumbufu wetu wa nje unaosumbua. Njia mbadala itakuwa kuweka bendera katika ISR, na katika kura kuu ya kitanzi bendera na soma data kwa njia hiyo, lakini naamini njia ambayo nimewasilisha ni safi. Kuwa hakimu wako mwenyewe na andika yako hata hivyo MCU yako itakubali. Hiyo ikiwa inasemwa, wacha tuendelee kutafuta jinsi ya kugundua wakati kadi inavuta Elvis na ameondoka kwenye jengo hilo.

Hatua ya 6: Gundua Kadi inayomuacha Msomaji

Gundua Kadi inayomuacha Msomaji
Gundua Kadi inayomuacha Msomaji

Gundua wakati kadi imekwenda

Hapo awali, mtu angepiga pini ya CARD_PRESENT kuona ikiwa imekwenda juu tena, lakini hatuhitaji steenkin '/ CARD_PRESENT kuchukua bandari nyingine ya I / O. Hapa ndipo nyakati hizo zinapoingia. Kila wakati kukatizwa kunapoitwa kwa sababu tumegundua ukali wa kuanguka kwa / STROBE, tunasimamisha kipima muda, futa thamani ya kipima muda na kuanza kusoma. Tunapomaliza kusoma tunaanza kipima muda tena. Rudia tambazo la tangazo, au mpaka saa ifikie thamani fulani. Hiyo inamaanisha kuwa usumbufu wa mwisho umeitwa na hakuna data zaidi iliyoingia, kwa hivyo tunafikiria kuwa ndio na tunaanza kusindika data tuliyokusanya. Kwa vipima muda, tunatumia TIMER1, yaani kipima muda cha 16-bit. Ninatumia resonator 16 Mhz nje kwa AVR yangu. Ikiwa unatumia arduino, basi labda uko pia. Kwa hivyo, nimechagua dhamana ya daktari ya 1024 ambayo inamaanisha kila mara (16, 000, 000/1024) wakati kipima muda kitaongezeka. Hiyo ni kusema, "itaweka alama" mara 15, 625 kwa sekunde. CARD_PRESENT itaenda juu kuonyesha kadi imemwacha msomaji karibu 150ms baada ya data ya mwisho. Kujua hili, niliamua tu kuangalia kila 1/4 ya sekunde. Hiyo inaweza kuangalia kitu kama hiki:

(((F_CPU) / PRESCALER) / 4) ambayo inageuka kuwa karibu 3900. Kwa hivyo, wakati kaunta ya timer TCNT1 inafikia 3900, basi najua imekuwa karibu 300ms na ninaweza kuhitimisha salama kuwa kadi imemwacha msomaji. Rahisi

#fafanua PRESCALER 1024 # fafanua 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) #fafanua ClearTimer () (TCNT1 = 0) Umeona katika ISR ambapo kipima muda kimeanza, kusimamishwa, na kusafishwa kila kukatiza. Sasa, katika kitanzi kuu tunaangalia tu ikiwa kaunta ya saa imefikia dhamira yetu, na ikiwa ni hivyo, anza usindikaji wa data

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

StopTimer (); ClearTimer (); MchakatoData (); ReadData (); idx = 0; kidogo = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Sasa ni salama kusindika data

nambari iliyofomatiwa na

Hatua ya 7: Mchakato wa Takwimu

Mchakato wa Takwimu
Mchakato wa Takwimu

Mchakato wa data

Awamu ya usindikaji inajumuisha:

  • kuangalia SS halali
  • kuangalia usawa
  • kubadilisha kuwa ASCII
  • kuangalia ES halali
  • kuangalia LRC

Hapa, sijisumbui na kuangalia usawa, kwani niliweka kidogo kuwa sifuri. Mimi pia sihesabu LRC kwa mafunzo haya madogo. Hiyo inaweza kuwa kitu ambacho firmware inayotambulika kabisa inaweza kutaka kufanya. Hapa kuna nambari ya kusindika data ikifanya hatua zilizo hapo juu (bila kutajwa hapo awali). Pata kwenye picha hapa chini. Ni maoni na pretty binafsi maelezo. Ujumbe maalum juu ya usawa na ASCII: Ninaondoa tu usawa (kidogo ya 7… yaani 1 na ziro 6 nyuma yake) na kubadilisha kutoka "data ya kadi" lazima uongeze 0x20 kwa thamani. Hiyo ni juu yake.

Hatua ya 8: Onyesha Takwimu

Onyesha Takwimu
Onyesha Takwimu
Onyesha Takwimu
Onyesha Takwimu

Onyesha data

Onyesho huenda kwenye programu ya wastaafu niliyoandika haswa kwa unganisho kwa AVR kupitia RS232 au USB. Programu inaitwa Kituo cha AVR. Njia ya ReadData () ni mbaya sana na unatiwa moyo kupata suluhisho safi kuliko ile niliyokuja nayo. Pia kuna pato la kazi katika Kituo cha AVR. Pato ni la kwanza la kadi ya bima ya afya, na ya pili ni ya kadi ya VISA. Bonyeza kwenye kona ya juu kushoto ya picha na uchague picha halisi au kubwa ili kuiona vizuri.

Hatua ya 9: Kupakua Nambari na Kufunga

Katika maelezo haya nimejadili misingi ya wasomaji wa kadi ya sumaku na kukuonyesha nambari kadhaa ili uanze mwelekeo sahihi katika kusoma data kutoka kwa kadi za sumaku. Kuna kazi zaidi ambayo inaweza kufanywa, kama kusoma na kusanifisha wimbo wa 2, kuhesabu LRC na kuhesabu usawa katika kila kaa. Nambari kamili ya chanzo inapatikana kwa kupakua hapa chini. Iliandikwa katika Studio ya AVR 4.17. Natumai ulifurahiya hii inayoweza kufundishwa na, kama kawaida, ninatarajia maoni au maoni yoyote ambayo unaweza kuwa nayo.

Ilipendekeza: