Vi vet det på kontorer, kjøpesentre og mange andre steder hvor bare personen med autorisasjonskort får komme inn i rommet. Disse systemene bruker RFID-kommunikasjonssystem. RFID brukes i kjøpesentre for å stoppe tyveri ettersom produktene er merket med RFID-brikke, og når en person forlater bygningen med RFID-brikken, slås en alarm automatisk. RFID-koden er designet så liten som en del av sand. RFID-autentiseringssystemene er enkle å designe og koster billig. Noen skoler og høyskoler bruker i dag RFID-baserte fremmøtesystemer.
I dette prosjektet skal vi designe et RFID-basert bompengeinnkrevingssystem for sikkerhetsformål. Så dette systemet åpner portene og tillater bare personer med autoriserte RFID-koder. Autoriserte ID-er for tagger er programmert i ATMEGA Microcontroller, og bare disse innehaverne har lov til å forlate eller komme inn i lokalet.
Komponenter kreves
Maskinvare: ATmega32 mikrokontroller, strømforsyning (5v), AVR-ISP programmerer, JHD_162ALCD (16x2 LCD-modul), 100uF kondensator (koblet over strømforsyning), knapp, 10KΩ motstand, 100nF kondensator, LED (to deler), EM-18 (RFID lesermodul), L293D motor driver IC, 5V DC motor.
Programvare: Atmel studio 6.1, progisp eller flash magi.
Kretsdiagram og arbeidsforklaring
I RFID-bompengesystemkretsen vist ovenfor, er PORTA på ATMEGA32 koblet til dataporten på LCD-skjermen. Her bør vi huske å deaktivere JTAG-kommunikasjonen i PORTC til ATMEGA ved å endre sikringsbyte, hvis vi ønsker å bruke PORTC som en vanlig kommunikasjonsport. I 16x2 LCD er det 16 pinner overalt hvis det er baklys, hvis det ikke er noe bakgrunnslys, vil det være 14 pinner. Vi kan drive eller la baklyspinnene ligge. Nå i de 14 pinnene er det 8 datapinner (7-14 eller D0-D7), 2 strømforsyningspinner (1 & 2 eller VSS & VDD eller GND & + 5V), 3. pinne for kontrastkontroll (VEE-styrer hvor tykk tegn skal vises), 3 kontrollpinner (RS & RW & E).
I kretsen kan du observere at jeg bare har tatt to kontrollpinner. Dette gir fleksibiliteten til bedre forståelse. Kontrastbiten og LES / SKRIV brukes ikke ofte slik at de kan kortsluttes til bakken. Dette setter LCD i høyest kontrast og lesemodus. Vi trenger bare å kontrollere ENABLE- og RS-pinner for å sende tegn og data tilsvarende.
Tilkoblingene som er laget for LCD, er gitt nedenfor:
PIN1 eller VSS til bakken
PIN2 eller VDD eller VCC til + 5v strøm
PIN3 eller VEE til jord (gir maksimal kontrast best for en nybegynner)
PIN4 eller RS (Register Selection) til PD6 i MCU
PIN5 eller RW (lese / skrive) til bakken (setter LCD i lesemodus letter kommunikasjonen for brukeren)
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 kretsen kan du se at vi har brukt 8bit kommunikasjon (D0-D7). Dette er imidlertid ikke obligatorisk, og vi kan bruke 4-biters kommunikasjon (D4-D7), men med 4-bits kommunikasjonsprogram blir det litt komplisert, så jeg foretrakk 8-bits kommunikasjon.
Så fra bare observasjon av tabellen ovenfor kobler vi 10 pins LCD til kontrolleren der 8 pins er datapinner og 2 pins for kontroll.
Før vi går videre, må vi forstå seriekommunikasjonen. RFID-modulen sender her data til kontrolleren i serie. Den har annen kommunikasjonsmåte, men for enkel kommunikasjon velger vi RS232. RS232-pinnen på modulen er koblet til RXD-pinnen på ATMEGA.
Dataene som sendes av RFID-modulen går som:
Nå for RFID-modulgrensesnittet kreves følgende funksjoner:
1. RXD-pinnen (datamottaksfunksjonen) til kontrolleren må være aktivert.
2. Siden kommunikasjonen er seriell, må vi vite når data-bye mottas, slik at vi kan stoppe programmet til fullstendig byte er mottatt. Dette gjøres ved å aktivere datamottak fullstendig avbrudd.
3. RFID sender data til kontrolleren i 8bit-modus. Så to tegn vil bli sendt til kontrolleren om gangen. Dette er vist i figuren ovenfor.
4. Fra figuren ovenfor er det ingen paritetsbiter, en stoppbit i dataene som sendes av modulen.
Ovennevnte funksjoner er angitt i kontrollerregistrene; vi skal diskutere dem kort,
RØD (RXEN): Denne biten representerer mottaksdata-funksjonen. Denne biten må settes for at dataene fra modulen skal mottas av kontrolleren. Det muliggjør også RXD-pinnen på kontrolleren.
BRUN (RXCIE): Denne biten må settes for å få et avbrudd etter vellykket datamottak. Ved å aktivere denne biten blir vi kjent med det, rett etter at 8 bit data mottas.
PINK (URSEL): Denne biten må settes før du aktiverer andre biter i UCSRC. Etter innstilling må andre nødvendige biter i UCSRC, URSEL deaktiveres eller settes til null.
GUL (UCSZ0, UCSZ1, UCSZ2): Disse tre bitene brukes til å velge antall databiter vi mottar eller sender på en gang.
Siden dataene som sendes av RFID-modulen er 8bit datatype, må vi sette UCSZ0, UCSZ1 til en og UCSZ2 til null.
ORANGE (UMSEL): Denne biten settes ut fra om systemet kommuniserer asynkront (begge bruker annen klokke) eller synkront (begge bruker samme klokke).
Siden modul og kontroller bruker forskjellig klokke, må denne biten settes til null eller være alene, siden de alle er satt til null som standard.
GRØNN (UPM1, UPM0): Disse to bitene justeres basert på bitparitet vi bruker i kommunikasjon.
Siden RFID-modulen sender data uten paritet, har vi satt både UPM1, UPM0 til null, eller de kan være alene da alle biter i alle registre er satt til null som standard.
BLÅ (USBS): Denne biten brukes til å velge antall stoppbiter vi bruker under kommunikasjonen.
Siden RFID-modulen sender data med en stoppbit, må vi bare la USBS-biten være alene.
Nå til slutt må vi sette overføringshastigheten, fra figuren over er det klart at RFID-modulen sender data til kontrolleren med en overføringshastighet på 9600 bps (bits per sekund).
Baudhastigheten stilles inn i kontrolleren ved å velge riktig UBRRH.
UBRRH-verdien velges ved kryssreferanserende baudrate og CPU-krystallfrekvens. Så ved kryssreferanse blir UBRR-verdien sett på som '6', og så settes baudrate.
Nå som vist i figuren, går to pinner fra kontrolleren til L293D, som er en H-BRIDGE som brukes til å kontrollere hastighet og rotasjonsretning for DC-motorer med lav effekt.
L293D er en H-BRIDGE IC designet for å kjøre DC-motorer med lav effekt, og er vist i figur, denne IC består av to h-broer og slik at den kan kjøre to DC-motorer. Så denne IC kan brukes til å kjøre robotmotorer fra signalene fra mikrokontrolleren.
Nå som tidligere diskutert, har denne IC evnen til å endre DC-motorens rotasjonsretning. Dette oppnås ved å kontrollere spenningsnivåene ved INPUT1 og INPUT2.
Aktiver pin |
Inngangsstift 1 |
Inngangsstift 2 |
Motorretning |
Høy |
Lav |
Høy |
Ta til høyre |
Høy |
Høy |
Lav |
Ta til venstre |
Høy |
Lav |
Lav |
Stoppe |
Høy |
Høy |
Høy |
Stoppe |
Så som vist i tabellen ovenfor, for rotasjon med klokken bør 2A være høy og 1A skal være lav. Tilsvarende for mot klokken skal 1A være høy og 2A være lav.
Hver gang et autorisert kort bringes i nærheten av modulen, er motoren programmert til å bevege seg med klokken i et sekund for å vise at bompengeporten er åpnet etter et sekund den kommer tilbake, og forteller at bompengeporten er stengt. Arbeidet med bomstasjon forklares best trinn for trinn i C-koden nedenfor.
Programmering Forklaring
Nedenfor er linjen til linjen forklaring for koden til RFID tollavgiftssystem. Du kan forstå konseptet og arbeidet med dette prosjektet ved å lese koden nedenfor. For å laste ned eller kopiere, finner du den fullstendige koden nederst på siden.
#include // header for å aktivere datastrømskontroll over pins
#define F_CPU 1000000 // forteller kontrollerens krystallfrekvens festet
#inkludere
#define E 5 // gi navn “aktiver” til 5 th pin av PORTD, siden den er koblet til LCD aktivere pin
# define RS 6 // gi navnet “registerselection” til 6 th pin av PORTD, siden den er koblet til LCD RS pin
ugyldig send_a_command (usignert char-kommando);
ugyldig send_a_character (usignert char Character);
ugyldig send_a_string (char * string_of_characters);
int main (ugyldig)
{
DDRA = 0xFF; // sette porta som utgangspinner
DDRD = 0b11111110;
_forsink_ms (50); // gir forsinkelse på 50 ms
DDRB = 0b11110000; // Tar noen portB-pinner som inngang.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // innstilling av overføringshastighet // Følgende inneholder ID for koder, disse må endres for forskjellige koder, Disse må oppdateres for at prosjektet skal fungere
/ * Etter å ha dumpet programmet i kontrolleren må man ta kortene som må godkjennes og få tag-ID-en. Disse oppnås ved å plassere merkelappen i nærheten av RFID-modulen, og ID-en vil vises på skjermen. Etter å ha fått ID-ene, må programmet oppdateres ved å erstatte ID-numrene nedenfor med nye ID-nummer.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Nå ovenfor godkjenner vi bare fem kort, disse kan endres til hvilket som helst nummer.
For eksempel vurdere standardprogrammet er dumpet i kontrolleren, få kortene som skal godkjennes. Plasser den ene etter den andre i nærheten av modulen, du får ID for hver og en som xxxxxxxx (907a4F87), Hvis det er 7 koder vi har, vil vi ha 7 åtte biters ID. * /
// nå for sju kort går det som // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // tildeler minne for å vise ID sendt etter modul int i = 0; int stemme = 0; int k = 0; send_a_command (0x01); // Fjern skjerm 0x01 = 00000001 _forsink_ms (50); send_a_command (0x38); // forteller lcd at vi bruker 8bit kommando / datamodus _forsink_ms (50); send_a_command (0b00001111); // LCD SKJERM PÅ og kurser blinker røye MEM; // tildele minne for å lagre fullstendig ID på taggen send_a_string ("RFID NUMBER"); // sendestreng send_a_command (0x80 + 0x40 + 0); // flytter courser til andre linje mens (1) { mens (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR lagrer de mottatte åtte bits dataene og blir tatt inn i et helt tall. MEM = COUNTA; // de to første tegnene blir oppdatert til minnet itoa (COUNTA, SHOWA, 16); // kommando for å sette variabeltall i LCD (variabelt tall, i hvilket tegn som skal erstattes, hvilken base er variabel (ti her som vi teller nummer i base10)) send_a_string (SHOWA); // ber skjermen om å vise tegn (erstattet av variabelt nummer) til andre person etter å ha plassert kureren på LCD mens (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // tredje og fjerde tegn oppdateres til minnet mens (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // femte og sjette tegn oppdateres til minnet mens (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // syvende og åtte tegn oppdateres til minnet 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)) {// sjekke autorisasjonskjøp som sammenligner to tegn om gangen med tegnene i minnet 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 <
} } ugyldig send_a_command (usignert char-kommando) { PORTA = kommando; PORTD & = ~ (1 <
PORTD - = 1 <
_forsink_ms (50); PORTD & = ~ 1 <
PORTA = 0; } ugyldig send_a_character (usignert tegn) { PORTA = karakter; PORTD - = 1 <
PORTD - = 1 <
_forsink_ms (50); PORTD & = ~ 1 <
PORTA = 0; } ugyldig send_a_string (char * string_of_characters) { mens (* string_of_characters> 0) { send_a_character (* string_of_characters ++); } } |