Tiedämme toimistoissa, ostoskeskuksissa ja monissa muissa paikoissa, joissa vain valtuutuskortilla varustettu henkilö saa tulla huoneeseen. Nämä järjestelmät käyttävät RFID-tietoliikennejärjestelmää. RFID: tä käytetään ostoskeskuksissa varkauksien lopettamiseksi, kun tuotteet on merkitty RFID-sirulla ja kun joku lähtee rakennuksesta RFID-sirulla, hälytys kuuluu automaattisesti. RFID-tunniste on suunniteltu niin pieneksi kuin osa hiekkaa. RFID-todennusjärjestelmät on helppo suunnitella ja ne ovat halpoja. Jotkut koulut ja korkeakoulut käyttävät nykyään RFID-pohjaisia läsnäolojärjestelmiä.
Suunnittelemme tässä projektissa RFID-pohjaisen tietullijärjestelmän turvallisuussyistä. Joten tämä järjestelmä avaa portit ja salli ihmiset vain valtuutetuilla RFID-tunnisteilla. Valtuutettujen tunnisteiden haltijoiden tunnukset on ohjelmoitu ATMEGA-mikrokontrolleriin, ja vain nämä haltijat saavat poistua tai tulla sisään tiloihin.
Tarvittavat komponentit
Laitteisto: ATmega32-mikrokontrolleri, virtalähde (5v), AVR-ISP-ohjelmoija, JHD_162ALCD (16x2 LCD-moduuli), 100uF kondensaattori (kytketty virtalähteen yli), painike, 10KΩ vastus, 100nF kondensaattori, LED (kaksi kappaletta), EM-18 (RFID-lukijamoduuli), L293D-moottoriohjaimen IC, 5 V DC -moottori.
Ohjelmisto: Atmel studio 6.1, progisp tai flash magic.
Piirikaavio ja selitys työstä
Edellä esitetyssä RFID-tietullijärjestelmän piirissä ATMEGA32: n PORTA on kytketty nestekidenäytön dataporttiin. Tässä on syytä muistaa poistaa JTAG-tiedonsiirto PORTC: sta ATMEGA: ksi muuttamalla sulaketavuja, jos haluamme käyttää PORTC: ta normaalina tiedonsiirtoporttina. 16x2 LCD -näytössä on kaikkiaan 16 nastaa, jos taustavaloa on, jos taustavaloa ei ole, on 14 nastaa. Voimme käyttää virtaa tai jättää taustavalon nastat. Nyt 14 nastat on 8 data nastat (7-14 tai D0-D7), 2 virtalähde nastat (1 & 2 tai VSS ja VDD tai GND ja + 5V), 3 rd pin kontrastin säätö (VEE-ohjaimet kuinka paksu merkit), 3 ohjaintappia (RS & RW & E).
Piirissä voit havaita, että olen ottanut vain kaksi ohjaintappia. Tämä antaa joustavuutta ymmärryksen parantamiseen. Kontrastibittiä ja LUKU / KIRJOITA ei käytetä usein, joten ne voidaan oikosulkea maahan. Tämä asettaa LCD-näytön suurimmalle kontrastille ja lukutilaan. Meidän on vain hallittava ENABLE- ja RS-nastoja merkkien ja tietojen lähettämiseksi vastaavasti.
LCD-liitännät ovat alla:
PIN1 tai VSS maahan
PIN2- tai VDD- tai VCC-jännite + 5 V: n tehoon
PIN3 tai VEE maahan (antaa parhaan kontrastin aloittelijalle)
PIN4 tai RS (Rekisteröi valinta) - MC6: n PD6: een
PIN5 tai RW (luku / kirjoitus) maahan (asettaa LCD-näytön lukutilaan helpottamaan viestintää käyttäjälle)
Mikrokontrollerin PIN6 tai E (käytössä) - PD5
PIN7 tai D0 - PA0
PIN8 tai D1 - PA1
PIN9 tai D2 - PA2
PIN10 tai D3 - PA3
PIN11 tai D4 - PA4
PIN12 tai D5 - PA5
PIN13 tai D6 - PA6
PIN14 tai D7 - PA7
Piirissä näet, että olemme käyttäneet 8-bittistä tiedonsiirtoa (D0-D7). Tämä ei kuitenkaan ole pakollista ja voimme käyttää 4-bittistä tiedonsiirtoa (D4-D7), mutta 4-bittisellä tiedonsiirto-ohjelmalla tulee vähän monimutkainen, joten pidin parempana 8-bittistä tiedonsiirtoa.
Joten pelkästään yllä olevan taulukon havainnoinnista yhdistämme 10 LCD-nastaa ohjaimeen, jossa 8 nastaa on datanastoja ja 2 nastaa ohjausta varten.
Ennen eteenpäin siirtymistä meidän on ymmärrettävä sarjaliikenne. Tässä oleva RFID-moduuli lähettää tietoja ohjaimelle sarjaan. Sillä on toinen viestintätapa, mutta viestinnän helpottamiseksi valitsemme RS232: n. Moduulin RS232-nasta on kytketty ATMEGA: n RXD-nastaan.
RFID-moduulin lähettämät tiedot kulkevat seuraavasti:
Nyt jo RFID-moduulin rajapinta, seuraavat ominaisuudet ovat tarpeen:
1. Ohjaimen RXD-nastan (tiedon vastaanottotoiminto) on oltava käytössä.
2. Koska tiedonsiirto on sarjaliikennettä, meidän on tiedettävä aina, kun ohi vastaanotetaan, jotta voimme pysäyttää ohjelman, kunnes täydellinen tavu on vastaanotettu. Tämä tapahtuu sallimalla datan vastaanoton täydellinen keskeytys.
3. RFID lähettää tietoja ohjaimelle 8-bittisessä tilassa. Joten kaksi merkkiä lähetetään ohjaimelle kerrallaan. Tämä on esitetty yllä olevassa kuvassa.
4. Yllä olevasta kuvasta ei ole pariteettibittejä, yksi pysäytysbitti moduulin lähettämässä datassa.
Yllä olevat ominaisuudet asetetaan ohjaimen rekistereihin; keskustelemme niistä lyhyesti,
PUNAINEN (RXEN): Tämä bitti edustaa vastaanottotietojen ominaisuutta. Tämä bitti on asetettava moduulin tietojen vastaanottamiseksi ohjaimelle. Se mahdollistaa myös ohjaimen RXD-nastan.
RUSKEA (RXCIE): Tämä bitti on asetettava keskeytyksen saamiseksi onnistuneen datan vastaanoton jälkeen. Ottamalla tämän bitin käyttöön saamme tietää heti 8-bittisen datan vastaanottamisen jälkeen.
PINK (URSEL): Tämä bitti on asetettava ennen kuin muut bitit otetaan käyttöön UCSRC: ssä. Asetuksen jälkeen muut tarvittavat bitit UCSRC: ssä, URSEL on poistettava käytöstä tai asetettava nollaan.
KELTAINEN (UCSZ0, UCSZ1, UCSZ2): Näillä kolmella bitillä valitaan vastaanotettavien tai lähetettävien databittien määrä kerralla.
Koska RFID-moduulin lähettämä data on 8-bittistä tietotyyppiä, meidän on asetettava UCSZ0, UCSZ1 yhdeksi ja UCSZ2 nollaksi.
ORANGE (UMSEL): Tämä bitti asetetaan sen mukaan, onko järjestelmä yhteydessä asynkronisesti (molemmat käyttävät eri kelloa) vai synkronisesti (molemmat käyttävät samaa kelloa).
Koska moduuli ja ohjain käyttävät eri kelloa, tämä bitti on asetettava nollaksi tai jätettävä yksin, koska ne kaikki on oletusarvoisesti nolla.
VIHREÄ (UPM1, UPM0): Nämä kaksi bittiä säädetään bittipariteetin perusteella, jota käytämme viestinnässä.
Koska RFID-moduuli lähettää dataa ilman pariteettia, olemme asettaneet sekä UPM1: n että UPM0: n nollaksi tai ne voidaan jättää yksin, koska kaikkien rekisterien kaikki bitit ovat oletusarvoisesti nollia.
SININEN (USBS): Tätä bittiä käytetään tiedonsiirron aikana käyttämiemme bittien lukumäärän valitsemiseen.
Koska RFID-moduuli lähettää tietoja yhdellä pysäytysbitillä, meidän on vain jätettävä USBS-bitti yksin.
Viimeinkin meidän on asetettava siirtonopeus, yllä olevasta kuvasta on selvää, että RFID-moduuli lähettää tietoja ohjaimelle 9600 bps: n (bittiä sekunnissa) nopeudella.
Siirtonopeus asetetaan ohjaimessa valitsemalla sopiva UBRRH.
UBRRH-arvo valitaan ristiviittaamalla baudinopeuteen ja CPU: n kidetaajuuteen, joten ristiviittauksella UBRR-arvo nähdään arvona '6', ja siten siirtonopeus asetetaan.
Kuten kuvassa on esitetty, kaksi ohjaimen nastaa menee L293D: lle, joka on H-SILTA, jota käytetään pienitehoisten tasavirtamoottoreiden nopeuden ja pyörimissuunnan ohjaamiseen.
L293D on H-BRIDGE IC, joka on tarkoitettu pienitehoisten tasavirtamoottorien käyttämiseen, ja se on esitetty kuvassa, tämä IC koostuu kahdesta h-sillasta, joten se voi käyttää kahta tasavirtamoottoria. Joten tätä mikropiiriä voidaan käyttää robotin moottoreiden ohjaamiseen mikro-ohjaimen signaaleista.
Kuten aiemmin keskusteltiin, tällä IC: llä on kyky muuttaa tasavirtamoottorin pyörimissuuntaa. Tämä saavutetaan säätämällä jännitetasoja kohdissa INPUT1 ja INPUT2.
Ota PIN-koodi käyttöön |
Tulotappi 1 |
Tulotappi 2 |
Moottorin suunta |
Korkea |
Matala |
Korkea |
Käänny oikealle |
Korkea |
Korkea |
Matala |
Käänny vasemmalle |
Korkea |
Matala |
Matala |
Lopettaa |
Korkea |
Korkea |
Korkea |
Lopettaa |
Joten kuten yllä olevassa taulukossa on esitetty, kellon viisaan pyörimisen tulisi olla 2A ja korkean 1A. Samoin vastapäivään 1A: n tulisi olla korkea ja 2A: n matala.
Aina kun valtuutettu kortti tuodaan moduulin lähelle, moottori ohjelmoidaan liikkumaan myötäpäivään sekunnin ajan, jotta maksuportti avautuu sekunnin kuluttua, kun se palaa ja kertoo, että tietulli on suljettu. Maksullisen aukion toiminta selitetään parhaiten alla annettujen C-koodien askel askeleelta.
Ohjelmoinnin selitys
Alla on rivi riviltä selitys RFID Toll Collection System -koodille. Voit ymmärtää tämän projektin käsitteen ja toiminnan lukemalla alla olevan koodin. Voit ladata tai kopioida koko koodin sivun alaosasta.
#include // header, jotta tiedonsiirron hallinta nastoihin
#define F_CPU 1000000 // kertovan ohjaimen kristallitaajuus liitetty
#sisältää
#define E 5 // antaa nimi ”enable” 5 th pin PORTD, koska se on liitetty LCD mahdollistaa pin
#define RS 6 // antamalla nimen "registerselection" PORTD: n kuudennelle nastalle, koska se on kytketty LCD RS-nastaan
void send_a_command (allekirjoittamaton char-komento);
void send_a_character (allekirjoittamaton merkki);
void send_a_string (char * merkkijono_merkit);
int main (mitätön)
{
DDRA = 0xFF; // porta laitetaan tulostapeiksi
DDRD = 0b11111110;
_delay_ms (50); // 50 ms viive
DDRB = 0b11110000; // Otetaan joitain portB-nastoja syötteenä.
UCSRB - = (1 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // siirtonopeuden asettaminen // Seuraava sisältää tunnisteiden tunnuksen, nämä on vaihdettava eri tunnisteille. Nämä on päivitettävä, jotta projekti toimisi
/ * Kun ohjelma on viety ohjaimeen, on otettava valtuutetut kortit ja hankittava tunnisteiden tunnus. Nämä saadaan asettamalla tunniste lähelle RFID-moduulia ja tunnus näkyy näytöllä. Tunnusten saamisen jälkeen ohjelma on päivitettävä korvaamalla alla olevat tunnusnumerot uusilla.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Valtuutamme nyt vain viisi korttia, jotka voidaan muuttaa mihin tahansa numeroon.
Otetaan esimerkiksi huomioon, että oletusohjelma on kaatunut ohjaimeen, hanki kortit, jotka pitäisi valtuuttaa. Aseta peräkkäin lähellä moduulia, saat kunkin tunnisteen muodossa xxxxxxxx (907a4F87), Jos meillä on 7 tagia, meillä on 7 kahdeksan bitin tunnusta. * /
// nyt seitsemän kortin kohdalla se menee // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)},; // muistin jakaminen moduulilla lähetetyn tunnuksen näyttämiseksi int i = 0; int ääni = 0; int k = 0; send_a_command (0x01); // Tyhjennä ruutu 0x01 = 00000001 viive_ms (50); send_a_command (0x38); // kertoa lcd: lle, että käytämme 8-bittistä komento- / datatilaa viive_ms (50); send_a_command (0b00001111); // LCD-NÄYTTÖ PÄÄLLÄ ja kurssirata vilkkuu char MEM; // varataan muistia tunnisteen täydellisen tunnuksen tallentamiseen send_a_string ("RFID-NUMERO"); // lähetetään merkkijono send_a_command (0x80 + 0x40 + 0); // siirretään kursseri toiselle riville kun taas (1) { kun (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR tallentaa vastaanotetut kahdeksan bitin tiedot ja otetaan kokonaislukuun. MEM = COUNTA; // kaksi ensimmäistä merkkiä päivitetään muistiin itoa (COUNTA, SHOWA, 16); // komento muuttujanumeron asettamiseksi nestekidenäyttöön (muuttujanumero, missä merkissä korvattava, mikä pohja on muuttuja (kymmenen tässä, kun laskemme lukua kannassa10)) send_a_string (SHOWA); // käsketään näyttöä näyttämään toisen henkilön merkki (korvattu muuttuvalla numerolla) sen jälkeen, kun kursseri on sijoitettu LCD-näyttöön kun (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // kolmas ja neljäs merkki päivitetään muistiin kun (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // viides ja kuudes merkki päivitetään muistiin kun (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // seitsemäs ja kahdeksan merkkiä päivitetään muistiin send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
(i = 0; i <5; i ++) { jos ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) {// tarkistetaan valtuutus ostaa vertaamalla kahta merkkiä kerrallaan muistissa oleviin merkkeihin PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); // viive viive_ms (220); viive_ms (220); viive_ms (220); viive_ms (220); viive_ms (220); PORTB - = (1 <
PORTB & = ~ (1 <
viive_ms (220); viive_ms (220); viive_ms (220); viive_ms (220); viive_ms (220); viive_ms (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } void send_a_command (allekirjoittamaton char-komento) { PORTA = komento; PORTD & = ~ (1 <
PORTD - = 1 <
viive_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (allekirjoittamaton merkki) { PORTA = merkki; PORTD - = 1 <
PORTD - = 1 <
viive_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * merkkijono_merkit) { while (* merkkijono_merkit> 0) { send_a_character (* merkkijonon_merkit ++); } } |