Мазмуну:

Ардуинону магниттик картты окуучуга айландырыңыз!: 9 кадам (сүрөттөр менен)
Ардуинону магниттик картты окуучуга айландырыңыз!: 9 кадам (сүрөттөр менен)

Video: Ардуинону магниттик картты окуучуга айландырыңыз!: 9 кадам (сүрөттөр менен)

Video: Ардуинону магниттик картты окуучуга айландырыңыз!: 9 кадам (сүрөттөр менен)
Video: ГЛУШИЛКА сотовых и радио,собирать которую я не РЕКОМЕНДУЮ 2024, Июль
Anonim
Ардуинону магниттик картты окуучуга айландырыңыз!
Ардуинону магниттик картты окуучуга айландырыңыз!
Ардуинону магниттик картты окуучуга айландырыңыз!
Ардуинону магниттик картты окуучуга айландырыңыз!
Ардуинону магниттик картты окуучуга айландырыңыз!
Ардуинону магниттик картты окуучуга айландырыңыз!

Менимче, ар бир адам магниттик карта окурманы колдонгон. Айтайын дегеним, бул күндөрү ким акча алып жүрөт? Сиздин колуңузга алуу да кыйын эмес, менин сүйүктүү электроника дүкөнүмө саякаттап жүргөндө, мен бул балдарга толгон урнаны таптым. Ошентип …. Албетте, мен бирин алып, үйгө алып келдим, мен муну жана AVR менен эмне кыла алаарымды.

Бул көрсөтмө сизге Magtek магниттик карта окурманы AVR же Arduino/клонго кантип туташтырууну жана картанын биринчи трегиндеги маалыматтарды окууну көрсөтөт. Отургучтарыңызды байлаңыз; магниттик карта окурмандары жогорку бит ылдамдыгына ээ!

1 -кадам: Жабдуулардын тизмеси

Жабдуулардын тизмеси
Жабдуулардын тизмеси
Жабдуулардын тизмеси
Жабдуулардын тизмеси

Бул жерде баштоо үчүн керек болгон бир нече нерселер бар.

  • Магниттик карта окугуч (Mine-бул Magetk 90mm эки баштуу окурман. $ 5.00)
  • AVR, Arduino же клон (ATmega328p ~ $ 4.30 Mouser.comдон
  • solderless нан
  • кээ бир зым
  • балким, эгер сизге ушул нерсе жагып калса, анда баш.
  • сериялык портуңузду окуу үчүн бир нерсе. Мен AVR терминалын BattleDroids.netтен колдоном

Бул баштоо үчүн керек болгон нерсенин баары. Magcard окурманына жараша, сиз өзүңүздүн окурманыңыз менен иштөө үчүн, бул көрсөтмөлөрдү жана, албетте, кодду өзгөртүүгө туура келиши мүмкүн. Бирок, мен жазган код сизди абдан алыска алып кетиши керек деп үмүттөнөм.

2-кадам: Магниттик картанын өз алдынча иштөөсү

Магниттик карталарды окугандар
Магниттик карталарды окугандар
Магниттик картаны окугандар
Магниттик картаны окугандар
Магниттик картаны окугандар
Магниттик картаны окугандар
Магниттик картаны окугандар
Магниттик картаны окугандар

Магниттик картанын окурмандары "өз алдынча иштейт", башкача айтканда, алар туташкан микроконтроллер синхрондоштура ала турган строб аттуу саатты камсыз кылат. Бул жакшылык. Бул сиз сааттын сигналын издеп, сигналды саат импульстун борборунда түзүүнүн убактысы жөнүндө тынчсыздануунун кажети жоктугун билдирет жана саат сигналынын таттуу жерине эч кандай терс таасирин тийгизбейт. Картаны сүрүү жөнүндө ойлонгондо бул мааниге ээ: ар ким ар кандай темпте, кээ бирлери жайыраак, кээ бирлери башкаларга караганда ылдамыраак сүрөт. Өзүн өзү көзөмөлдөө менин чоң апама да картты билегин сындырбай колдонуу мүмкүнчүлүгүн берет. Мага анын параметрин өзгөртүүгө туура келгенин эске салат, ал эки жолу чыкылдатуу үчүн чыкылдатуунун ортосунда канча убакыт бар экенин аныктайт ….

Бул карта окурмандын маалыматы строб линияга чыгарылганга чейин 1.0 биз үчүн жарактуу, андыктан өзүңүздү "битке" киргизүүнү кечеңдетүүдөн эч кандай кооптонуу жок. Мен колдонгон сыяктуу эки баштуу окурман үчүн, эки маалымат треги окууга жеткиликтүү. Бул китепте мен сизди баштоо үчүн биринчи тректен баштап окууну көрсөтөм. Сизге керек болгон беш байланыш бар (эгерде сиз азыраак I/O портторун колдонуу үчүн жакшыраак жөнгө салынган көзөмөлдөн баш тартпасаңыз, төртөө). Төмөндөгү сүрөттү карап көрүңүз. Кызыл зым +5В, кара зым жерге түшөт. Жашыл зым - CARD_PRESENT; сары зым /STROBE, ал эми ак зым /DATA1. Алдыга карай кыйшык сызык (/) берилиштердин тескери экенин билдирет. Төмөн сигнал (б.а. 0) бир же жогорку деп окулат. Башка туташтыргычтар күрөң /STROBE2 жана кызгылт сары /DATA2 үчүн. Биз буларды колдонбойбуз. Кааласаңыз, /CARD_PRESENT жөнүндө унутсаңыз болот. Бул маалымат линиясы болжол менен 17 баштын агымынын айлануусунан кийин картанын бар экендигин көрсөтүп турат (мисалы, кокусунан чыккан ызы -чуунун ордуна окурманыңыз жалган маалыматтарды жөнөтөт) жана сиз алган маалыматтар карта маалыматы экендигин ырастоо үчүн колдонулат. таштанды эмес. Сиз маалымат агымында баштоо күзөтүн текшерсеңиз, бул байланышты өткөрүп жибере аласыз. Бул тууралуу кийинчерээк. Төмөндө көрүнүп тургандай, мен нан тактасына туташкан туура бурчтуу эркек башын колдонуп, окурманымды ошого туташтырдым. Мен PIND2ге /STROBE туташтырдым (Arduinoдогу санарип 2), /CARD_PRESENT PIND3кө (сүрөттөө максатында) жана /DATA1 менен PIND4. Пиндериңиздин калкып кетпеши үчүн, бул казыктарда тартууну иштеткениңизди текшериңиз. Мен дагы Arduinoмду Bare Bones AVR менен алмаштырдым, анткени анын нанга такташын жактырам.

3 -кадам: Магниттик картанын негиздери

Магниттик картанын негиздери
Магниттик картанын негиздери

Магниттик картаны окуу үчүн эмне кылышыңыз керек болгон негизги функциялар: 1. Картаны серпкенди аныктоо 2. Маалымат агымын окуу 3. Карт качан кеткенин аныктоо 4. Дайындарды иштетүү 5. Дисплейди көрсөтүү маалыматтар Биринчиден, мен сизди өз кодуңузду жаза баштаганда билишиңиз керек болгон магниттик картанын негиздери менен тааныштырам.

Магниттик картанын стандарттары

Магниттик карталар ISO тарабынан төмөнкү документтерде стандартташтырылган: 7810 Кредиттик карта өлчөмүндөгү документтин физикалык мүнөздөмөсү 7811-1 Эмпоссия 7811-2 Магниттик тилке-төмөн мажбурлоо 7811-3 Эмпоссивдүү белгилердин жайгашуусу 7811-4 Тректердин жайгашуусу 1 & 2 7811- 5 тректин жайгашкан жери 3 7811-6 Магниттик тилке - жогорку мажбурлоо 7813 Финансылык транзакция карталары Көрүнүп тургандай, финансылык карталар өзүнчө документте көрсөтүлгөн жана көбүнчө сиздин азык -түлүк картаңызга же эл аралык сүйлөшүү картаңызга караганда башка форматтарга ээ. Сиз бул айырмачылыктарды программалашыңыз керек болот. Менде жөн эле насыя картасы жана камсыздандыруу картасы бар болчу, ошондуктан мен бул түрлөрдү программаладым (экөө тең В форматында болот).

Карта форматтары

Магниттик карталар үчүн бир нече форматтар бар. А жана В форматтары кеңири таралган, В мен көргөн эң кеңири таралган формат жана бул коддо колдоого алынган. C аркылуу M форматтары ISO тарабынан корголгон, мен ишенем, ал эми N аркылуу ?? институционалдык колдонууга корголгон. Track 1 Финансылык карталар үчүн, биринчи трек дюймга 210 биттен жазылат жана жогорудагы картанын биринчи 0.110 "болуп саналат. Маалыматтар" карта маалыматы "катары 7 битке чейин коддолгон. Бул 6 бит үчүн тамга жана паритет үчүн бир аз. 1 -жолдо ~ 79 тамга -сандык белгилер бар. Физикалык тартип артка. Башкача айтканда, маалыматтар картада артка жазылган (жана демек, сиздин программаңыз тарабынан окулат) катары. паритет кызыктай. Картанын маалымат форматы мындай көрүнөт:

[SS] [FC] [Негизги эсеп #] [FS] [Аты] [FS] [Кошумча маалыматтар] [FS] [ES] [LRC] мында:

SS Баштоочу күзөтчү FC Формат коду FS Талаа бөлгүч ES End күзөтчү LRC Узунунан ашыкча текшерүү Белги Бир SS = '%', FC = тректердин бири (көбүнчө B болот), FS көбүнчө '', ES '?' жана LRC белгиси көбүнчө '<', бирок ал стандарттарда көрсөтүлгөн эмес. Картага артка жазылгандан тышкары, маалыматтын так паритети бар жана ASCIIден 0x20. Биз маалыматты иштеткенде муну чечебиз. 2-трек Экинчи трек 0,110 дюймда жана 0.110 картанын үстүнөн башталат. Анын жазуу тыгыздыгы дюймда 75 битти түзөт. Берилиштер 5 битти түзөт жана болжол менен 40 сандык белгиден турат. Эч кандай жолуктурбоо керек тамгалар ушул жолдо. Картанын маалымат форматы ушул структурага ылайык келиши керек

[SS] [негизги эсеп #] [FS] [кошумча маалыматтар | дискрециялык маалыматтар] [ES] [LRC]

Экинчи трек үчүн SS чекит чекит: ';' жана ФС '=' Бул ыйык билим менен, жогоруда көрсөтүлгөн процедураны аткарган кодду көрүү үчүн кийинки кадамдарга өтүңүз.

4 -кадам: Карта сүрүлгөндө аныктоо

Карта сүрүлгөндө аныктоо
Карта сүрүлгөндө аныктоо

1. Карт качан формалдуу түрдө сүрүлгөнүн аныктаңыз, анын төмөн түшүп кеткенин билүү үчүн /CARD_PRESENT пин текшерилет. Бактыга жараша, бул чынында эле керек эмес. Жарактуу картаны кийинчерээк текшеребиз. Же болбосо, сиз строб пинге ок тийгизгенин көрүү үчүн окуй аласыз, бирок бул сизге көп нөлдүк нөлдөрдү киргизет. Окурман болжол менен 60-70 алдынкы нөлдөрдү жөнөтүп, маалыматтын бериле тургандыгын кабарлайт. Бирок, биз биттерди жазууну качан баштоо керек экенин аныктоо үчүн экилик маалыматтардын табиятын колдонобуз. Биринчи тректи баштоо күзөтчүсү (SS) - пайыз белгиси (%). Анын бинардык мааниси 0010 0101, демек ал 1010 001 катары сакталат (жана окулат) (бул 7-бит, ошондуктан 8-бит берилбейт). Эми, кыраакы окурман, маалыматтар артта болсо да, экилик ASCII маанисине дал келбей турганын байкайт. Себеби ал он алтылыктан 0x20 өчүрүлгөн. % Белгиси 0x25 жана 0100 0101 - 0x05. Картанын маалыматы 0x20 маанисинен алынып салынды. Бийик тешикте илинип турган нерсе - бул кызыктай паритет. Бул жерде "1" деген так сан болушу үчүн коюлган. Ошентип, биз жарактуу карта ар дайым ушул баштоочу көзөмөлдөн башталаарын билебиз жана паритеттин бит 1 болгондугуна байланыштуу, биз маалымат пининде биринчи ЖОГОРУдан ТӨМӨН өтүүнү аныктаганда, биз жаңы эле ала баштаганыбызды билебиз. карточкадан күзөт баштоо. Эми, бул дайыма эле туура боло бербейт, жана акылсыз план /CARD_PRESENT картасын текшерип, анын LOW аз кеткенин текшерүү болмок. ССтин башталышын аныктоонун эң оңой жолу - бул /STROBEнун түшүп жаткан четинде тышкы үзгүлтүктү түзүү. Маалыматтар жыгылып кете электе эле бизде 1.0 жарактуу, андыктан сиз жыгылып жаткан четинен үлгү алсаңыз, анда /DATA1 пинин окуп, жарактуу мааниге ээ боло алаарыңызды билесиз. Тышкы үзүлүүңүздүн кулап бараткан четинде жаратылган коду.

voidInitInterrupt (void) {// Орнотуу үзгүлтүккө учуратуу BSET (EIMSK, INT0); // тышкы үзгүлтүк маскасы BSET (EICRA, ISC01); // түшүп жаткан BCLR (EICRA, ISC00); // түшүп жаткан BSET (SREG, 7); // I-bit in SREG}

Менин бардык программаларыма кошулган менин common.hимде BSET жана BCLRдин аныктамаларын тапса болот. Битти кантип орнотуу боюнча кандайдыр бир суроолор болсо, ошол файлга кайрылыңыз. Эми, үзгүлтүккө учураганда, биз /DATA1 үлгүсүн (менин кодумда CARD_DATA деп аныкталган) тандап, жалпы максаттуу IO реестрине бир аз орнотууну каалайбыз. Эгерде биз 7 -битке ээ болсок, регистрди глобалдык буферибиздеги каарман катары сактап коюңуз. Мен GPIOR0 каттоосун колдоном, анткени бул тез жетүү. Псевдо коду мындай:

16-бит таймерди токтотуңуз Таймерди тазалоо DATA LOW болсо BIT = 1 КАТТООДУ азайтуу BIT тууну коюңуз, андыктан биз мындан ары 0'лерди өткөрүп жибербейбиз DATA-HIGH Set BIT = 0-REGISTER Decrement BIT, эгер BIT 0 болсо буферге байт кошуу Көбөйтүү индекси BITти баштапкы абалга келтирүү

Эгерде сиз өзүңүзгө эмне үчүн көбөйтүүнүн ордуна азайтууну сурап жатсаңыз, анда маалыматтар артта экенин унутпаңыз, андыктан биттерди LSBден MSBге алуунун ордуна биз MSBден LSBге сактап калабыз, андыктан битти артка кайтаруунун кажети жок. кийинчерээк маалыматтарды иштетүүдө. Эгерде сиз чын эле кааласаңыз, бул жерге 0x20 он алтылыкты кошсоңуз болот, бирок бул стробдордо болжол менен 5ус болгондуктан, мен бул үзгүлтүккө учураган кызмат тартибинде иштетүүнү минимумга чейин сактап жатам.

ISR (INT0_vect) {StopTimer (); ClearTimer (); эгер (! BCHK (PIND, CARD_DATA1)) // тескери төмөн = 1 {BSET (GPIOR0, бит); --bit; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bit); --bit; } эгер (бит <0) {buff [idx] = (char) GPIOR0; ++ idx; бит = 6; } StartTimer ();} Эгерде сиз убакыт бизнеси жөнүндө эмне деп ойлоп жатсаңыз, бул картанын окурмандан качан кеткенин аныктоо кадамында камтылган.

5 -кадам: Маалымат агымын окуу

Маалымат агымын окуу

Ооба, мен сизге маалыматты кантип окуу керектигин көрсөткөм, анткени ал тышкы үзгүлтүккө учуроо үчүн үзгүлтүккө учуроо сервисинин бир бөлүгү. Альтернативалуу ыкма - ISRде желек орнотуу жана негизги укурукта желекти сурамжылоо жана маалыматтарды ушундай жол менен окуу, бирок мен аны сунуштаган жол таза деп эсептейм. Өзүңүздүн сотуңуз болуңуз жана өзүңүздүкүн жазыңыз, бирок MCU уруксат берет. Бирок, карта Элвисти тартып, имаратты таштап кеткенде кантип аныктоого болорун карап көрөлү.

6 -кадам: Окурмандан чыккан картаны аныктоо

Окурмандан чыккан картаны аныктаңыз
Окурмандан чыккан картаны аныктаңыз

Карт качан кеткенин аныктаңыз

Формалдуу түрдө, /CARD_PRESENT пини кайра жогору болуп кеткенин билиш үчүн үлгү алмак, бирок бизге башка I /O портун алуу үчүн steenkin ' /CARD_PRESENT кереги жок. Бул жерде ошол таймерлер кирет. Үзгүлтүк качан чакырылган сайын, анткени биз /STROBE жыгылып жаткандыгын аныктадык, биз таймерди токтотобуз, таймердин маанисин тазалап, окуй баштайбыз. Биз окуп бүткөндөн кийин таймерди кайра баштайбыз. Жарнамалык кусууну же таймер белгилүү бир мааниге жеткенге чейин кайталаңыз. Бул акыркы үзгүлтүк чакырылганын жана башка маалымат келбегендигин билдирет, андыктан биз ушуну ойлоп, чогулткан маалыматтарды иштете баштайбыз. Таймерлер үчүн биз TIMER1ди колдонобуз, башкача айтканда 16 разряддуу таймер. Мен AVR үчүн сырттан 16 MHz резонаторун колдонуп жатам. Эгерде сиз ардуино колдонуп жатсаңыз, анда сиз да ошондой болсоңуз керек. Ошентип, мен 1024 деген алдын ала эсептөөчү маанини тандадым, бул таймердин ар бир (16, 000, 000 /1024) жолу көбөйөрүн билдирет. Башкача айтканда, ал секундасына 15, 625 жолу "белгисин" коет. /CARD_PRESENT карта акыркы маалымат битинен кийин окурманды 150 мс калтырып кеткенин көрсөтүп, ЖОГОРУ болот. Муну билип туруп, мен ар бир 1/4 секундасын текшерүүнү чечтим. Бул мындай көрүнөт:

(((F_CPU) / PRESCALER) / 4) Бул болжол менен 3900. Ошентип, таймер TCNT1 3900гө жеткенде, мен болжол менен 300 мс болгонун билем жана мен картаны окурманды таштап кетти деп ишенимдүү түрдө жыйынтыктай алам. Оңой

#define PRESCALER 1024#CHECK_TIME ((F_CPU / PRESCALER) / 4) // 250 ms#аныктоо StartTimer () BSET (TCCR1B, CS10), BSET (TCCR1B, CS12) // 1024 prescaler#аныктоо StopTimer () BCLR (TCCR1), CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) Сиз ISRде таймердин башталганын, токтогонун жана ар бир үзгүлтүктө тазаланганын көрдүңүз. Эми, негизги укурукта, биз жөн гана таймер эсептегич биздин максаттуу мааниге жеткенин текшеребиз, эгер андай болсо, маалыматтарды иштетүүнү баштайбыз.

үчүн (;;) {if (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; бит = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Эми бул маалыматтарды иштетүү коопсуз

код https://manoli.net/csharpformat/ тарабынан форматталган

7 -кадам: маалыматтарды иштетүү

Маалыматтарды иштетүү
Маалыматтарды иштетүү

Маалыматтарды иштетүү

Кайра иштетүү фазасы төмөнкүлөрдөн турат:

  • жарактуу SS үчүн текшерүү
  • паритетин текшерүү
  • ASCIIге айландыруу
  • жарактуу ES үчүн текшерүү
  • LRC текшерүү

Бул жерде мен паритетти текшерүү менен убара болбойм, анткени мен бул битти нөлгө койдум. Мен дагы бул кичинекей окуу куралы үчүн LRCди эсептебейм. Бул толугу менен ишке ашкан программалык камсыздоону жасоону каалаган нерсе болмок. Бул жерде жогоруда көрсөтүлгөн кадамдарды жасоочу маалыматтарды иштетүү коду бар (буга чейин айтылган эмес). Аны төмөнкү сүрөттөн табыңыз. Бул комментарийленген жана өзүн-өзү түшүндүрүүчү. Паритет жана ASCII боюнча атайын эскертүү: Мен жөн гана паритеттик битти тазалайм (7 -бит … башкача айтканда, артында 6 нөлү бар 1) жана "карта маалыматынан" айландыруу үчүн, мааниге 0x20 кошуу керек. Бул жөнүндө.

8 -кадам: маалыматтарды көрсөтүү

Маалыматтарды көрсөтүү
Маалыматтарды көрсөтүү
Маалыматтарды көрсөтүү
Маалыматтарды көрсөтүү

Дайындарды көрсөтүү

Дисплей мен RS232 же USB аркылуу AVRга туташуу үчүн атайын жазган терминалдык программага барат. Программа AVR терминалы деп аталат. ReadData () ыкмасы абдан начар жана сиз мен ойлогондон да таза чечимди табууга үндөйсүз. AVR терминалында функциянын чыгышы дагы бар. Биринчиси медициналык камсыздандыруу картасы, экинчиси VISA картасы. Сүрөттүн жогорку сол бурчундагы чыкылдатып, аны жакшыраак көрүү үчүн оригиналдуу же чоң сүрөттү тандаңыз.

9 -кадам: Кодду жүктөө жана жыйынтыктоо

Бул көрсөтмөдө мен магниттик карта окурмандарынын кээ бир негиздерин талкууладым жана магниттик карталардагы маалыматтарды окууну туура багытта баштоо үчүн кээ бир коддорду көрсөттүм. 2 -тректи окуу жана декоддоо, LRC эсептөө жана ар бир байт боюнча так паритетти эсептөө сыяктуу дагы көп иштер бар. Толук булак коду төмөндө жүктөө үчүн жеткиликтүү. Бул AVR Studio 4.17де жазылган. Мен сизге бул үйрөткүч жакты деп үмүттөнөм жана ар дайымкыдай эле, сизде болушу мүмкүн болгон комментарийлерди же сунуштарды күтөм.

Сунушталууда: