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 äänestyskoneen, joka laskee vain todennetut äänet. Tämä tapahtuu käyttämällä RFID (Radio Frequency Identification) -tunnisteita. Tässä kirjoitetaan ATMEGA-ohjelma, jonka avulla vain valtuutetut RFID-tunnisteiden haltijat voivat äänestää. (Tarkista myös tämä yksinkertainen äänestyskonehanke)
Tarvittavat komponentit
Laitteisto: ATMEGA32, virtalähde (5v), AVR-ISP-OHJELMOINTI, JHD_162ALCD (16x2LCD), 100uF kondensaattori (kytketty virtalähteen yli), painike (viisi kappaletta), 10KΩ vastus (viisi kappaletta), 100nF kondensaattori (viisi kappaletta), LED (kaksi kappaletta), EM-18 (RFID-lukijamoduuli).
Ohjelmisto: Atmel studio 6.1, progisp tai flash magic.
Piirikaavio ja selitys
Piirissä ATMEGA32: n PORTA on kytketty nestekidenäytön dataporttiin. Tässä on syytä muistaa poistaa JTAG-tiedonsiirto PORTC: sta ATMEGA: ksi vaihtamalla sulaketavuja, jos halutaan käyttää PORTC: ta normaalina tiedonsiirtoporttina. 16x2 LCD -näytössä on yhteensä 16 nastaa, jos on musta valo, jos taustavaloa ei ole, on 14 nastaa. Voidaan kytkeä päälle 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 merkkien pitäisi olla kuvassa), 3 ohjaintappia (RS & RW & E)
Piirissä voit havaita, että olen ottanut vain kaksi ohjaintappia, mikä antaa joustavuutta ymmärryksen parantamiseen, kontrastibittiä ja READ / WRITE: tä ei käytetä usein, jotta ne voidaan oikosuljettaa 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 (Rekisterivalinta) - PD6 uC: lle
PIN5 tai RW (luku / kirjoitus) maahan (asettaa LCD-näytön lukutilaan helpottamaan viestintää käyttäjälle)
PIN6 tai E (käytössä) - u5: n PD5
U7: n PIN7 tai D0 - PA0
UC: n PIN8 tai D1 - PA1
U9: n PIN9 tai D2 - PA2
U10: n PIN10 tai D3 - PA3
UC: n PIN11 tai D4 - PA4
U12: n PIN12 tai D5 - PA5
UC: n PIN13 tai D6 - PA6
PIN14 tai D7 - PA7 uC: stä
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:
RFID-moduuliliitännän osalta vaaditaan seuraavia ominaisuuksia:
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 kuvan 3 lohkossa
4. Kuviosta 3 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 vastaanottodatatoimintoa, 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ä sen jälkeen kun muut tarvittavat bitit on asetettu 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ä (KUVA 3), 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 (KUVA 3), 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ä (kuva 3), meidän on vain jätettävä USBS-bitti yksin.
Viimeinkin meidän on asetettava siirtonopeus, kuvasta 3 on selvää, että RFID-moduuli lähettää dataa ohjaimelle 9600 bps: n (bittiä sekunnissa) nopeudella.
Siirtonopeus asetetaan ohjaimessa valitsemalla sopiva UBRRH,
UBRRH-arvo valitaan ristiviittaamalla baudinopeutta ja suorittimen kristallitaajuutta,
Joten ristiviittauksella UBRR-arvo nähdään arvona '6', joten siirtonopeus asetetaan.
Tässä on viisi painiketta, neljä ehdokkaiden äänten lisäämiseksi ja viides tarkoittaa ehdokkaiden äänten nollaamista. Tässä olevat kondensaattorit on tarkoitettu painikkeiden pomppimisvaikutuksen mitätöimiseen. Jos ne poistetaan, ohjain saattaa laskea useamman kuin yhden joka kerta, kun painiketta painetaan.
Nastoja varten kytketyt vastukset on tarkoitettu virran rajoittamiseen, kun painiketta painetaan vetämään tappi maahan. Aina kun painiketta painetaan, vastaava ohjaimen tappi vedetään maahan ja siten ohjain tunnistaa, että tiettyä painiketta on painettu ja vastaava suoritettava toimenpide, se voi lisätä ehdokkaiden ääniä tai palauttaa äänet painikkeen painamisesta riippuen.
Kun vastaavaa henkilöä edustavaa painiketta painetaan, ohjain poimii sen ja lisää vastaavan henkilön numeron muistiinsa lisäyksen jälkeen, kun se näyttää vastaavien henkilöiden pistemäärän 16x2 LCD-näytöllä.
Äänestyskoneen toiminta selitetään parhaiten alla annettujen C-koodien vaiheittain:
Koodin selitys
#include // header, jotta tiedonsiirron hallinta nastojen kautta
#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 // antaa nimi ”registerselection” 6 : nnen pin PORTD, sillä kytketään LCD RS pin
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; // Joidenkin portB-nastojen ottaminen syötteeksi.
UCSRB - = (1 <
// tietojen vastaanottamisen täydellinen keskeytys, tietojen vastaanottotapin käyttöönotto
UCSRC - = (1 <
// muiden bittien muuttaminen asettamalla ensin URSEL, asettamalla 8-bittinen tiedonsiirto
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // siirtonopeuden asettaminen
int16_t VOTEA = 0; // henkilö1 ääntä tallentaa muistia
merkki A; // henkilö1 ääntä näyttää merkin LCD-näytöllä
int16_t ÄÄNI = 0;; // henkilö2 ääntä muistin tallentamiseksi
merkki B; // henkilö2 ääntä näyttää merkin LCD-näytöllä
int16_t VOTEC = 0;; // henkilö3 ääntä tallentaa muistia
merkki C; // henkilö3 ääntä näyttää merkin LCD-näytöllä
int16_t ÄÄNESTETTY = 0;; // henkilö4 ääntä, jotka tallentavat muistia
merkki D; / / henkilö 4 ääntä näyttää merkin LCD-näytöllä
// Seuraava sisältää tunnisteiden tunnuksen, ne on vaihdettava eri tunnisteille. Ne on päivitettävä, jotta projekti toimisi
// Kun ohjelma on viety ohjaimeen, on otettava valtuutetut kortit ja hankittava tunnisteiden tunniste. 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)}}; |
Nyt ylhäällä olemme valtuuttaneet vain viisi korttia, jotka voidaan vaihtaa mihin tahansa numeroon, Otetaan esimerkiksi huomioon, että oletusohjelma on kaatunut ohjaimeen, hanki valtuutetut kortit peräkkäin lähelle moduulia, saat jokaisen tunnuksen 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); // kertoo 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; // muistin allokointi tagin täydellisen tunnuksen tallentamiseksi send_a_string ("RFID-NUMERO"); // lähetetään merkkijono send_a_command (0x80 + 0x40 + 0); // kursorin siirtäminen toiselle riville kun taas (1) { kun (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR tallentaa vastaanotetut kahdeksan bittiset 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 <
äänestys = 1; // jos lupa asetettu, äänestä } } if (äänestys == 0) // valtuutus epäonnistui, jos äänestystä ei ole asetettu { UCSRB - = (1 <
} while (äänestys == 1) // tee tämä silmukka äänestykseen asti, jos lupa on annettu { send_a_command (0x80 + 0); // siirry kohtaan nolla rivillä1 send_a_string ("ÄÄNI NYT"); // merkkijono if (bit_is_clear (PINB, 0)) // kun painetaan yhtä painiketta { VOTEA ++; // lisää ensimmäisen henkilön äänimuistia yhdellä ääni = 0; // päästetään silmukan menemään äänestämisen jälkeen } if (bit_is_clear (PINB, 1)) // kun painiketta 2 painetaan { VOTEB ++; // kasvata äänestyksen muisti 2 toinen henkilö kerrallaan ääni = 0; } if (bit_is_clear (PINB, 2)) // kun painiketta 3 painetaan { VOTEC ++; // kasvattaa kolmannen henkilön äänimuistia yhdellä ääni = 0; } if (bit_is_clear (PINB, 3)) // kun painiketta 4 painetaan { Äänesti ++; // kasvata äänestyksen muisti 4 th henkilö kerrallaan ääni = 0; } jos (äänestys == 0) // tyhjennetty saatuaan äänestyksen { send_a_command (0x80 + 0); // siirry rivin1 kohtaan nolla send_a_string ("KIITOS UUDELLEEN"); // näytä merkkijono (k = 0; k <10; k ++) { viive_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // näyttää kaikkien neljän henkilön äänet send_a_string ("A ="); send_a_command (0x80 + 2); itoa (VOTEA, A, 10); send_a_string (A); 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_ merkkijono (C); send_a_command (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_command (0x80 + 0x40 + 10); itoa (ÄÄNESTETTY, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); (k = 0; k <25; k ++) { viive_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // siirtyminen nolla-asentoon send_a_string ("RFID-NUMERO"); // lähetä merkkijono send_a_command (0x80 + 0x40 + 0); } } 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 ++); } } |