Vi ved det i kontorer, indkøbscentre og mange andre steder, hvor kun den person med autorisationskort har adgang til rummet. Disse systemer bruger RFID-kommunikationssystem. RFID bruges i indkøbscentre for at stoppe tyveri, da produkterne er mærket med RFID-chip, og når en person forlader bygningen med RFID-chippen, udløses der automatisk en alarm. RFID-mærket er designet så lille som en del af sand. RFID-godkendelsessystemerne er nemme at designe og har en billig pris. Nogle skoler og colleges bruger i dag RFID-baserede tilstedeværelsessystemer.
I dette projekt skal vi designe et RFID-baseret vejafgiftssystem til sikkerhedsformål. Så dette system åbner porte og tillader kun personer med de autoriserede RFID-tags. De autoriserede ID'er til tagsindehavere er programmeret til ATMEGA Microcontroller, og kun disse indehavere har lov til at forlade eller komme ind i lokalet.
Komponenter, der kræves
Hardware: ATmega32 mikrokontroller, strømforsyning (5v), AVR-ISP programmerer, JHD_162ALCD (16x2 LCD modul), 100uF kondensator (tilsluttet via strømforsyning), knap, 10KΩ modstand, 100nF kondensator, LED (to stykker), EM-18 (RFID-læser-modul), L293D-motordriver IC, 5V DC-motor.
Software: Atmel studio 6.1, progisp eller flash-magi.
Kredsløbsdiagram og arbejdsforklaring
I RFID-opkrævningssystemkredsløbet vist ovenfor er PORTA på ATMEGA32 forbundet til dataporten på LCD-skærmen. Her skal vi huske at deaktivere JTAG-kommunikationen i PORTC til ATMEGA ved at ændre sikringsbyte, hvis vi ønsker at bruge PORTC som en normal kommunikationsport. I 16x2 LCD er der overalt 16 ben, hvis der er baggrundslys, hvis der ikke er noget baggrundslys, vil der være 14 ben. Vi kan tænde eller lade bagbelysningsstiftene være. Nu i de 14 stifter er der 8 data stifter (7-14 eller D0-D7), 2 Strømforsyning stifter (1 & 2 eller VSS & VDD eller gnd + 5v &), 3 rd pin for kontrast kontrol (VEE-styringer hvor tyk tegn skal vises), 3 kontrolpinde (RS & RW & E).
I kredsløbet kan du se, at jeg kun har taget to kontrolben. Dette giver fleksibiliteten med bedre forståelse. Kontrastbit og LÆS / SKRIV bruges ikke ofte, så de kan kortsluttes til jorden. Dette sætter LCD i højeste kontrast og læsetilstand. Vi skal bare kontrollere ENABLE og RS-ben for at sende tegn og data i overensstemmelse hermed.
Forbindelserne, der er lavet til LCD, er angivet nedenfor:
PIN1 eller VSS til jord
PIN2 eller VDD eller VCC til + 5v strøm
PIN3 eller VEE til jorden (giver maksimal kontrast bedst for en nybegynder)
PIN4 eller RS (Register Selection) til PD6 i MCU
PIN5 eller RW (læse / skrive) til jorden (sætter LCD i læsefunktion letter kommunikationen for brugeren)
PIN6 eller E (Enable) til PD5 fra Microcontroller
PIN7 eller D0 til PA0
PIN8 eller D1 til PA1
PIN9 eller D2 til PA2
PIN10 eller D3 til PA3
PIN11 eller D4 til PA4
PIN12 eller D5 til PA5
PIN13 eller D6 til PA6
PIN14 eller D7 til PA7
I kredsløbet kan du se, at vi har brugt 8bit kommunikation (D0-D7). Dette er dog ikke obligatorisk, og vi kan bruge 4bit kommunikation (D4-D7), men med 4 bit kommunikation bliver programmet lidt komplekst, så jeg foretrak 8-bit kommunikation.
Så fra blot observation af ovenstående tabel forbinder vi 10 ben på LCD til controller, hvor 8 ben er datapinde og 2 ben til kontrol.
Før vi går videre, skal vi forstå den serielle kommunikation. RFID-modulet sender her data til controlleren i serie. Det har en anden kommunikationsform, men for nem kommunikation vælger vi RS232. RS232-stiften på modulet er tilsluttet RXD-stiften på ATMEGA.
Dataene sendt af RFID-modulet er som:
Nu til RFID-modulinterfacet kræves følgende funktioner:
1. RXD-pin (data modtagefunktion) på controlleren skal være aktiveret.
2. Da kommunikationen er seriel, skal vi vide, hvornår data-bye modtages, så vi kan stoppe programmet, indtil komplet byte er modtaget. Dette gøres ved at aktivere en fuldstændig afbrydelse af datamodtagelse.
3. RFID sender data til controlleren i 8bit-tilstand. Så to tegn sendes til controlleren ad gangen. Dette er vist i ovenstående figur.
4. Fra ovenstående figur er der ingen paritetsbits, et stopbit i de data, der sendes af modulet.
Ovenstående funktioner er indstillet i controllerregistrene; vi vil diskutere dem kort,
RØD (RXEN): Denne bit repræsenterer modtagedata-funktionen. Denne bit skal indstilles for at dataene fra modulet skal modtages af controlleren. Det muliggør også RXD-pin-controller.
BRUN (RXCIE): Denne bit skal indstilles for at få en afbrydelse efter vellykket datamodtagelse. Ved at aktivere denne bit lærer vi at vide, lige efter 8 bit data modtagelse.
PINK (URSEL): Denne bit skal indstilles, før andre bit i UCSRC aktiveres. Efter indstilling skal andre nødvendige bits i UCSRC, URSEL deaktiveres eller sættes til nul.
GUL (UCSZ0, UCSZ1, UCSZ2): Disse tre bits bruges til at vælge antallet af databits, vi modtager eller sender på en gang.
Da de data, der sendes af RFID-modulet, er 8bit-datatype, skal vi sætte UCSZ0, UCSZ1 til en og UCSZ2 til nul.
ORANGE (UMSEL): Denne bit indstilles på baggrund af, om systemet kommunikerer asynkront (begge bruger forskellige ur) eller synkront (begge bruger det samme ur).
Da modul og controller bruger forskellige ur, skal denne bit sættes til nul eller efterlades alene, da de alle er sat til nul som standard.
GRØN (UPM1, UPM0): Disse to bits justeres ud fra den bitparitet, vi bruger i kommunikationen.
Da RFID-modul sender data uden paritet, har vi indstillet både UPM1, UPM0 til nul, eller de kan være alene, da alle bits i ethvert register er som standard sat til nul.
BLÅ (USBS): Denne bit bruges til at vælge antallet af stopbits, vi bruger under kommunikationen.
Da RFID-modul sender data med en stopbit, er vi bare nødt til at lade USBS-biten være alene.
Nu er vi endelig nødt til at indstille baudhastigheden, fra figuren ovenfor er det klart, at RFID-modulet sender data til controlleren med en baudhastighed på 9600bps (bits per sekund).
Baudhastigheden indstilles i controlleren ved at vælge den passende UBRRH.
UBRRH-værdien vælges ved krydshenvisende baudhastighed og CPU-krystalfrekvens, så ved krydshenvisning ses UBRR-værdi som '6', og så indstilles baudhastigheden.
Som vist i figuren går to ben fra controlleren til L293D, som er en H-BRIDGE, der bruges til at kontrollere hastighed og omdrejningsretning for DC-motorer med lav effekt.
L293D er en H-BRIDGE IC designet til at køre jævnstrømsmotorer med lav effekt og er vist i figur, denne IC består af to h-broer, og så den kan køre to jævnstrømsmotorer. Så denne IC kan bruges til at drive robotmotorer fra mikrokontrollerens signaler.
Som tidligere beskrevet har denne IC evne til at ændre DC-motorens rotationsretning. Dette opnås ved at kontrollere spændingsniveauerne ved INPUT1 og INPUT2.
Aktivér Pin |
Indgangsstift 1 |
Indgangsstift 2 |
Motorretning |
Høj |
Lav |
Høj |
Drej til højre |
Høj |
Høj |
Lav |
Drej til venstre |
Høj |
Lav |
Lav |
Hold op |
Høj |
Høj |
Høj |
Hold op |
Så som vist i ovenstående tabel, skal rotation med uret 2A være høj og 1A være lav. Tilsvarende for anti-urets retning skal 1A være høj og 2A være lav.
Hver gang et autoriseret kort bringes i nærheden af modulet, er motoren programmeret til at bevæge sig med uret i et sekund for at vise, at afgiftsporten er åbnet efter et sekund, den kommer tilbage og fortæller, at afgiftsporten er lukket. Arbejdet med vejafgift forklares bedst trin for trin af C-koden nedenfor.
Programmering Forklaring
Nedenfor er linjen til linjen forklaring på koden for RFID Toll Collection System. Du kan forstå konceptet og arbejdet med dette projekt ved at læse koden nedenfor. For at downloade eller kopiere kan du finde den komplette kode nederst på siden.
#include // header for at aktivere datastrømskontrol over pins
#define F_CPU 1000000 // fortæller controllerens krystalfrekvens knyttet
#omfatte
#define E 5 // giver navnet ”enable” til 5 th pin af PORTD, da den er forbundet til LCD aktivere pin
#define RS 6 // giver navnet ”registerselection” til 6 th pin af PORTD, da den er forbundet til LCD RS pin
ugyldigt send_a_command (usigneret char-kommando);
ugyldigt send_a_character (usigneret char karakter);
ugyldigt send_a_string (char * string_of_characters);
int main (ugyldigt)
{
DDRA = 0xFF; // sætte porta som outputstifter
DDRD = 0b11111110;
_forsinkelse (50); // giver forsinkelse på 50 ms
DDRB = 0b11110000; // Tager nogle portB-ben som input.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // indstilling af baudrate // Følgende indeholder ID for tags, disse skal ændres for forskellige tags, Disse skal opdateres for at projektet fungerer
/ * Efter dumping af programmet i controlleren skal man tage de kort, der skal godkendes, og få tags-ID'et. Disse opnås ved at placere mærket i nærheden af RFID-modulet, og ID'et vises på skærmen. Efter at have fået ID'erne, skal programmet opdateres ved at erstatte nedenstående ID-numre med nye ID-numre.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Nu i ovenstående godkender vi kun fem kort, disse kan ændres til ethvert nummer.
Overvej f.eks., At standardprogrammet er dumpet i controlleren, få de kort, der skal godkendes. Placer det ene efter det andet i nærheden af modulet, du får ID'et for hver enkelt som xxxxxxxx (907a4F87), Hvis vi har 7 tags, har vi 7 otte bit-ID. * /
// nu for syv kort går det som // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)}; // tildeler hukommelse til visning af ID sendt via modul int i = 0; int stemme = 0; int k = 0; send_a_command (0x01); // Ryd skærm 0x01 = 00000001 _forsink_ms (50); send_a_command (0x38); // fortæller lcd, at vi bruger 8bit kommando / datatilstand _forsink_ms (50); send_a_command (0b00001111); // LCD SKÆRM TIL og kurser blinker char MEM; // tildeler hukommelse til at gemme komplet ID for tag send_a_string ("RFID NUMBER"); // sender streng send_a_command (0x80 + 0x40 + 0); // flytter courser til anden linje mens (1) { mens (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR gemmer de modtagne otte bit data og tages i et heltal. MEM = COUNTA; // de første to tegn opdateres til hukommelsen itoa (COUNTA, SHOWA, 16); // kommando til at placere variabelt tal i LCD (variabelt nummer, i hvilket tegn der skal erstattes, hvilken base er variabel (ti her, da vi tæller nummer i base10)) send_a_string (SHOWA); // fortæller displayet at vise tegn (erstattet af variabelt nummer) for anden person efter positionering af kurer på LCD mens (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // tredje og fjerde tegn opdateres til hukommelsen mens (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // femte og sjette tegn opdateres til hukommelsen mens (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // syvende og otte tegn opdateres til hukommelsen send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
for (i = 0; i <5; i ++) { hvis ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// kontrol af autorisationskøb, der sammenligner to tegn ad gangen med tegnene i hukommelsen PORTB - = (1 <
PORTB & = ~ (1 <
_forsink_ms (220); // forsinkelse _forsink_ms (220); _forsink_ms (220); _forsink_ms (220); _forsink_ms (220); _forsink_ms (220); PORTB - = (1 <
PORTB & = ~ (1 <
_forsink_ms (220); _forsink_ms (220); _forsink_ms (220); _forsink_ms (220); _forsink_ms (220); _forsink_ms (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } ugyldigt send_a_command (usigneret char-kommando) { PORTA = kommando; PORTD & = ~ (1 <
PORTD - = 1 <
_forsink_ms (50); PORTD & = ~ 1 <
PORTA = 0; } ugyldigt send_a_character (usigneret tegn) { PORTA = tegn; PORTD - = 1 <
PORTD - = 1 <
_forsink_ms (50); PORTD & = ~ 1 <
PORTA = 0; } ugyldigt send_a_string (char * string_of_characters) { mens (* streng_af_tegn> 0) { send_a_character (* string_of_characters ++); } } |