Γνωρίζουμε σε γραφεία, εμπορικά κέντρα και σε πολλά άλλα μέρη όπου επιτρέπεται μόνο στο άτομο με κάρτα εξουσιοδότησης να εισέλθει στο δωμάτιο. Αυτά τα συστήματα χρησιμοποιούν σύστημα επικοινωνίας RFID. Το RFID χρησιμοποιείται σε εμπορικά κέντρα για να σταματήσει η κλοπή, καθώς τα προϊόντα φέρουν ετικέτα με τσιπ RFID και όταν ένα άτομο βγαίνει από το κτίριο με το τσιπ RFID, ένας συναγερμός ενεργοποιείται αυτόματα. Η ετικέτα RFID έχει σχεδιαστεί τόσο μικρή όσο μέρος άμμου. Τα συστήματα ελέγχου ταυτότητας RFID είναι εύκολο να σχεδιαστούν και έχουν φθηνό κόστος. Ορισμένα σχολεία και κολέγια χρησιμοποιούν σήμερα συστήματα παρακολούθησης με βάση RFID.
Σε αυτό το έργο πρόκειται να σχεδιάσουμε ένα σύστημα συλλογής διοδίων βάσει RFID για λόγους ασφαλείας. Έτσι, αυτό το σύστημα ανοίγει πύλες και επιτρέπει σε άτομα μόνο με τις εξουσιοδοτημένες ετικέτες RFID. Τα αναγνωρισμένα αναγνωριστικά κατόχων ετικετών προγραμματίζονται στον Μικροελεγκτή ATMEGA και επιτρέπεται μόνο σε αυτούς τους κατόχους να φύγουν ή να εισέλθουν στις εγκαταστάσεις.
Απαιτούμενα στοιχεία
Υλικό: Μικροελεγκτής ATmega32, τροφοδοσία ρεύματος (5v), Προγραμματιστής AVR-ISP, JHD_162ALCD (μονάδα LCD 16x2), πυκνωτής 100uF (συνδεδεμένος σε τροφοδοτικό), κουμπί, αντίσταση 10KΩ, πυκνωτής 100nF, LED (δύο τεμάχια), EM-18 (Μονάδα ανάγνωσης RFID), IC κινητήρα L293D, κινητήρας DC 5V.
Λογισμικό: Atmel studio 6.1, progisp ή flash magic.
Διάγραμμα κυκλώματος και εξήγηση εργασίας
Στο κύκλωμα συστήματος συλλογής διοδίων RFID που φαίνεται παραπάνω, το PORTA του ATMEGA32 είναι συνδεδεμένο σε θύρα δεδομένων LCD Εδώ πρέπει να θυμόμαστε να απενεργοποιήσουμε την επικοινωνία JTAG στο PORTC σε ATMEGA αλλάζοντας την ασφάλεια byte, εάν θέλουμε να χρησιμοποιήσουμε το 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 του MCU
Το PIN5 ή το RW (Ανάγνωση / Εγγραφή) στη γείωση (θέτει την οθόνη LCD σε λειτουργία ανάγνωσης διευκολύνει την επικοινωνία για τον χρήστη)
PIN6 ή E (Ενεργοποίηση) στο PD5 του μικροελεγκτή
PIN7 ή D0 έως PA0
PIN8 ή D1 έως PA1
PIN9 ή D2 έως PA2
PIN10 ή D3 έως PA3
PIN11 ή D4 έως PA4
PIN12 ή D5 έως PA5
PIN13 ή D6 έως PA6
PIN14 ή D7 έως PA7
Στο κύκλωμα, μπορείτε να δείτε ότι χρησιμοποιήσαμε επικοινωνία 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. Έτσι, δύο χαρακτήρες θα σταλούν στον ελεγκτή κάθε φορά. Αυτό φαίνεται στο παραπάνω σχήμα.
4. Από το παραπάνω σχήμα, δεν υπάρχουν 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, πρέπει να ρυθμίσουμε τα UCSZ0, UCSZ1 σε ένα και UCSZ2 στο μηδέν.
ORANGE (UMSEL): Αυτό το bit ρυθμίζεται ανάλογα με το αν το σύστημα επικοινωνεί ασύγχρονα (και τα δύο χρησιμοποιούν διαφορετικό ρολόι) ή συγχρονισμένα (και τα δύο χρησιμοποιούν το ίδιο ρολόι).
Δεδομένου ότι η μονάδα και ο ελεγκτής χρησιμοποιούν διαφορετικό ρολόι, αυτό το bit πρέπει να ρυθμιστεί στο μηδέν ή να μείνει μόνο, καθώς όλα έχουν ρυθμιστεί στο μηδέν από προεπιλογή.
ΠΡΑΣΙΝΟ (UPM1, UPM0): Αυτά τα δύο bit προσαρμόζονται με βάση την ισοτιμία bit που χρησιμοποιούμε στην επικοινωνία.
Δεδομένου ότι η μονάδα RFID στέλνει δεδομένα χωρίς ισοτιμία, έχουμε ρυθμίσει και τα δύο UPM1, UPM0 στο μηδέν ή μπορούν να μείνουν μόνα τους καθώς όλα τα bit σε οποιουσδήποτε καταχωρητές ρυθμίζονται στο μηδέν από προεπιλογή.
ΜΠΛΕ (USBS): Αυτό το bit χρησιμοποιείται για την επιλογή του αριθμού των bit διακοπής που χρησιμοποιούμε κατά την επικοινωνία.
Δεδομένου ότι η μονάδα RFID στέλνει δεδομένα με ένα bit διακοπής, πρέπει απλώς να αφήσουμε το USBS bit μόνο.
Τώρα επιτέλους πρέπει να ρυθμίσουμε τον ρυθμό baud, από το παραπάνω σχήμα είναι σαφές ότι η μονάδα RFID στέλνει δεδομένα στον ελεγκτή με ρυθμό baud 9600bps (bits ανά δευτερόλεπτο).
Ο ρυθμός baud ρυθμίζεται στον ελεγκτή επιλέγοντας το κατάλληλο UBRRH.
Η τιμή UBRRH επιλέγεται με διασταυρούμενο ρυθμό baud και συχνότητα κρυστάλλου CPU, οπότε με παραπομπή η τιμή UBRR θεωρείται «6» και έτσι ο ρυθμός baud ορίζεται.
Τώρα όπως φαίνεται στο σχήμα, δύο ακίδες από τον ελεγκτή πηγαίνουν στο L293D, το οποίο είναι ένα H-BRIDGE που χρησιμοποιείται για τον έλεγχο της ταχύτητας και της κατεύθυνσης περιστροφής για κινητήρες DC χαμηλής ισχύος.
Το L293D είναι ένα IC H-BRIDGE που έχει σχεδιαστεί για την οδήγηση κινητήρων DC χαμηλής ισχύος και φαίνεται στην εικόνα, αυτό το IC αποτελείται από δύο γέφυρες h και έτσι μπορεί να οδηγήσει δύο κινητήρες DC. Έτσι, αυτό το IC μπορεί να χρησιμοποιηθεί για την κίνηση κινητήρων ρομπότ από τα σήματα του μικροελεγκτή.
Τώρα, όπως συζητήθηκε προηγουμένως, αυτό το IC έχει τη δυνατότητα να αλλάξει την κατεύθυνση περιστροφής του κινητήρα DC. Αυτό επιτυγχάνεται με τον έλεγχο των επιπέδων τάσης στα INPUT1 και INPUT2.
Ενεργοποίηση καρφίτσας |
Pin Pin 1 |
Καρφίτσα εισαγωγής 2 |
Κατεύθυνση κινητήρα |
Υψηλός |
Χαμηλός |
Υψηλός |
Στρίψτε δεξιά |
Υψηλός |
Υψηλός |
Χαμηλός |
Στρίψτε αριστερά |
Υψηλός |
Χαμηλός |
Χαμηλός |
Να σταματήσει |
Υψηλός |
Υψηλός |
Υψηλός |
Να σταματήσει |
Έτσι, όπως φαίνεται στον παραπάνω πίνακα, για χρονική περιστροφή 2Α πρέπει να είναι υψηλή και 1Α πρέπει να είναι χαμηλή. Ομοίως για αριστερόστροφα 1Α πρέπει να είναι υψηλό και 2Α πρέπει να είναι χαμηλό.
Κάθε φορά που μια εξουσιοδοτημένη κάρτα φέρεται κοντά στη μονάδα, ο κινητήρας προγραμματίζεται να κινείται δεξιόστροφα για ένα δευτερόλεπτο, για να δείξει ότι η πύλη διοδίων ανοίγει μετά από ένα δευτερόλεπτο, επιστρέφοντας, λέγοντας ότι η πύλη διοδίων είναι κλειστή Η λειτουργία της πλατείας διοδίων εξηγείται καλύτερα στο βήμα προς βήμα του κώδικα C παρακάτω.
Επεξήγηση προγραμματισμού
Ακολουθεί η εξήγηση από γραμμή σε γραμμή για τον κωδικό του RFID Toll Collection System. Μπορείτε να κατανοήσετε την ιδέα και τη λειτουργία αυτού του έργου διαβάζοντας τον παρακάτω κώδικα. Για λήψη ή αντιγραφή, μπορείτε να βρείτε τον πλήρη κώδικα στο κάτω μέρος της σελίδας.
#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 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // ρύθμιση του ρυθμού baud // Το παρακάτω περιέχει αναγνωριστικό ετικετών, αυτά πρέπει να αλλάξουν για διαφορετικές ετικέτες, Αυτά πρέπει να ενημερωθούν για να λειτουργήσει το έργο
/ * Μετά την απόρριψη του προγράμματος στον ελεγκτή πρέπει να πάρουμε τις κάρτες που πρέπει να έχουν εξουσιοδότηση και να λάβουν το αναγνωριστικό ετικετών. Αυτά επιτυγχάνονται τοποθετώντας την ετικέτα κοντά στη μονάδα RFID και το αναγνωριστικό θα εμφανιστεί στην οθόνη. Μετά τη λήψη των αναγνωριστικών, το πρόγραμμα πρέπει να ενημερωθεί αντικαθιστώντας τους παρακάτω αριθμούς ταυτότητας με νέους αριθμούς ταυτότητας.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Τώρα παραπάνω εγκρίνουμε μόνο πέντε κάρτες, αυτές μπορούν να αλλάξουν σε οποιονδήποτε αριθμό.
Για παράδειγμα, θεωρήστε ότι το προεπιλεγμένο πρόγραμμα απορρίπτεται στον ελεγκτή, λάβετε τις κάρτες που πρέπει να εγκριθούν. Τοποθετήστε το ένα μετά το άλλο κοντά στη μονάδα, θα λάβετε το αναγνωριστικό για κάθε ένα ως xxxxxxxx (907a4F87), Εάν έχουμε 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 ΕΝΕΡΓΟΠΟΙΗΜΕΝΟ και αναβοσβήνει ο courser char MEM; // εκχώρηση μνήμης για αποθήκευση πλήρους αναγνωριστικού ετικέτας send_a_string ("ΑΡΙΘΜΟΣ RFID"); // αποστολή συμβολοσειράς send_a_command (0x80 + 0x40 + 0); // μετακίνηση του courser στη δεύτερη γραμμή ενώ (1) { ενώ (! (UCSRA & (1 <
{ } COUNTA = UDR; // Το UDR αποθηκεύει τα δεδομένα των οκτώ bit που λαμβάνονται και λαμβάνεται σε ακέραιο. ΜΕΜ = COUNTA; // οι δύο πρώτοι χαρακτήρες ενημερώνονται στη μνήμη itoa (COUNTA, SHOWA, 16); // εντολή για τοποθέτηση μεταβλητού αριθμού σε LCD (μεταβλητός αριθμός, σε ποιο χαρακτήρα θα αντικατασταθεί, ποια βάση είναι μεταβλητή (δέκα εδώ καθώς μετράμε τον αριθμό στη βάση10)) send_a_string (SHOWA); // λέγοντας στην οθόνη να δείξει χαρακτήρα (αντικαταστάθηκε από μεταβλητό αριθμό) του δεύτερου ατόμου μετά την τοποθέτηση του μαθητή στην οθόνη 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 <
PORTB & = ~ (1 <
_delay_ms (220); // καθυστέρηση _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } 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 ++); } } |