Mēs zinām birojos, tirdzniecības centros un daudzās citās vietās, kur telpā drīkst ienākt tikai persona, kurai ir autorizācijas karte. Šīs sistēmas izmanto RFID sakaru sistēmu. RFID tiek izmantots tirdzniecības centros, lai apturētu zādzību, jo produkti ir marķēti ar RFID mikroshēmu, un, kad cilvēks atstāj ēku ar RFID mikroshēmu, automātiski tiek iedarbināta trauksme. RFID tags ir veidots tik mazs kā smilšu daļa. RFID autentifikācijas sistēmas ir viegli projektējamas un to izmaksas ir lētas. Dažās skolās un koledžās mūsdienās tiek izmantotas RFID apmeklēšanas sistēmas.
Šajā projektā mēs izstrādāsim balsošanas mašīnu, kurā tiks skaitīti tikai apstiprināti balsojumi. Tas tiek darīts, izmantojot RFID (radiofrekvenču identifikācijas) tagus. Šeit mēs rakstīsim programmu ATMEGA, kas ļaus balsot tikai autorizētiem RFID tagu īpašniekiem. (Pārbaudiet arī šo vienkāršo balsošanas mašīnas projektu)
Nepieciešamās sastāvdaļas
Aparatūra: ATMEGA32, barošanas avots (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF kondensators (savienots ar barošanas bloku), poga (pieci gabali), 10KΩ rezistors (pieci gabali), 100nF kondensators (pieci gabali), LED (divi gabali), EM-18 (RFID lasītāja modulis).
Programmatūra: Atmel studio 6.1, progisp vai flash magic.
Shēmas shēma un paskaidrojums
Kontūrā ATMEGA32 PORTA ir savienota ar LCD datu portu. Šeit jāatceras atspējot JTAG sakarus PORTC uz ATMEGA, mainot drošinātāju baitus, ja vēlaties PORTC izmantot kā parastu sakaru portu. 16x2 LCD ekrānā kopumā ir 16 tapas, ja ir melna gaisma, ja nav aizmugurējās gaismas, būs 14 tapas. Var darbināt vai atstāt aizmugurējās gaismas tapas. Tagad 14 tapas ir 8 datu tapas (7-14 vai D0-D7), 2 el piegādes tapas (1 un 2 vai VSS un VDD vai GND & + 5v), 3 rd pin kontrasta kontrole (Vee-kontrolē, cik biezu rakstzīmēm jābūt parādīts), 3 vadības tapas (RS & RW & E)
Kontūrā jūs varat novērot, ka esmu paņēmis tikai divus vadības tapas, tas dod labāku izpratnes elastību, kontrasta bits un READ / WRITE netiek bieži izmantoti, lai tos varētu saīsināt. Tas nodrošina LCD kontrasta un lasīšanas režīmu. Mums vienkārši jākontrolē ENABLE un RS tapas, lai atbilstoši nosūtītu rakstzīmes un datus.
LCD savienojumi ir izveidoti zemāk:
PIN1 vai VSS uz zemi
PIN2 vai VDD vai VCC līdz + 5v jaudai
PIN3 vai VEE uz zemes (iesācējam vislabāk nodrošina maksimālu kontrastu)
PIN4 vai RS (Reģistrēt atlasi) līdz uC PD6
PIN5 vai RW (lasīšana / rakstīšana) uz zemi (LCD nodošana lasīšanas režīmā atvieglo saziņu lietotājam)
PIN6 vai E (iespējot) līdz PD5 no uC
UC PIN7 vai D0 līdz PA0
UC PIN8 vai D1 līdz PA1
PIN9 vai D2 līdz PA2 no uC
U10 PIN10 vai D3 līdz PA3
PIN11 vai D4 līdz PA4 no uC
UC PIN12 vai D5 līdz PA5
UC PIN13 vai D6 līdz PA6
PIN14 vai D7 līdz PA7 no uC
Ķēdē var redzēt, ka esam izmantojuši 8 bitu sakarus (D0-D7). Tomēr tas nav obligāti, un mēs varam izmantot 4 bitu sakarus (D4-D7), bet ar 4 bitu sakaru programma kļūst mazliet sarežģīta, tāpēc es izvēlējos 8 bitu komunikāciju.
Tātad, tikai novērojot iepriekšminēto tabulu, mēs savienojam 10 LCD tapas ar kontrolieri, kurā 8 tapas ir datu tapas un 2 tapas kontrolei.
Pirms virzīties uz priekšu, mums ir jāsaprot sērijveida sakari. RFID modulis šeit nosūta datus kontrolierim sērijveidā. Tam ir cits saziņas veids, taču ērtai saziņai mēs izvēlamies RS232. Moduļa RS232 tapa ir savienota ar ATMEGA RXD tapu.
RFID moduļa sūtītie dati notiek šādi:
Tagad RFID moduļa saskarnei ir nepieciešamas šādas funkcijas:
1. Jāaktivizē kontrollera RXD tapa (datu saņemšanas funkcija).
2. Tā kā saziņa ir sērijveida, mums jāzina ikreiz, kad tiek saņemts datu atvadīšanās, lai mēs varētu pārtraukt programmu, līdz tiek saņemts pilnīgs baits. Tas tiek darīts, ļaujot datiem saņemt pilnīgu pārtraukumu.
3. RFID nosūta datus kontrolierim 8 bitu režīmā. Tātad kontrolierim vienlaikus tiks nosūtītas divas rakstzīmes. Tas parādīts 3. attēla blokā
4. No 3. attēla moduļa sūtītajos datos nav paritātes bitu, viena pieturas bita.
Iepriekš minētās funkcijas ir iestatītas kontrolieru reģistros; mēs tos īsi apspriedīsim,
RED (RXEN): Šis bits apzīmē datu saņemšanas funkciju, šis bits ir jāiestata, lai datus no moduļa saņemtu kontrolieris, tas arī ļauj kontroliera RXD tapu.
BROWN (RXCIE): Šis bits ir jāiestata, lai pēc veiksmīgas datu saņemšanas tiktu pārtraukts. Iespējojot šo bitu, mēs uzzinām uzreiz pēc 8 bitu datu saņemšanas.
PINK (URSEL): Šis bits ir jāiestata pirms citu bitu iespējošanas UCSRC, pēc citu nepieciešamo bitu iestatīšanas UCSRC; URSEL ir jāatspējo vai jānorāda uz nulli.
DZELTENS (UCSZ0, UCSZ1, UCSZ2): Šie trīs biti tiek izmantoti, lai atlasītu saņemamo vai nosūtīto datu bitu skaitu vienā piegājienā.
Tā kā RFID moduļa sūtītie dati ir 8 bitu datu tips (3. Attēls), mums UCSZ0, UCSZ1 jāiestata uz vienu un UCSZ2 uz nulli.
ORANGE (UMSEL): Šis bits tiek iestatīts, pamatojoties uz to, vai sistēma sazinās asinhroni (abi izmanto atšķirīgu pulksteni) vai sinhroni (abi izmanto to pašu pulksteni),
Tā kā modulis un kontrolieris izmanto atšķirīgu pulksteni, šis bits ir jāiestata uz nulli vai jāatstāj atsevišķi, jo pēc noklusējuma tie visi ir iestatīti uz nulli.
ZAĻŠ (UPM1, UPM0): Šie divi biti tiek pielāgoti, pamatojoties uz bitu paritāti, kuru izmantojam saziņā.
Tā kā RFID modulis sūta datus bez paritātes (3. Attēls), mēs esam iestatījuši gan UPM1, gan UPM0 uz nulli, vai arī tos var atstāt atsevišķi, jo visi biti visos reģistros pēc noklusējuma ir iestatīti uz nulli.
ZILA (USBS): Šis bits tiek izmantots, lai izvēlētos pieturas bitu skaitu, ko izmantojam saziņas laikā.
Tā kā RFID modulis nosūta datus ar vienu pieturas bitu (3. attēls), mums vienkārši jāatstāj USBS bits atsevišķi.
Tagad beidzot mums jāiestata datu pārraides ātrums, no 3. attēla ir skaidrs, ka RFID modulis kontrolierim nosūta datus ar 9600 bitu (bitu sekundē) datu pārraides ātrumu.
Pārraides ātrums tiek iestatīts kontrolierī, izvēloties atbilstošo UBRRH,
UBRRH vērtību izvēlas, savstarpēji atsaucoties uz datu pārraides ātrumu un procesora kristāla frekvenci,
Tātad, izmantojot savstarpēju atsauci, UBRR vērtība tiek uzskatīta par “6”, un tāpēc tiek iestatīts datu pārraides ātrums.
Šeit ir piecas pogas, četras - kandidātu balsu palielināšanai, bet piektā - kandidātu balsu atiestatīšanai uz nulli. Šeit esošie kondensatori ir paredzēti pogu atlēcošās iedarbības atcelšanai. Ja tie tiek noņemti, kontrolieris katru reizi, nospiežot pogu, var saskaitīt vairāk nekā vienu.
Piespraudes savienotie rezistori ir paredzēti strāvas ierobežošanai, kad tiek nospiesta poga, lai tapu nolaistu zemē. Ikreiz, kad tiek nospiesta poga, attiecīgais kontrollera kontakts tiek novilkts uz zemes un tādējādi kontrolieris atpazīst, ka ir nospiesta noteikta poga un jāveic atbilstoša darbība, tas var palielināt kandidātu balsis vai balsu atiestatīšanu atkarībā no nospiežamās pogas.
Kad tiek nospiesta attiecīgās personas poga, kontrolieris to izvēlas un palielina attiecīgās personas numuru atmiņā pēc tam, kad tā palielina 16x2 LCD displejā.
Balsošanas mašīnas darbību vislabāk var izskaidrot tālāk sniegtā C koda soli pa solim:
Kods Paskaidrojums
#include // header, lai iespējotu datu plūsmas kontroli pār tapām
#define F_CPU 1000000 // pievienota stāsta kontroliera kristāla frekvence
# iekļaut
#define E 5 // norādot vārdu "ļauj" 5 th pin PORTD, jo tas ir saistīts ar LCD ļautu pin
#define RS 6 // piešķirot nosaukumu "registerselection", 6 th pin PORTD, jo ir saistīta ar LCD RS pin
void send_a_command (neparakstīta char komanda);
void send_a_character (neparakstīta rakstzīme);
void send_a_string (char * string_of_characters);
int main (anulēts)
{
DDRA = 0xFF; // porta ievietošana kā izvades tapas
DDRD = 0b11111110;
_delay_ms (50); // dodot 50ms kavēšanos
DDRB = 0b11110000; // Dažas portB tapas tiek izmantotas kā ievade.
UCSRB - = (1 <
// iespējot datu saņemšanas pilnīgu pārtraukumu, iespējot datu saņemšanas piespraudi
UCSRC - = (1 <
// citu bitu maiņa, vispirms iestatot URSEL, iestatot 8 bitu komunikācijai
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // datu pārraides ātruma iestatīšana
int16_t VOTEA = 0; // persona1 balsis saglabā atmiņu
char A; // persona1 balsis, parādot rakstzīmi LCD
int16_t VOTEB = 0;; // persona2 balsis saglabā atmiņu
char B; // persona2 balsis, parādot rakstzīmi LCD
int16_t VOTEC = 0;; // persona3 balsis glabā atmiņu
char C; // persona3 balsis, parādot rakstzīmi LCD
int16_t BALSOTS = 0;; // persona4 balsis glabā atmiņu
char D; / / person4 balsis, parādot rakstzīmi LCD
// Tālāk ir tagu ID, tie ir jāmaina dažādiem tagiem. Tie jāatjaunina, lai projekts darbotos
// Pēc programmas izmetšanas kontrolierī ir jāņem kartes, kurām jābūt autorizētām, un jāiegūst tagu ID, tās iegūst, novietojot tagu pie RFID moduļa, un ID tiks parādīts ekrānā. Pēc ID iegūšanas programma jāatjaunina, zemāk minētos ID numurus aizstājot ar jauniem ID numuriem.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Tagad augšpusē mēs autorizējam tikai piecas kartes, tās var mainīt uz jebkuru numuru, Piemēram, ņemiet vērā, ka noklusējuma programma tiek izmesta kontrolierī, iegūstiet kartes, kurām vajadzētu būt autorizētām, ievietot viena pēc otras pie moduļa, katrai no tām jūs saņemsiet ID kā xxxxxxxx (907a4F87), Ja mums ir 7 tagi, mums būs 7 astoņu bitu ID.
// tagad septiņām kartēm tas iet kā // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)};; // piešķir atmiņu, lai parādītu ID, ko sūta modulis int i = 0; int balsojums = 0; int k = 0; send_a_komanda (0x01); // Notīrīt ekrānu 0x01 = 00000001 _kavējums_ms (50); send_a_command (0x38); // pateikt LCD, ka mēs izmantojam 8 bitu komandu / datu režīmu _kavējums_ms (50); send_a_command (0b00001111); // LCD ekrāns ir ieslēgts un kursors mirgo char MEM; // atmiņas piešķiršana, lai saglabātu pilnīgu taga ID send_a_string ("RFID NUMBER"); // sūtīšanas virkne send_a_command (0x80 + 0x40 + 0); // kurjera pārvietošana uz otro rindu kamēr (1) { kamēr (! (UCSRA & (1 <
{ } COUNTA = UDR; // UDR uzglabā saņemtos astoņu bitu datus un tiek ņemts vesels skaitlis. MEM = COUNTA; // pirmās divas rakstzīmes tiek atjauninātas atmiņā itoa (COUNTA, SHOWA, 16); // komanda mainīgā skaitļa ievietošanai LCD (mainīgais skaitlis, kurā rakstā aizstāt, kura bāze ir mainīga (šeit ir desmit, jo skaitām skaitli base10)) send_a_string (SHOWA); // liekot displejam parādīt otrās personas rakstzīmi (aizstātu ar mainīgu numuru) pēc kurzera novietošanas uz LCD kamēr (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // trešā un ceturtā rakstzīme tiek atjaunināta atmiņā kamēr (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // piektās un sestās rakstzīmes tiek atjauninātas atmiņā kamēr (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // septītā un astoņas rakstzīmes tiek atjauninātas atmiņā send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
par (i = 0; i <5; i ++) { ja ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) {// pārbaudot autorizāciju, pērciet, salīdzinot divas rakstzīmes vienlaikus ar atmiņā esošajām rakstzīmēm PORTB - = (1 <
balsojums = 1; // ja ir atļauts, iestatiet VOTE } } if (balsojums == 0) // autorizācija neizdevās, ja balss nav iestatīta { UCSRB - = (1 <
} while (balsojums == 1) // veiciet šo ciklu līdz balsošanai, ja tas ir atļauts { send_a_command (0x80 + 0); // dodieties uz nulles pozīciju 1. rindā send_a_string ("BALSOT TŪLĪT"); // parāda virkni if (bit_is_clear (PINB, 0)) //, kad tiek nospiesta pirmā poga { VOTEA ++; // palielina pirmās personas balss atmiņu par vienu balsojums = 0; // ļaut, kamēr cilpa iet pēc balsošanas } if (bit_is_clear (PINB, 1)) //, nospiežot pogu 2 { VOTEB ++; // pieauguma balsu atmiņā 2 nd personai pa vienam balss = 0; } if (bit_is_clear (PINB, 2)) //, nospiežot pogu 3 { VOTEC ++; // pieauguma balsu atmiņā 3 rd personas pa vienam balss = 0; } if (bit_is_clear (PINB, 3)) //, kad tiek nospiesta poga 4 { BALSOJA ++; // pieauguma balsu atmiņas par 4 th persona ar vienu balss = 0; } ja (balsojums == 0) // noskaidrots pēc saņemtā balsojuma { send_a_command (0x80 + 0); // pāriet uz 1. līnijas nulles pozīciju send_a_string ("PALDIES U PAR BALSOJUMU"); // parādīt virkni par (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_komanda (0x01); send_a_komanda (0x80 + 0); // parādot visu četru personu balsis send_a_string ("A ="); send_a_komanda (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_string (C); send_a_command (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_command (0x80 + 0x40 + 10); itoa (BALSOTS, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); par (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_komanda (0x01); send_a_command (0x80 + 0); // pāriet uz nulles pozīciju send_a_string ("RFID NUMBER"); // nosūtīt virkni send_a_command (0x80 + 0x40 + 0); } } void send_a_command (neparakstīta char komanda) { PORTA = komanda; PORTD & = ~ (1 <
PORTD - = 1 <
_kavējums_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_character (neparakstīta rakstzīme) { PORTA = raksturs; PORTD - = 1 <
PORTD - = 1 <
_kavējums_ms (50); PORTD & = ~ 1 <
PORTA = 0; } void send_a_string (char * string_of_characters) { while (* rakstzīmju virkne> 0) { send_a_character (* rakstzīmju virkne ++); } } |