Γνωρίζουμε σε γραφεία, εμπορικά κέντρα και σε πολλά άλλα μέρη όπου επιτρέπεται μόνο στο άτομο με κάρτα εξουσιοδότησης να εισέλθει στο δωμάτιο. Αυτά τα συστήματα χρησιμοποιούν σύστημα επικοινωνίας RFID. Το RFID χρησιμοποιείται σε εμπορικά κέντρα για να σταματήσει η κλοπή, καθώς τα προϊόντα φέρουν ετικέτα με τσιπ RFID και όταν ένα άτομο βγαίνει από το κτίριο με το τσιπ RFID, ένας συναγερμός ενεργοποιείται αυτόματα. Η ετικέτα RFID έχει σχεδιαστεί τόσο μικρή όσο μέρος άμμου. Τα συστήματα ελέγχου ταυτότητας RFID είναι εύκολο να σχεδιαστούν και έχουν φθηνό κόστος. Ορισμένα σχολεία και κολέγια χρησιμοποιούν σήμερα συστήματα παρακολούθησης με βάση RFID.
Σε αυτό το έργο πρόκειται να σχεδιάσουμε ένα μηχάνημα ψηφοφορίας που μετρά μόνο αυθεντικές ψήφους. Αυτό γίνεται χρησιμοποιώντας ετικέτες RFID (Radio Frequency Identification). Εδώ πρόκειται να γράψουμε ένα πρόγραμμα για το ATMEGA που επιτρέπει μόνο στους εξουσιοδοτημένους κατόχους ετικετών RFID να ψηφίζουν. (Ελέγξτε επίσης αυτό το απλό έργο μηχανής ψηφοφορίας)
Απαιτούμενα στοιχεία
Υλικό: ATMEGA32, τροφοδοτικό (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF πυκνωτής (συνδεδεμένος σε τροφοδοτικό), κουμπί (πέντε κομμάτια), 10KΩ αντίσταση (πέντε κομμάτια), 100nF πυκνωτής (πέντε τεμάχια), LED (δύο κομμάτια), EM-18 (μονάδα ανάγνωσης RFID).
Λογισμικό: Atmel studio 6.1, progisp ή flash magic.
Διάγραμμα κυκλώματος και επεξήγηση
Στο κύκλωμα, το PORTA του ATMEGA32 είναι συνδεδεμένο σε θύρα δεδομένων LCD Εδώ πρέπει να θυμόμαστε να απενεργοποιήσουμε την επικοινωνία JTAG στο PORTC σε ATMEGA αλλάζοντας τα bytes ασφάλειας, εάν κάποιος θέλει να χρησιμοποιήσει το PORTC ως κανονική θύρα επικοινωνίας. Σε LCD 16x2 υπάρχουν συνολικά 16 ακίδες αν υπάρχει μαύρο φως, εάν δεν υπάρχει οπίσθιο φως θα υπάρχουν 14 ακίδες. Κάποιος μπορεί να τροφοδοτήσει ή να αφήσει τις πίσω ακίδες. Τώρα στις 14 ακίδες υπάρχουν 8 καρφίτσες δεδομένων (7-14 ή D0-D7), 2 καρφίτσες τροφοδοσίας (1 & 2 ή VSS & VDD ή gnd & + 5v), 3ος ακροδέκτης για έλεγχο αντίθεσης (VEE-ελέγχει πόσο παχύ πρέπει να είναι οι χαρακτήρες φαίνεται), 3 ακίδες ελέγχου (RS & RW & E)
Στο κύκλωμα, μπορείτε να παρατηρήσετε ότι έχω πάρει μόνο δύο ακίδες ελέγχου, κάτι που δίνει την ευελιξία καλύτερης κατανόησης, το bit αντίθεσης και το READ / WRITE δεν χρησιμοποιούνται συχνά, ώστε να μπορούν να βραχυκυκλωθούν στη γείωση. Αυτό θέτει την οθόνη LCD σε υψηλότερη αντίθεση και λειτουργία ανάγνωσης. Πρέπει απλώς να ελέγξουμε ENABLE και RS καρφίτσες για να στείλουμε ανάλογα χαρακτήρες και δεδομένα.
Οι συνδέσεις που γίνονται για LCD δίνονται παρακάτω:
PIN1 ή VSS στη γείωση
PIN2 ή VDD ή VCC σε ισχύ + 5v
PIN3 ή VEE στη γείωση (δίνει τη μέγιστη αντίθεση καλύτερα για έναν αρχάριο)
PIN4 ή RS (Επιλογή καταχώρησης) στο PD6 του uC
Το PIN5 ή το RW (Ανάγνωση / Εγγραφή) στη γείωση (θέτει την οθόνη LCD σε λειτουργία ανάγνωσης διευκολύνει την επικοινωνία για τον χρήστη)
PIN6 ή E (Ενεργοποίηση) σε PD5 του uC
PIN7 ή D0 έως PA0 του uC
PIN8 ή D1 έως PA1 του uC
PIN9 ή D2 έως PA2 του uC
PIN10 ή D3 έως PA3 του uC
PIN11 ή D4 έως PA4 του uC
PIN12 ή D5 έως PA5 του uC
PIN13 ή D6 έως PA6 του uC
PIN14 ή D7 έως PA7 του uC
Στο κύκλωμα, μπορείτε να δείτε ότι χρησιμοποιήσαμε επικοινωνία 8bit (D0-D7). Ωστόσο, αυτό δεν είναι υποχρεωτικό και μπορούμε να χρησιμοποιήσουμε την επικοινωνία 4 bit (D4-D7), αλλά με το πρόγραμμα επικοινωνίας 4 bit γίνεται λίγο περίπλοκο, γι 'αυτό προτίμησα την επικοινωνία 8 bit.
Έτσι, από την απλή παρατήρηση του παραπάνω πίνακα, συνδέουμε 10 ακίδες LCD με ελεγκτή, όπου 8 ακίδες είναι καρφίτσες δεδομένων και 2 ακίδες για έλεγχο.
Πριν προχωρήσουμε, πρέπει να κατανοήσουμε τη σειριακή επικοινωνία. Η μονάδα RFID στέλνει εδώ δεδομένα στον ελεγκτή σειριακά. Έχει άλλο τρόπο επικοινωνίας, αλλά για εύκολη επικοινωνία επιλέγουμε RS232. Ο ακροδέκτης RS232 της μονάδας συνδέεται με τον ακροδέκτη RXD του ATMEGA.
Τα δεδομένα που αποστέλλονται από τη μονάδα RFID έχουν ως εξής:
Τώρα για τη διεπαφή μονάδας RFID, απαιτούνται οι ακόλουθες δυνατότητες:
1. Ο πείρος RXD (δυνατότητα λήψης δεδομένων) του ελεγκτή πρέπει να είναι ενεργοποιημένος.
2. Δεδομένου ότι η επικοινωνία είναι σειριακή, πρέπει να γνωρίζουμε όποτε λαμβάνεται το αντίο δεδομένων, έτσι ώστε να μπορούμε να σταματήσουμε το πρόγραμμα έως ότου ληφθεί το πλήρες byte. Αυτό επιτυγχάνεται επιτρέποντας την πλήρη λήψη δεδομένων.
3. Το RFID στέλνει δεδομένα στον ελεγκτή σε λειτουργία 8bit. Έτσι, δύο χαρακτήρες θα σταλούν στον ελεγκτή κάθε φορά. Αυτό φαίνεται στο μπλοκ του σχήματος 3
4. Από το σχήμα 3, δεν υπάρχουν bit ισοτιμίας, ένα bit διακοπής στα δεδομένα που αποστέλλονται από τη μονάδα.
Τα παραπάνω χαρακτηριστικά ορίζονται στους καταχωρητές ελεγκτών. θα τα συζητήσουμε εν συντομία,
ΚΟΚΚΙΝΟ (RXEN): Αυτό το bit αντιπροσωπεύει τη δυνατότητα λήψης δεδομένων, αυτό το bit πρέπει να ρυθμιστεί ώστε τα δεδομένα από τη μονάδα να λαμβάνονται από τον ελεγκτή, επίσης επιτρέπει την ακίδα RXD του ελεγκτή.
BROWN (RXCIE): Αυτό το bit πρέπει να ρυθμιστεί για διακοπή μετά την επιτυχή λήψη δεδομένων. Ενεργοποιώντας αυτό το bit, γνωρίζουμε αμέσως μετά τη λήψη δεδομένων 8 bit.
PINK (URSEL): Αυτό το bit πρέπει να ρυθμιστεί πριν ενεργοποιήσετε άλλα bit στο UCSRC, αφού ορίσετε άλλα απαραίτητα bit στο UCSRC. Το URSEL πρέπει να απενεργοποιηθεί ή να μηδενιστεί.
ΚΙΤΡΙΝΟ (UCSZ0, UCSZ1, UCSZ2): Αυτά τα τρία bit χρησιμοποιούνται για την επιλογή του αριθμού των bit δεδομένων που λαμβάνουμε ή στέλνουμε με μία κίνηση.
Δεδομένου ότι τα δεδομένα που αποστέλλονται από τη μονάδα RFID είναι τύπου δεδομένων 8bit (ΣΧΗΜΑ 3), πρέπει να ρυθμίσουμε τα UCSZ0, UCSZ1 σε ένα και UCSZ2 στο μηδέν.
ORANGE (UMSEL): Αυτό το bit ρυθμίζεται ανάλογα με το αν το σύστημα επικοινωνεί ασύγχρονα (και οι δύο χρησιμοποιούν διαφορετικό ρολόι) ή συγχρονισμένα (και τα δύο χρησιμοποιούν το ίδιο ρολόι),
Δεδομένου ότι η μονάδα και ο ελεγκτής χρησιμοποιούν διαφορετικό ρολόι, αυτό το bit πρέπει να ρυθμιστεί στο μηδέν ή να μείνει μόνο, καθώς όλα έχουν ρυθμιστεί στο μηδέν από προεπιλογή.
ΠΡΑΣΙΝΟ (UPM1, UPM0): Αυτά τα δύο bit προσαρμόζονται με βάση την ισοτιμία bit που χρησιμοποιούμε στην επικοινωνία.
Δεδομένου ότι η μονάδα RFID στέλνει δεδομένα χωρίς ισοτιμία (ΣΧΗΜΑ 3), έχουμε ρυθμίσει και τα δύο UPM1, UPM0 στο μηδέν ή μπορούν να μείνουν μόνα τους καθώς όλα τα bit σε οποιονδήποτε καταχωρητή ρυθμίζονται στο μηδέν από προεπιλογή.
ΜΠΛΕ (USBS): Αυτό το bit χρησιμοποιείται για την επιλογή του αριθμού των bit διακοπής που χρησιμοποιούμε κατά την επικοινωνία.
Δεδομένου ότι η μονάδα RFID στέλνει δεδομένα με ένα bit διακοπής (σχήμα 3), πρέπει απλώς να αφήσουμε μόνο το USBS bit.
Τώρα επιτέλους πρέπει να ρυθμίσουμε τον ρυθμό baud, από το σχήμα 3 είναι σαφές ότι η μονάδα RFID στέλνει δεδομένα στον ελεγκτή με ρυθμό baud 9600bps (bits ανά δευτερόλεπτο).
Ο ρυθμός baud ρυθμίζεται στον ελεγκτή επιλέγοντας το κατάλληλο UBRRH,
Η τιμή UBRRH επιλέγεται με διασταυρούμενο ρυθμό baud και συχνότητα κρυστάλλου CPU,
Έτσι, με την παραπομπή, η τιμή UBRR θεωρείται «6» και έτσι ο ρυθμός baud ορίζεται.
Υπάρχουν πέντε κουμπιά που υπάρχουν εδώ, τέσσερα για την αύξηση των ψήφων των υποψηφίων και το πέμπτο για την επαναφορά των ψήφων των υποψηφίων στο μηδέν. Οι πυκνωτές που υπάρχουν εδώ είναι για την εξουδετέρωση των πλήκτρων που αναπηδούν. Εάν αφαιρεθούν, ο ελεγκτής μπορεί να μετρά περισσότερα από ένα κάθε φορά που πατάτε το κουμπί.
Οι αντιστάσεις που συνδέονται για καρφίτσες προορίζονται για τον περιορισμό του ρεύματος, όταν πατηθεί το κουμπί για να τραβήξει προς τα κάτω τον πείρο στο έδαφος. Κάθε φορά που πατάτε ένα κουμπί, ο αντίστοιχος πείρος του ελεγκτή τραβιέται προς τα κάτω και έτσι ο ελεγκτής αναγνωρίζει ότι έχει πατηθεί κάποιο κουμπί και ότι πρέπει να ληφθεί αντίστοιχη ενέργεια, μπορεί να αυξάνει τις υποψήφιες ψήφους ή να επαναφέρει τις ψήφους ανάλογα με το πάτημα του κουμπιού.
Όταν πατηθεί το κουμπί που αντιπροσωπεύει ένα αντίστοιχο άτομο, ο ελεγκτής το επιλέγει και αυξάνει τον αντίστοιχο αριθμό προσώπου μέσα στη μνήμη του μετά την αύξηση, δείχνει την αντίστοιχη βαθμολογία ατόμων στην οθόνη LCD 16x2.
Η λειτουργία της μηχανής ψηφοφορίας εξηγείται καλύτερα στο βήμα προς βήμα του κώδικα Γ που δίνεται παρακάτω:
Επεξήγηση κώδικα
#include // header για να ενεργοποιήσετε τον έλεγχο ροής δεδομένων πάνω στις ακίδες
#define F_CPU 1000000 // επισυνάπτεται η συχνότητα κρυστάλλου του ελεγκτή
#περιλαμβάνω
#define E 5 // δίνοντας το όνομα "ενεργοποίηση" στον 5ο ακροδέκτη του PORTD, καθώς είναι συνδεδεμένος με την καρφίτσα ενεργοποίησης LCD
#define RS 6 // δίνοντας το όνομα «registerselection» έως 6 ου pin της PORTD, δεδομένου ότι συνδέεται με LCD RS pin
άκυρο send_a_command (εντολή char χωρίς υπογραφή) ·
void send_a_character (μη υπογεγραμμένος χαρακτήρας char).
άκυρο send_a_string (char * string_of_characters);
int main (άκυρο)
{
DDRA = 0xFF; // βάζοντας το porta ως καρφίτσες εξόδου
DDRD = 0b11111110;
_delay_ms (50); // δίνοντας καθυστέρηση 50ms
DDRB = 0b11110000; // Λήψη ορισμένων ακίδων portB ως είσοδο.
UCSRB - = (1 <
// επιτρέποντας στα δεδομένα να λαμβάνουν πλήρη διακοπή, επιτρέποντας στα δεδομένα λήψης pin
UCSRC - = (1 <
// αλλαγή άλλων bits ρυθμίζοντας πρώτα το URSEL, ρύθμιση για επικοινωνία 8 bit
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // ρύθμιση του ρυθμού baud
int16_t VOTEA = 0; // person1 ψήφοι για αποθήκευση μνήμης
char A; // person1 ψήφοι που εμφανίζουν χαρακτήρα σε LCD
int16_t VOTEB = 0;; // person2 ψήφοι αποθηκεύοντας μνήμη
char B; // person2 ψήφοι που εμφανίζουν χαρακτήρα σε LCD
int16_t VOTEC = 0;; // person3 ψήφοι αποθηκεύοντας μνήμη
char C; // person3 ψήφοι που εμφανίζουν χαρακτήρα σε LCD
int16_t VOTED = 0;; // person4 ψήφοι αποθηκεύοντας μνήμη
char D; / / person4 ψήφοι που εμφανίζουν χαρακτήρα σε LCD
// Το παρακάτω περιέχει αναγνωριστικό ετικετών, αυτά πρέπει να αλλάξουν για διαφορετικές ετικέτες, Πρέπει να ενημερωθούν για να λειτουργήσει το έργο
// Μετά την απόρριψη του προγράμματος στον ελεγκτή πρέπει να πάρει τις κάρτες που πρέπει να είναι εξουσιοδοτημένες και να πάρει το αναγνωριστικό ετικετών, αυτές λαμβάνονται τοποθετώντας την ετικέτα κοντά στη μονάδα RFID και το αναγνωριστικό θα εμφανιστεί στην οθόνη. Μετά τη λήψη των αναγνωριστικών, το πρόγραμμα πρέπει να ενημερωθεί αντικαθιστώντας τους παρακάτω αριθμούς ταυτότητας με νέους αριθμούς ταυτότητας.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Τώρα παραπάνω εγκρίνουμε μόνο πέντε κάρτες, αυτές μπορούν να αλλάξουν σε οποιονδήποτε αριθμό, Για παράδειγμα, θεωρήστε ότι το προεπιλεγμένο πρόγραμμα απορρίπτεται στον ελεγκτή, λάβετε τις κάρτες που θα πρέπει να είναι εξουσιοδοτημένες.
Εάν έχουμε 7 ετικέτες που έχουμε, τότε θα έχουμε 7 οκτώ bit ID.
// τώρα για επτά φύλλα πηγαίνει ως // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // εκχώρηση μνήμης για εμφάνιση της ταυτότητας αποστολής ανά ενότητα int i = 0; int vote = 0; int k = 0; send_a_command (0x01); // Διαγραφή οθόνης 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // λέγοντας lcd ότι χρησιμοποιούμε τη λειτουργία εντολών / δεδομένων 8bit _delay_ms (50); send_a_command (0b00001111); // ΟΘΟΝΗ LCD ON και αναβοσβήνει το courser char MEM; // εκχώρηση μνήμης για αποθήκευση πλήρους αναγνωριστικού ετικέτας send_a_string ("ΑΡΙΘΜΟΣ RFID"); // συμβολοσειρά αποστολής send_a_command (0x80 + 0x40 + 0); // μετακίνηση του courser στη δεύτερη γραμμή ενώ (1) { ενώ (! (UCSRA & (1 <
{ } COUNTA = UDR; // Το UDR αποθηκεύει τα δεδομένα των οκτώ bit που λαμβάνονται και λαμβάνεται σε ακέραιο. MEM = COUNTA; // οι δύο πρώτοι χαρακτήρες ενημερώνονται στη μνήμη itoa (COUNTA, SHOWA, 16); // εντολή για τοποθέτηση μεταβλητού αριθμού σε LCD (μεταβλητός αριθμός, σε ποιο χαρακτήρα θα αντικατασταθεί, ποια βάση είναι μεταβλητή (δέκα εδώ καθώς μετράμε τον αριθμό στη βάση10)) send_a_string (SHOWA); // λέγοντας στην οθόνη να δείξει χαρακτήρα (αντικαταστάθηκε από μεταβλητό αριθμό) του δεύτερου ατόμου μετά την τοποθέτηση του courser στην οθόνη LCD ενώ (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); ΜΕΜ = COUNTA; // ο τρίτος και ο τέταρτος χαρακτήρας ενημερώνονται στη μνήμη ενώ (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ο πέμπτος και ο έκτος χαρακτήρες ενημερώνονται στη μνήμη ενώ (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // έβδομοι και οκτώ χαρακτήρες ενημερώνονται στη μνήμη send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
για (i = 0; i <5; i ++) { εάν ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// έλεγχος για αγορά εξουσιοδότησης συγκρίνοντας δύο χαρακτήρες τη φορά με τους χαρακτήρες στη μνήμη PORTB - = (1 <
ψηφοφορία = 1; // εάν εξουσιοδοτηθεί, ορίστε το VOTE } } if (vote == 0) // η εξουσιοδότηση απέτυχε εάν δεν έχει οριστεί η ψηφοφορία { UCSRB - = (1 <
} ενώ (ψηφοφορία == 1) // κάντε αυτόν τον βρόχο μέχρι να ψηφίσετε, εάν εγκριθεί { send_a_command (0x80 + 0); // μεταβείτε στη θέση μηδέν στη γραμμή1 send_a_string ("ΨΗΦΙΣΤΕ ΤΩΡΑ"); // εμφάνιση συμβολοσειράς if (bit_is_clear (PINB, 0)) // όταν πατηθεί το κουμπί { VOTEA ++; // αύξηση της μνήμης ψήφου του πρώτου ατόμου κατά ένα ψηφοφορία = 0; // αφήνοντας το βρόχο μετά την ψηφοφορία } if (bit_is_clear (PINB, 1)) // όταν πατηθεί το κουμπί 2 { VOTEB ++; // αύξηση της μνήμης ψήφου του 2ου ατόμου κατά ένα ψηφοφορία = 0; } if (bit_is_clear (PINB, 2)) // όταν πατηθεί το κουμπί 3 { VOTEC ++; // αύξηση της μνήμης ψήφου του 3ου ατόμου κατά ένα ψηφοφορία = 0; } if (bit_is_clear (PINB, 3)) // όταν πατηθεί το κουμπί 4 { ΨΗΦΟΦΟΡΙΑ ++; // αύξηση της μνήμης ψήφου του 4ου ατόμου κατά ένα ψηφοφορία = 0; } if (ψηφοφορία == 0) // διαγράφεται μετά τη λήψη της ψηφοφορίας { send_a_command (0x80 + 0); // μετακίνηση στη θέση μηδέν της γραμμής1 send_a_string ("ΕΥΧΑΡΙΣΤΩ ΓΙΑ ΨΗΦΟΦΟΡΙΑ"); // συμβολοσειρά οθόνης για (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // εμφάνιση ψήφων και των τεσσάρων ατόμων send_a_string ("A ="); send_a_command (0x80 + 2); itoa (VOTEA, A, 10); send_a_string (Α); send_a_command (0x80 + 8); send_a_string ("B ="); send_a_command (0x80 + 10); itoa (VOTEB, B, 10); send_a_string (B); send_a_command (0x80 + 0x40 + 0); send_a_string ("C ="); send_a_command (0x80 + 0x40 + 2); itoa (VOTEC, C, 10); send_a_string (C); send_a_command (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_command (0x80 + 0x40 + 10); itoa (ΨΗΦΟΦΟΡΙΑ, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); για (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // μετακίνηση σε μηδενική θέση send_a_string ("ΑΡΙΘΜΟΣ RFID"); // αποστολή συμβολοσειράς send_a_command (0x80 + 0x40 + 0); } } void send_a_command (εντολή char χωρίς υπογραφή) { PORTA = εντολή; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (χαρακτήρας char χωρίς υπογραφή) { PORTA = χαρακτήρας; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } άκυρο send_a_string (char * string_of_characters) { ενώ (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |