Alam namin sa mga tanggapan, shopping mall at sa iba pang mga lugar kung saan ang taong may authorization card lamang ang pinapayagang pumasok sa silid. Ang mga system na ito ay gumagamit ng RFID system ng komunikasyon. Ginagamit ang RFID sa mga shopping mall upang ihinto ang pagnanakaw dahil ang mga produkto ay naka-tag sa RFID chip at kapag ang isang tao ay umalis sa gusali gamit ang RFID chip ang isang alarma ay awtomatikong itataas. Ang tag ng RFID ay dinisenyo kasing liit ng bahagi ng buhangin. Ang mga sistema ng pagpapatotoo ng RFID ay madaling idisenyo at mura sa gastos. Ang ilang mga paaralan at kolehiyo sa ngayon ay gumagamit ng mga sistema ng pagdalo batay sa RFID.
Sa proyektong ito ay magdidisenyo kami ng isang makina ng pagboto na binibilang lamang ang mga napatunayan na boto. Ginagawa ito sa pamamagitan ng paggamit ng mga tag ng RFID (Identity Frequency ng Frequency). Sususulat kami dito ng isang programa para sa ATMEGA para sa pagpapahintulot sa mga may-ari lamang ng mga may hawak ng tag ng RFID na bumoto. (Suriin din ang simpleng proyekto ng machine sa pagboto)
Kinakailangan ang Mga Bahagi
Hardware: ATMEGA32, power supply (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF capacitor (konektado sa buong power supply), pindutan (limang piraso), 10KΩ risistor (limang piraso), 100nF capacitor (limang piraso), LED (dalawang piraso), EM-18 (module ng mambabasa ng RFID).
Software: Atmel studio 6.1, progisp o flash magic.
Circuit Diagram at Paliwanag
Sa circuit PORTA ng ATMEGA32 ay konektado sa data port ng LCD. Narito dapat tandaan na huwag paganahin ang komunikasyon ng JTAG sa PORTC sa ATMEGA sa pamamagitan ng pagbabago ng mga byte ng fuse, kung nais na gamitin ang PORTC bilang isang normal na port ng komunikasyon. Sa 16x2 LCD mayroong 16 na pin sa pangkalahatan kung mayroong isang itim na ilaw, kung walang ilaw sa likod ay magkakaroon ng 14 na mga pin. Maaari ng isang tumakbo o iwanan ang mga light light pin. Ngayon sa 14 na pin mayroong 8 data pin (7-14 o D0-D7), 2 power supply pin (1 & 2 o VSS & VDD o gnd & + 5v), 3 rd pin para sa control ng kaibahan (kinokontrol ng VEE kung gaano dapat makapal ang mga character ipinakita), 3 control pin (RS & RW & E)
Sa circuit, maaari mong obserbahan na kumuha lamang ako ng dalawang control pin, ito ay nagbibigay ng kakayahang umangkop ng mas mahusay na pag-unawa, ang kaibahan bit at READ / WRITE ay hindi madalas na ginagamit upang maaari silang maiksi sa lupa. Inilalagay nito ang LCD sa pinakamataas na kaibahan at mode na basahin. Kailangan lang naming makontrol ang Mga PIN na INABAYAHAN at RS upang magpadala ng mga character at data nang naaayon.
Ang mga koneksyon na tapos para sa LCD ay ibinibigay sa ibaba:
PIN1 o VSS sa lupa
Ang PIN2 o VDD o VCC sa + 5v na lakas
PIN3 o VEE sa lupa (nagbibigay ng pinakamataas na maximum na kaibahan para sa isang nagsisimula)
PIN4 o RS (Pagpili ng Rehistro) sa PD6 ng uC
Ang PIN5 o RW (Basahin / Isulat) sa ground (inilalagay ang LCD sa read mode ay pinapagaan ang komunikasyon para sa gumagamit)
PIN6 o E (Paganahin) sa PD5 ng uC
PIN7 o D0 hanggang PA0 ng uC
PIN8 o D1 hanggang PA1 ng uC
PIN9 o D2 hanggang PA2 ng uC
PIN10 o D3 hanggang PA3 ng uC
PIN11 o D4 hanggang PA4 ng uC
PIN12 o D5 hanggang PA5 ng uC
PIN13 o D6 hanggang PA6 ng uC
PIN14 o D7 hanggang PA7 ng uC
Sa circuit, makikita mong gumamit kami ng 8bit na komunikasyon (D0-D7). Gayunpaman hindi ito isang sapilitan at maaari kaming gumamit ng 4bit na komunikasyon (D4-D7) ngunit sa 4 na bit na programa ng komunikasyon ay naging medyo kumplikado, kaya't ginusto ko ang 8 bit na komunikasyon.
Kaya't mula sa pagmamasid lamang sa talahanayan sa itaas ay kumokonekta kami ng 10 mga pin ng LCD sa controller kung saan ang 8 mga pin ay mga pin ng data at 2 mga pin para sa kontrol.
Bago magpatuloy, kailangan nating maunawaan ang tungkol sa serial na komunikasyon. Ang module na RFID dito ay nagpapadala ng data sa controller sa serial. Mayroon itong iba pang mode ng komunikasyon ngunit para sa madaling komunikasyon pinili namin ang RS232. Ang pin na RS232 ng module ay konektado sa RXD pin ng ATMEGA.
Ang data na ipinadala ng module ng RFID ay napupunta sa:
Ngayon para sa interface ng module ng RFID, kinakailangan ang mga sumusunod na tampok:
1. Ang RXD pin (tampok na tumatanggap ng data) ng controller ay dapat na paganahin.
2. Dahil ang komunikasyon ay serial kailangan nating malaman tuwing natanggap ang data bye, upang mapahinto namin ang programa hanggang sa matanggap ang kumpletong byte. Ginagawa ito sa pamamagitan ng pagpapagana ng isang data na makatanggap ng kumpletong pagkagambala.
3. Ang RFID ay nagpapadala ng data sa controller sa 8bit mode. Kaya't dalawang character ang ipapadala sa controller nang paisa-isa. Ipinapakita ito sa bloke ng figure3
4. Mula sa figure3, walang mga parity bits, isang stop bit sa data na ipinadala ng module.
Ang mga tampok sa itaas ay nakatakda sa mga rehistro ng controller; tatalakayin natin sila nang maikli,
RED (RXEN): Ang bit na ito ay kumakatawan sa pagtanggap ng tampok na data, ang bit na ito ay dapat itakda para sa data mula sa module na matatanggap ng controller, nagbibigay-daan din ito sa RXD pin ng controller.
BROWN (RXCIE): Ang bit na ito ay dapat itakda para makagambala pagkatapos ng matagumpay na pagtanggap ng data. Sa pamamagitan ng pagpapagana ng kaunting ito ay nalalaman natin, pagkatapos ng pagtanggap ng 8 bit na data.
PINK (URSEL): Ang bit na ito ay dapat itakda bago paganahin ang iba pang mga piraso sa UCSRC, pagkatapos magtakda ng iba pang mga kinakailangang piraso sa UCSRC; Ang URSEL ay dapat na hindi paganahin o ilagay sa zero.
YELLOW (UCSZ0, UCSZ1, UCSZ2): Ang tatlong mga piraso na ito ay ginagamit para sa pagpili ng bilang ng mga data bit na natatanggap namin o nagpapadala sa isang solong paglalakbay.
Dahil ang data na ipinadala ng module ng RFID ay 8bit na uri ng data (FIGURE3), kailangan naming itakda ang UCSZ0, UCSZ1 sa isa at UCSZ2 sa zero.
ORANGE (UMSEL): Ang bit na ito ay itinakda batay sa kung ang system ay nakikipag-usap nang hindi magkakasabay (parehong gumagamit ng iba't ibang orasan) o magkakasabay (parehong gumagamit ng parehong orasan),
Dahil ang module at controller ay gumagamit ng iba't ibang orasan, ang bit na ito ay dapat itakda sa zero o iwanang mag-isa dahil ang lahat ay nakatakda sa zero bilang default.
GREEN (UPM1, UPM0): Ang dalawang piraso na ito ay nababagay batay sa bit parity na ginagamit namin sa komunikasyon.
Dahil ang module ng RFID ay nagpapadala ng data na walang pagkakapareho (FIGURE3), itinakda namin ang parehong UPM1, UPM0 hanggang zero o maiiwan silang nag-iisa dahil ang lahat ng mga piraso sa anumang rehistro ay nakatakda sa zero bilang default.
BLUE (USBS): Ginagamit ang bit na ito para sa pagpili ng bilang ng mga stop bits na ginagamit namin habang nakikipag-usap.
Dahil ang module ng RFID ay nagpapadala ng data na may isang stop bit (figure3), kailangan lang naming iwanang mag-isa ang USBS.
Ngayon sa wakas kailangan naming itakda ang rate ng baud, mula sa figure3 malinaw na ang module ng RFID ay nagpapadala ng data sa controller na may rate ng baud na 9600bps (mga bit bawat segundo).
Ang rate ng baud ay nakatakda sa controller sa pamamagitan ng pagpili ng naaangkop na UBRRH,
Ang halaga ng UBRRH ay napili ng cross refer baud rate at CPU crystal frequency,
Kaya sa pamamagitan ng cross reference na halaga ng UBRR ay nakikita bilang '6', at sa gayon ang rate ng baud ay itinakda.
Mayroong limang mga pindutan na naroroon dito, apat para sa pagdaragdag ng mga boto ng mga kandidato at ikalima ay para sa pag-reset ng mga boto ng mga kandidato sa zero. Ang mga capacitor na naroroon dito ay para sa pagpapawalang bisa ng bouncing effect ng mga pindutan. Kung sila ay tinanggal ang controller ay maaaring bilangin ang higit sa isa sa bawat oras na ang pindutan ay pinindot.
Ang mga resistor na konektado para sa mga pin ay para sa paglilimita sa kasalukuyang, kapag pinindot ang pindutan upang hilahin ang pin sa lupa. Kailan man pinindot ang isang pindutan, Ang kaukulang pin ng magsusupil ay mahihila pababa sa lupa at sa gayon kinikilala ng tagapamahala na ang ilang mga pindutan ay pinindot at kaukulang aksyon na gagawin, maaaring ito ay nagdaragdag ng mga boto ng kandidato o pag-reset ng mga boto depende sa pindutan na pinindot.
Kapag ang pindutan na kumakatawan sa isang kaukulang tao ay pinindot, pipiliin ito ng Controller at palakihin ang kaukulang numero ng tao sa loob ng memorya nito pagkatapos ng pagtaas na ipinapakita nito ang katumbas na marka ng mga tao sa display na 16x2 LCD.
Ang pagtatrabaho ng voting machine ay pinakamahusay na ipinaliwanag sa hakbang-hakbang ng C code na ibinigay sa ibaba:
Paliwanag sa Code
#include // header upang paganahin ang kontrol ng daloy ng data sa mga pin
# tukuyin ang F_CPU 1000000 // nagsasabi na naka-attach ang dalas ng kristal na Controller
# isama
#define E 5 // pagbibigay ng pangalang "paganahin" sa ika- 5 na pin ng PORTD, dahil Nakakonekta ito sa LCD paganahin ang pin
#define RS 6 // pagbibigay ng pangalang " registroelection " sa ika- 6 na pin ng PORTD, dahil nakakonekta sa LCD RS pin
walang bisa ang send_a_command (unsigned char command);
walang bisa ang send_a_character (unsigned char character);
walang bisa ang send_a_string (char * string_of_character);
int main (walang bisa)
{
DDRA = 0xFF; // paglalagay ng porta bilang mga output pin
DDRD = 0b11111110;
_delay_ms (50); // pagbibigay ng pagkaantala ng 50ms
DDRB = 0b11110000; // Pagkuha ng ilang mga portB pin bilang input.
UCSRB - = (1 <
// pagpapagana ng data makatanggap ng kumpletong abala, pagpapagana ng data na makatanggap ng pin
UCSRC - = (1 <
// pagbabago ng iba pang mga piraso sa pamamagitan ng unang setting ng URSEL, setting para sa 8 bit na komunikasyon
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // pagtatakda ng rate ng baud
int16_t VOTEA = 0; // person1 votes na nagtatago ng memorya
char A; // person1 na mga boto na nagpapakita ng character sa LCD
int16_t VOTEB = 0;; // person2 votes na nagtatago ng memorya
char B; // person2 votes na nagpapakita ng character sa LCD
int16_t VOTEC = 0;; // person3 votes na nagtatago ng memorya
char C; // person3 na mga boto na nagpapakita ng character sa LCD
int16_t VOTED = 0;; // person4 votes na nagtatago ng memorya
char D; / / person4 na mga boto na nagpapakita ng character sa LCD
// Ang sumusunod ay naglalaman ng mga ID ng mga tag, dapat baguhin ang mga ito para sa iba't ibang mga tag, Dapat itong i-update para gumana ang proyekto
// Matapos itapon ang programa sa tagapamahala dapat kunin ang mga kard na dapat pahintulutan at makuha ang mga tag ID, nakuha ang mga ito sa pamamagitan ng paglalagay ng tag na malapit sa module na RFID at ipapakita ang ID sa screen. Matapos makuha ang mga ID, dapat i-update ang programa sa pamamagitan ng pagpapalit ng mga numero sa ibaba ng ID ng mga bagong numero ng ID.
char ADMIT = {{(0x97), (0xa1), (0x90), (0x92)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x96)}}; |
Ngayon sa itaas pinapahintulutan namin ang limang card lamang, ang mga ito ay maaaring mabago sa anumang numero, Halimbawa isaalang-alang ang default na programa ay itinapon sa controller, kunin ang mga kard na dapat pahintulutan na ilagay ang isa pagkatapos ng iba pang malapit sa module, makakakuha ka ng ID para sa bawat isa bilang xxxxxxxx (907a4F87), Kung mayroong 7 mga tag na mayroon kami, magkakaroon kami ng 7 walong bit ID.
// ngayon para sa pitong card na napupunta ito // char ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)}, // allotting memory para sa pagpapakita ng ID na ipinadala ng module int i = 0; int vote = 0; int k = 0; send_a_command (0x01); // Clear Screen 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // pagsasabi sa lcd gumagamit kami ng 8bit command / data mode _delay_ms (50); send_a_command (0b00001111); // LCD SCREEN ON at kumikislap na kurso char MEM; // allotting memory upang mag-imbak ng kumpletong ID ng tag send_a_string ("RFID NUMBER"); // send string send_a_command (0x80 + 0x40 + 0); // paglipat ng courser sa pangalawang linya habang (1) { habang (! (UCSRA & (1 <
{ } Ang COUNTA = UDR; // UDR ay nag-iimbak ng walong bit na data na natanggap at kinuha sa isang integer. MEM = COUNTA; // unang dalawang character ay na-update sa memorya itoa (COUNTA, SHOWA, 16); // utos para sa paglalagay ng variable number sa LCD (variable number, kung aling character ang papalitan, aling base ay variable (sampung dito habang binibilang namin ang numero sa base10)) send_a_string (SHOWA); // pagsabi sa display upang ipakita ang character (pinalitan ng variable number) ng pangalawang tao pagkatapos iposisyon ang courser sa LCD habang (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ang pangatlo at pang-apat na character ay na-update sa memorya habang (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ikalima at ikaanim na character ay na-update sa memorya habang (! (UCSRA & (1 <
{ } COUNTA = UDR; itoa (COUNTA, SHOWA, 16); send_a_string (SHOWA); MEM = COUNTA; // ikapito at walong mga character ang na-update sa memorya send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB & = ~ (1 <
para sa (i = 0; i <5; i ++) { kung ((MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT) & (MEM == ADMIT)) {// pagsuri para sa pahintulot bumili bumili ng paghahambing ng dalawang character nang paisa-isa sa mga character sa memorya PORTB - = (1 <
bumoto = 1; // kung may pahintulot na itakda ang VOTE } } kung (bumoto == 0) // bigo ang pahintulot kung ang boto ay hindi nakatakda { UCSRB - = (1 <
} habang (bumoto == 1) // gawin ang loop na ito hanggang sa bumoto, kung pinahintulutan { send_a_command (0x80 + 0); // pumunta sa posisyon na zero sa line1 send_a_string ("VOTE NGAYON"); // pagpapakita ng string kung (bit_is_clear (PINB, 0)) // kapag ang isang pindutan ay pinindot { VOTEA ++; // dagdagan ang memorya ng boto ng unang tao nang isa bumoto = 0; // pagpapaalam habang nagpapatakbo pagkatapos ng pagboto } kung (bit_is_clear (PINB, 1)) // kapag pinindot ang pindutan 2 { VOTEB ++; // dagdagan ang memorya ng boto ng 2 nd tao nang paisa-isa bumoto = 0; } kung (bit_is_clear (PINB, 2)) // kapag pinindot ang pindutan 3 { VOTEC ++; // dagdagan ang memorya ng boto ng 3 rd tao nang isa-isa bumoto = 0; } kung (bit_is_clear (PINB, 3)) // kapag pinindot ang pindutan 4 { VOTED ++; // increment the vote memory of 4 th person by one bumoto = 0; } kung (bumoto == 0) // na-clear pagkatapos ng natanggap na boto { send_a_command (0x80 + 0); // lumipat sa posisyon na zero ng line1 send_a_string ("THANK U FOR VOTE"); // display string para sa (k = 0; k <10; k ++) { _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // pagpapakita ng mga boto ng lahat ng apat na tao 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_string (C); send_a_command (0x80 + 0x40 + 8); send_a_string ("D ="); send_a_command (0x80 + 0x40 + 10); itoa (VOTED, D, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); para sa (k = 0; k <25; k ++) { _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // paglipat sa zero na posisyon send_a_string ("RFID NUMBER"); // magpadala ng isang string send_a_command (0x80 + 0x40 + 0); } } void send_a_command (unsigned char command) { PORTA = utos; PORTD & = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } walang bisa ang send_a_character (unsigned char character) { PORTA = character; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
PORTA = 0; } walang bisa ang send_a_string (char * string_of_character) { habang (* string_of_character> 0) { send_a_character (* string_of_character ++); } } |