Πίνακας περιεχομένων:

Μετατρέψτε το Arduino σας σε έναν αναγνώστη μαγνητικών καρτών!: 9 βήματα (με εικόνες)
Μετατρέψτε το Arduino σας σε έναν αναγνώστη μαγνητικών καρτών!: 9 βήματα (με εικόνες)

Βίντεο: Μετατρέψτε το Arduino σας σε έναν αναγνώστη μαγνητικών καρτών!: 9 βήματα (με εικόνες)

Βίντεο: Μετατρέψτε το Arduino σας σε έναν αναγνώστη μαγνητικών καρτών!: 9 βήματα (με εικόνες)
Βίντεο: Ηλεκτρισμός | Το Arduino ως βολτόμετρο 2024, Ιούλιος
Anonim
Μετατρέψτε το Arduino σας σε μαγνητικό αναγνώστη καρτών!
Μετατρέψτε το Arduino σας σε μαγνητικό αναγνώστη καρτών!
Μετατρέψτε το Arduino σε μαγνητικό αναγνώστη καρτών!
Μετατρέψτε το Arduino σε μαγνητικό αναγνώστη καρτών!
Μετατρέψτε το Arduino σε μαγνητικό αναγνώστη καρτών!
Μετατρέψτε το Arduino σε μαγνητικό αναγνώστη καρτών!

Όλοι έχουν χρησιμοποιήσει έναν μαγνητικό αναγνώστη καρτών, πιστεύω. Θέλω να πω, ποιος μεταφέρει μετρητά αυτές τις μέρες; Ούτε είναι δύσκολο να τα πιάσεις στα χέρια σου, και κατά τη διάρκεια ενός ταξιδιού στο αγαπημένο μου τοπικό κατάστημα ηλεκτρονικών ειδών, βρήκα έναν κάδο γεμάτο από αυτούς τους τύπους. Λοιπόν … φυσικά, πήρα ένα και το έφερα σπίτι για να δω τι είδους πράγματα θα μπορούσα να κάνω με αυτό και ένα AVR.

Αυτό το διδακτικό θα σας δείξει πώς να συνδέσετε έναν αναγνώστη μαγνητικής κάρτας Magtek σε AVR ή Arduino/κλώνο και να διαβάσετε δεδομένα από το πρώτο κομμάτι της κάρτας. Λυγίστε τις θέσεις σας. οι συσκευές ανάγνωσης μαγνητικών καρτών έχουν υψηλό ρυθμό μετάδοσης bit!

Βήμα 1: Η λίστα εξοπλισμού

Η λίστα εξοπλισμού
Η λίστα εξοπλισμού
Η λίστα εξοπλισμού
Η λίστα εξοπλισμού

Εδώ είναι μερικά πράγματα που θα χρειαστείτε για να ξεκινήσετε.

  • Μαγνητικός αναγνώστης καρτών (Το δικό μου είναι ένας αναγνώστης διπλής κεφαλής Magetk 90mm. 5,00 $)
  • AVR, Arduino ή κλώνος (ATmega328p 4. 4,30 $ από το Mouser.com
  • ψωμί χωρίς κόλληση
  • λίγο σύρμα
  • ίσως μια κεφαλίδα αν σας αρέσει αυτό το είδος.
  • κάτι για να διαβάσετε τη σειριακή σας θύρα. Χρησιμοποιώ τερματικό AVR από το BattleDroids.net

Αυτό είναι το μόνο που χρειάζεστε για να ξεκινήσετε. Ανάλογα με το πρόγραμμα ανάγνωσης καρτών που καταλήγετε, ίσως χρειαστεί να τροποποιήσετε αυτές τις οδηγίες, και πιο σίγουρα τον κώδικα, για να συνεργαστείτε με τον συγκεκριμένο αναγνώστη σας. Ωστόσο, ελπίζω ότι ο κώδικας που έχω γράψει θα σας πάει πολύ μακριά.

Βήμα 2: Μαγνητικοί αναγνώστες καρτών με αυτόματο ρολόι

Μηχανισμοί ανάγνωσης μαγνητικών καρτών
Μηχανισμοί ανάγνωσης μαγνητικών καρτών
Μηχανισμοί ανάγνωσης μαγνητικών καρτών
Μηχανισμοί ανάγνωσης μαγνητικών καρτών
Μηχανισμοί ανάγνωσης μαγνητικών καρτών
Μηχανισμοί ανάγνωσης μαγνητικών καρτών
Μηχανισμοί ανάγνωσης μαγνητικών καρτών
Μηχανισμοί ανάγνωσης μαγνητικών καρτών

Οι συσκευές ανάγνωσης μαγνητικών καρτών είναι "αυτοχρονισμένες", πράγμα που σημαίνει ότι παρέχουν ένα ρολόι που ονομάζεται στροβοσκόπιο, έναντι του οποίου ο συνδεδεμένος μικροελεγκτής μπορεί να συγχρονιστεί. Αυτό είναι ένα όφελος. Αυτό σημαίνει ότι δεν χρειάζεται να ανησυχείτε αν ψάχνετε για ένα σήμα χρονομέτρησης και για το χρονισμό του σήματος στο κέντρο απευθείας στον παλμό του ρολογιού, και δεν ενοχλείται να ταλαντεύεται στο γλυκό σημείο του σήματος ρολογιού. Αυτό έχει νόημα όταν σκέφτεστε τα χτυπήματα καρτών: όλοι σκουπίζουν με διαφορετικό ρυθμό, άλλοι πιο αργά, άλλοι πιο γρήγορα από άλλους. Ο αυτοχρονισμός επιτρέπει ακόμη και στη γλυκιά γιαγιά μου τη δυνατότητα να χρησιμοποιήσει την κάρτα της χωρίς να σπάσει τον καρπό της. Μου θυμίζει ότι πρέπει να αλλάξω τη ρύθμιση για αυτήν που καθορίζει πόσο χρόνο ισχύει μεταξύ των κλικ για την καταχώριση διπλού κλικ….

Τα δεδομένα αυτού του αναγνώστη καρτών ισχύουν 1,0 εμάς πριν από την τοποθέτηση του στροβοσκοπίου στη γραμμή, οπότε μην ανησυχείτε αν καθυστερήσετε να μπείτε στον "χρόνο bit". Για έναν αναγνώστη διπλής κεφαλής, όπως αυτόν που χρησιμοποιώ, υπάρχουν δύο κομμάτια δεδομένων διαθέσιμα για ανάγνωση. Σε αυτό το "ible", θα δείξω την ανάγνωση από το πρώτο κύριο κομμάτι για να ξεκινήσετε. Υπάρχουν πέντε συνδέσεις που θα χρειαστεί να πραγματοποιήσετε (τέσσερις εάν δεν σας πειράζει να εγκαταλείψετε τον καλύτερο ρυθμισμένο έλεγχο για λιγότερες θύρες εισόδου/εξόδου που χρησιμοποιούνται). Δείτε την παρακάτω εικόνα. Το κόκκινο σύρμα πηγαίνει στα +5V ενώ το μαύρο καλώδιο στη γείωση. Το πράσινο σύρμα είναι /CARD_PRESENT. το κίτρινο σύρμα είναι /STROBE και το λευκό σύρμα είναι /DATA1. Η μπροστινή κάθετο (/) σημαίνει ότι τα δεδομένα είναι ανεστραμμένα. Ένα χαμηλό σήμα (δηλ. 0) διαβάζεται ως ένα ή υψηλό. Οι άλλοι σύνδεσμοι είναι καφέ για /STROBE2 και πορτοκαλί για /DATA2. Δεν θα τα χρησιμοποιήσουμε αυτά. Εάν θέλετε, μπορείτε να ξεχάσετε το /CARD_PRESENT. Αυτή η γραμμή δεδομένων χαμηλώνει μετά από περίπου 17 περιστροφές ροής κεφαλής για να υποδείξει ότι υπάρχει μια κάρτα (αντί, ας πούμε, τυχαίος θόρυβος που προκαλεί την αποστολή ψευδών δεδομένων από τον αναγνώστη σας) και χρησιμοποιείται για την επικύρωση ότι τα δεδομένα που λαμβάνετε είναι δεδομένα κάρτας και όχι σκουπίδια. Μπορείτε να παραλείψετε αυτήν τη σύνδεση εάν ελέγξετε για την αρχή φύλαξης στη ροή δεδομένων. Περισσότερα για αυτό αργότερα. Όπως μπορείτε να δείτε παρακάτω, χρησιμοποίησα μια αρσενική κεφαλίδα ορθής γωνίας συνδεδεμένη σε έναν πίνακα ψωμιού και συνέδεσα τον αναγνώστη μου σε αυτό. Συνδέθηκα /STROBE με PIND2 (ψηφιακό pin 2 σε Arduino), /CARD_PRESENT με PIND3 (για λόγους απεικόνισης) και /DATA1 με PIND4. Βεβαιωθείτε ότι έχετε ενεργοποιήσει τα pullups σε αυτές τις καρφίτσες, ώστε οι καρφίτσες σας να μην επιπλέουν. Αντάλλαξα επίσης το Arduino μου για ένα Bare Bones AVR επειδή μου αρέσει ο τρόπος που ταιριάζει στο breadboard.

Βήμα 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 bits ανά ίντσα και είναι το πρώτο 0,110 "της κάρτας από την κορυφή. Τα δεδομένα κωδικοποιούνται ως" δεδομένα κάρτας "ως 7-bit ανά χαρακτήρα. Αυτά είναι 6-bit για ο χαρακτήρας και λίγο για την ισοτιμία. Υπάρχουν ~ 79 αλφαριθμητικοί χαρακτήρες σε τροχιά 1. Η φυσική ταξινόμηση είναι αντίστροφη. Δηλαδή, τα δεδομένα είναι αλλά γράφονται αντίστροφα στην κάρτα (και ως εκ τούτου, θα διαβαστούν από το υλικολογισμικό σας) ως. Το η ισοτιμία είναι περίεργη. Η μορφή δεδομένων της κάρτας μοιάζει με αυτήν:

[SS] [FC] [Κύριος λογαριασμός #] [FS] [Όνομα] [FS] [Πρόσθετα δεδομένα] [FS] [ES] [LRC] όπου:

SS Έναρξη φύλακα FC Μορφή κωδικού FS Διαχωριστής πεδίου ES Τέλος φύλακας LRC Διαχρονικός πλεονασμός Έλεγχος χαρακτήρα Παρακολούθηση ενός SS = '%', FC = μία από τις μορφές (θα είναι B πολλές φορές), το FS είναι συχνά '', το ES είναι '?' και ο χαρακτήρας LRC είναι συνήθως '<' αν και δεν καθορίζεται στα πρότυπα. Εκτός από την εγγραφή στην κάρτα προς τα πίσω, τα δεδομένα έχουν ένα περιττό bit ισοτιμίας και είναι 0x20 από το ASCII. Θα το χειριστούμε όταν επεξεργαζόμαστε τα δεδομένα. Track 2 Το κομμάτι δύο έχει πλάτος 0.110 "και ξεκινά 0.110 από το επάνω μέρος της κάρτας. Η πυκνότητα εγγραφής του είναι 75 bit ανά ίντσα. Τα δεδομένα είναι 5 bit ανά χαρακτήρα και αποτελούνται από περίπου 40 αριθμητικά σύμβολα. Δεν πρέπει να συναντήσετε κανένα γράμματα σε αυτό το κομμάτι. Η μορφή δεδομένων της κάρτας πρέπει να ακολουθεί αυτήν τη δομή

[SS] [κύριος λογαριασμός #] [FS] [πρόσθετα δεδομένα | διακριτικά στοιχεία] [ES] [LRC]

Το SS για το κομμάτι δύο είναι το ερωτηματικό: ';' και το FS είναι '=' Με αυτήν την άγια γνώση κάτω από τη ζώνη σας, συνεχίστε στα επόμενα βήματα για να δείτε τον κώδικα που εφαρμόζει τη διαδικασία που περιγράφεται παραπάνω.

Βήμα 4: Εντοπίστε πότε σύρετε μια κάρτα

Ανίχνευση πότε σύρετε μια κάρτα
Ανίχνευση πότε σύρετε μια κάρτα

1. Ανιχνεύστε πότε μια κάρτα έχει μεταφερθεί τυπικά, κάποιος θα ελέγξει την καρφίτσα /CARD_PRESENT για να δει αν έχει πέσει χαμηλά. Ευτυχώς, αυτό δεν είναι απαραίτητο. Θα ελέγξουμε για έγκυρη κάρτα αργότερα. Εναλλακτικά, μπορείτε να διαβάσετε την καρφίτσα του στροβοσκοπίου σας για να δείτε πότε έχουν τοποθετηθεί στροβοσκόπια στον πείρο, ωστόσο, αυτό θα σας αποφέρει πολλά μηδενικά. Ο αναγνώστης θα στείλει περίπου 60-70 μηδενικά για να σας ενημερώσει ότι πρόκειται να παρουσιαστούν δεδομένα. Ωστόσο, θα χρησιμοποιήσουμε τη φύση των δυαδικών δεδομένων για να καθορίσουμε πότε θα ξεκινήσει η εγγραφή δυαδικών ψηφίων. Το φύλακα έναρξης (SS) για το πρώτο κομμάτι είναι το σύμβολο ποσοστού (%). Η δυαδική τιμή είναι 0010 0101 που σημαίνει ότι θα αποθηκευτεί (και θα διαβαστεί) ως 1010 001 (είναι 7-bit οπότε το 8ο bit δεν μεταδίδεται). Τώρα, ο έξυπνος αναγνώστης θα παρατηρήσει ότι παρόλο που τα δεδομένα είναι αντίστροφα, δεν ταιριάζει με την δυαδική τιμή ASCII. Αυτό συμβαίνει επειδή είναι 0x20 μακριά από εξάγωνο. Το σύμβολο % είναι 0x25 και το 0100 0101 είναι 0x05. Τα δεδομένα της κάρτας αφαιρούνται 0x20 από την τιμή. Αυτό που περνάει εκεί στο ψηλό τσίμπημα είναι το παράξενο κομμάτι ισοτιμίας. Τοποθετείται έτσι ώστε να υπάρχει μονός αριθμός "1" στην τιμή. Επομένως, επειδή γνωρίζουμε ότι μια έγκυρη κάρτα θα ξεκινά πάντα με αυτό το φύλακα εκκίνησης και επειδή το bit ισοτιμίας είναι 1, τότε όταν εντοπίσουμε την πρώτη μετάβαση HIGH σε LOW στο pin δεδομένων, τότε γνωρίζουμε ότι μόλις αρχίσαμε να λαμβάνουμε το ξεκινήστε το φύλακα από μια κάρτα. Τώρα, αυτό δεν θα είναι πάντα αληθινό και ένα ανόητο σχέδιο θα ήταν να ελέγξετε την κάρτα /CARD_PRESENT για να δείτε αν έχει χαθεί επιπλέον. Ο απλούστερος τρόπος για να εντοπίσετε την έναρξη του SS, είναι να δημιουργήσετε μια εξωτερική διακοπή που ενεργοποιείται στην πτώση του άκρου του /STROBE. Τα δεδομένα ισχύουν 1,0 εμάς πριν από την πτώση του άκρου, οπότε όταν έχετε δειγματοληπτικό δείγμα της πτώσης, γνωρίζετε ότι μπορείτε να διαβάσετε την ακίδα /DATA1 και να λάβετε μια έγκυρη τιμή. Ακολουθεί ο κώδικας για τη δημιουργία της εξωτερικής σας διακοπής που ενεργοποιείται σε μια άκρη που πέφτει.

voidInitInterrupt (άκυρο) {// Διακοπή εγκατάστασης BSET (EIMSK, INT0); // εξωτερική μάσκα διακοπών BSET (EICRA, ISC01); // άκρη πτώσης BCLR (EICRA, ISC00). // άκρη πτώσης BSET (SREG, 7); // I-bit στο SREG}

Στο common.h που συμπεριλαμβάνω σε όλα μου τα προγράμματα, μπορούν να βρεθούν οι ορισμοί του BSET και του BCLR. Ανατρέξτε σε αυτό το αρχείο εάν έχετε οποιεσδήποτε ερωτήσεις σχετικά με τον τρόπο ρύθμισης bit. Τώρα, όταν ενεργοποιηθεί η διακοπή, θέλουμε να δοκιμάσουμε το /DATA1 (στον κωδικό μου που ορίζεται ως CARD_DATA) και να το ορίσουμε σε ένα μητρώο IO γενικού σκοπού. Εάν βρισκόμαστε στο 7ο bit, αποθηκεύστε τον καταχωρητή ως χαρακτήρα στο παγκόσμιο buffer. Χρησιμοποιώ ένα μητρώο GPIOR0 επειδή έχει γρήγορη πρόσβαση. Ο ψευδοκώδικας είναι κάπως έτσι:

Διακοπή χρονοδιακόπτη 16-bit Εκκαθάριση χρονοδιακόπτη Εάν τα δεδομένα είναι ΧΑΜΗΛΑ Ρύθμιση BIT = 1 στο REGISTER Decrement BIT Ορίστε τη σημαία, ώστε να μην παραλείψουμε άλλα 0 Δεδομένα είναι HIGH Set BIT = 0 στο REGISTER Decrement BIT Εάν το BIT είναι 0 Προσθέστε byte στο buffer Δείκτης αύξησης Επαναφορά BIT

Εάν αναρωτιέστε γιατί μειώνετε αντί να αυξάνετε, θυμηθείτε ότι τα δεδομένα είναι αντίστροφα, οπότε αντί να καταγράφουμε τα bits καθώς τα παίρνουμε από LSB σε MSB, τα αποθηκεύουμε από MSB σε LSB, ώστε να μην χρειάζεται να αντιστρέψουμε τα bits αργότερα κατά την επεξεργασία των δεδομένων. Αν πραγματικά το θέλατε, μπορείτε επίσης να προσθέσετε 0x20 εξάγωνο εδώ, αλλά επειδή είναι περίπου 5 σε αυτούς τους στροβοσκόπους, διατηρώ την επεξεργασία σε αυτήν τη ρουτίνα υπηρεσίας διακοπής στο ελάχιστο.

ISR (INT0_vect) {StopTimer (); ClearTimer (); εάν (! BCHK (PIND, CARD_DATA1)) // αντίστροφα χαμηλό = 1 {BSET (GPIOR0, bit); --κομμάτι; bDataPresent = 1; } else if (bDataPresent) {BCLR (GPIOR0, bit); --κομμάτι; } if (bit <0) {buff [idx] = (char) GPIOR0; ++ idx; bit = 6; } StartTimer ();} Αν αναρωτιέστε ποια είναι η επιχείρηση χρονομέτρησης, αυτό περιλαμβάνεται στο βήμα για τον προσδιορισμό πότε η κάρτα έφυγε από τον αναγνώστη.

Βήμα 5: Διαβάστε τη ροή δεδομένων

Διαβάστε τη ροή δεδομένων

Λοιπόν, σας έχω ήδη δείξει πώς να διαβάζετε τα δεδομένα, καθώς είναι μέρος της ρουτίνας υπηρεσίας διακοπής για την εξωτερική διακοπή που πέφτει. Μια εναλλακτική μέθοδος θα ήταν να ορίσετε μια σημαία στο ISR και στον κύριο βρόχο να κάνετε δημοσκόπηση της σημαίας και να διαβάσετε τα δεδομένα με αυτόν τον τρόπο, αλλά πιστεύω ότι ο τρόπος που την παρουσίασα είναι καθαρότερος. Γίνετε ο κριτής του εαυτού σας και γράψτε τον δικό σας, όπως σας το επιτρέπει το MCU. Τούτου λεχθέντος, ας προχωρήσουμε στην αναζήτηση του τρόπου ανίχνευσης όταν η κάρτα τραβά έναν Έλβις και έχει φύγει από το κτίριο.

Βήμα 6: Εντοπίστε την κάρτα που φεύγει από τον αναγνώστη

Εντοπίστε την κάρτα που φεύγει από τον αναγνώστη
Εντοπίστε την κάρτα που φεύγει από τον αναγνώστη

Εντοπίστε πότε έχει φύγει μια κάρτα

Επισήμως, κάποιος θα δειγματίσει τον ακροδέκτη /CARD_PRESENT για να διαπιστώσει εάν έχει ανέβει ξανά Υ HIGHΗΛΑ, αλλά δεν χρειαζόμαστε να βελτιώσουμε το /CARD_PRESENT με άλλη θύρα εισόδου /εξόδου. Εδώ μπαίνουν αυτά τα χρονόμετρα. Κάθε φορά που καλείται η διακοπή επειδή εντοπίσαμε πτώση στο /STROBE, σταματάμε ένα χρονόμετρο, καθαρίζουμε την τιμή του χρονοδιακόπτη και ξεκινάμε την ανάγνωση. Όταν τελειώσουμε την ανάγνωση ξεκινάμε ξανά το χρονόμετρο. Επαναλάβετε τη ναυτία διαφημίσεων ή μέχρι το χρονόμετρο να φτάσει σε μια ορισμένη τιμή. Αυτό σημαίνει ότι η τελευταία διακοπή έχει κληθεί και δεν έχουν εισέλθει άλλα δεδομένα, οπότε υποθέτουμε ότι είναι αυτό και ξεκινάμε την επεξεργασία των δεδομένων που έχουμε συλλέξει. Για τα χρονόμετρα, χρησιμοποιούμε το TIMER1, δηλαδή το χρονόμετρο 16-bit. Χρησιμοποιώ εξωτερικά έναν αντηχείο 16 Mhz στο AVR μου. Εάν χρησιμοποιείτε arduino, τότε πιθανότατα χρησιμοποιείτε και εσείς. Επομένως, επέλεξα μια τιμή προκαταβολής 1024 που σημαίνει κάθε (16, 000, 000 /1024) φορές που θα αυξάνεται το χρονόμετρο. Δηλαδή, θα «τσιμπήσει» 15, 625 φορές το δευτερόλεπτο. Η κάρτα /CARD_PRESENT θα ανέβει Υ HIGHΗΛΗ υποδεικνύοντας ότι η κάρτα έχει αφήσει τον αναγνώστη περίπου 150ms μετά το τελευταίο bit δεδομένων. Γνωρίζοντας αυτό, αποφάσισα να ελέγξω κάθε 1/4 του δευτερολέπτου. Θα έμοιαζε κάπως έτσι:

(((F_CPU) / PRESCALER) / 4) που αποδεικνύεται ότι είναι περίπου 3900. Έτσι, όταν ο μετρητής χρονοδιακόπτη TCNT1 φτάσει τα 3900, τότε ξέρω ότι έχουν περάσει περίπου 300ms και μπορώ με ασφάλεια να συμπεράνω ότι η κάρτα έφυγε από τον αναγνώστη. Ανετα

#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 (TCCR1, CS10), BCLR (TCCR1B, CS12) #define ClearTimer () (TCNT1 = 0) Έχετε δει στο ISR όπου το χρονόμετρο ξεκινά, σταματά και διαγράφεται σε κάθε διακοπή. Τώρα, στον κύριο βρόχο, απλώς ελέγχουμε αν ο μετρητής χρονομέτρου έχει φτάσει την τιμή -στόχο μας και αν ναι, ξεκινήστε την επεξεργασία δεδομένων

για (;;) {if (TCNT1> = CHECK_TIME) {

StopTimer (); ClearTimer (); ProcessData (); ReadData (); idx = 0; bit = 6; bDataPresent = 0; memset (& buff, 0, MAX_BUFF_SZ1); }} Τώρα είναι ασφαλές να επεξεργαστείτε τα δεδομένα

κωδικός μορφοποιημένος από

Βήμα 7: Επεξεργασία των δεδομένων

Επεξεργαστείτε τα Δεδομένα
Επεξεργαστείτε τα Δεδομένα

Επεξεργαστείτε τα δεδομένα

Η φάση επεξεργασίας αποτελείται από:

  • έλεγχος για έγκυρο SS
  • τον έλεγχο της ισοτιμίας
  • μετατροπή σε ASCII
  • έλεγχος για έγκυρο ES
  • έλεγχος LRC

Εδώ, δεν ασχολούμαι με τον έλεγχο της ισοτιμίας, καθώς μόλις έβαλα αυτό το κομμάτι στο μηδέν. Επίσης δεν υπολογίζω το LRC για αυτό το μικρό σεμινάριο. Αυτό θα ήταν κάτι που μπορεί να θέλει να κάνει ένα πλήρως υλοποιημένο υλικολογισμικό. Ακολουθεί ο κώδικας για την επεξεργασία των δεδομένων κάνοντας τα παραπάνω βήματα (χωρίς τα προαναφερθέντα). Βρείτε το στην παρακάτω εικόνα. Είναι σχολιασμένο και αρκετά αυτονόητο. Μια ειδική σημείωση σχετικά με την ισοτιμία και το ASCII: Απλώς καθαρίζω το bit ισοτιμίας (7ο bit… δηλ. 1 με 6 μηδενικά πίσω) και για να μετατρέψετε από "δεδομένα καρτών" πρέπει να προσθέσετε 0x20 στην τιμή. Για αυτό πρόκειται.

Βήμα 8: Εμφάνιση των δεδομένων

Εμφάνιση των Δεδομένων
Εμφάνιση των Δεδομένων
Εμφάνιση των Δεδομένων
Εμφάνιση των Δεδομένων

Εμφάνιση των δεδομένων

Η οθόνη πηγαίνει σε ένα τερματικό πρόγραμμα που έγραψα ειδικά για σύνδεση σε AVR μέσω RS232 ή USB. Το πρόγραμμα ονομάζεται AVR Terminal. Η μέθοδος ReadData () είναι αρκετά άσχημη και ενθαρρύνεστε να βρείτε μια πιο καθαρή λύση από αυτήν που βρήκα. Υπάρχει επίσης μια έξοδος της συνάρτησης στο τερματικό AVR. Η έξοδος είναι πρώτα από μια κάρτα ασφάλισης υγείας και η δεύτερη από μια κάρτα VISA. Κάντε κλικ στο στην επάνω αριστερή γωνία της εικόνας και επιλέξτε πρωτότυπη ή μεγάλη εικόνα για να την δείτε καλύτερα.

Βήμα 9: Λήψη κώδικα και αναδίπλωση

Σε αυτό το διδακτικό έχω συζητήσει ορισμένα βασικά στοιχεία των συσκευών ανάγνωσης μαγνητικών καρτών και σας έδειξα κάποιο κώδικα για να ξεκινήσετε προς τη σωστή κατεύθυνση στην ανάγνωση δεδομένων από μαγνητικές κάρτες. Υπάρχει πολύ περισσότερη δουλειά που θα μπορούσε να γίνει, όπως η ανάγνωση και η αποκωδικοποίηση του 2ου κομματιού, ο υπολογισμός του LRC και ο υπολογισμός της περιττής ισοτιμίας σε κάθε byte. Ο πλήρης πηγαίος κώδικας είναι διαθέσιμος για λήψη παρακάτω. Γράφτηκε στο AVR Studio 4.17. Ελπίζω να σας άρεσε αυτό το διδακτικό και, όπως πάντα, ανυπομονώ για τυχόν σχόλια ή προτάσεις που μπορεί να έχετε. Καλή κωδικοποίηση και AVR'ing!

Συνιστάται: