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 RFID batay sa sistema ng pagkolekta ng toll para sa mga layunin sa seguridad. Kaya't ang sistemang ito ay magbubukas ng mga pintuan at papayagan lamang ang mga tao na may mga pinahintulutang RFID tag. Ang mga pinapahintulutang tag ID ng mga naka-program sa ATMEGA Microcontroller at ang mga may-ari lamang ang pinapayagan na umalis o pumasok sa mga lugar.
Kinakailangan ang Mga Bahagi
Hardware: ATmega32 microcontroller, power supply (5v), AVR-ISP Programmer, JHD_162ALCD (16x2 LCD module), 100uF capacitor (konektado sa buong power supply), pindutan, 10KΩ resistor, 100nF capacitor, LED (dalawang piraso), EM-18 (RFID reader module), L293D motor driver IC, 5V DC motor.
Software: Atmel studio 6.1, progisp o flash magic.
Circuit Diagram at Paggawa ng Paliwanag
Sa circuit ng sistema ng koleksyon ng toll ng RFID na ipinakita sa itaas, ang PORTA ng ATMEGA32 ay konektado sa port ng data ng LCD. Narito dapat nating tandaan na huwag paganahin ang komunikasyon ng JTAG sa PORTC sa ATMEGA sa pamamagitan ng pagbabago ng fuse bytes, kung nais nating gamitin ang PORTC bilang isang normal na port ng komunikasyon. Sa 16x2 LCD, mayroong 16 na pin sa lahat kung mayroong back light, kung walang back light magkakaroon ng 14 na pin. Maaari naming i-power o iwanan ang mga back 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 kakapal ang dapat ipakita ang mga character), 3 control pin (RS & RW & E).
Sa circuit, maaari mong obserbahan na kumuha lamang ako ng dalawang control pin. Nagbibigay ito ng kakayahang umangkop ng mas mahusay na pag-unawa. Ang kaibahan ng kaunti at BASAHIN / Sumulat 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 ginawa 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 MCU
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 Microcontroller
PIN7 o D0 hanggang PA0
PIN8 o D1 hanggang PA1
PIN9 o D2 hanggang PA2
PIN10 o D3 hanggang PA3
PIN11 o D4 hanggang PA4
PIN12 o D5 hanggang PA5
PIN13 o D6 hanggang PA6
PIN14 o D7 hanggang PA7
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 itaas na pigura.
4. Mula sa itaas na pigura, 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,
PULA (RXEN): Ang bit na ito ay kumakatawan sa makatanggap ng tampok na data. Ang bit na ito ay dapat itakda para sa data mula sa module na matatanggap ng taga-kontrol. Pinapayagan din nito ang 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. Matapos ang pagtatakda, 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, 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 asynchronous (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 pagkakapantay-pantay, itinakda namin ang parehong UPM1, UPM0 sa 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, kailangan lang naming iwanang mag-isa ang USBS.
Ngayon sa wakas kailangan naming itakda ang rate ng baud, mula sa figure sa itaas 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't sa pamamagitan ng cross reference na halaga ng UBRR ay nakikita bilang '6', at sa gayon ang baud rate ay nakatakda.
Ngayon tulad ng ipinakita sa pigura, ang dalawang mga pin mula sa controller ay papunta sa L293D, na kung saan ay isang H-BRIDGE na ginagamit upang makontrol ang bilis at direksyon ng pag-ikot para sa mga motor na DC na mababa ang kuryente.
Ang L293D ay isang H-BRIDGE IC na idinisenyo para sa pagmamaneho ng mababang motor na DC motor at ipinakita sa pigura, ang IC na ito ay binubuo ng dalawang h-tulay at kaya maaari itong magmaneho ng dalawang DC motor. Kaya ang IC na ito ay maaaring magamit upang himukin ang mga robot motor mula sa mga signal ng microcontroller.
Ngayon tulad ng tinalakay bago ang IC na ito ay may kakayahang baguhin ang direksyon ng pag-ikot ng DC motor. Nakamit ito sa pamamagitan ng pagkontrol sa mga antas ng boltahe sa INPUT1 at INPUT2.
Paganahin ang Pin |
Ipasok ang Pin 1 |
Ipasok ang Pin 2 |
Direksyon ng Motor |
Mataas |
Mababa |
Mataas |
Lumiko pakanan |
Mataas |
Mataas |
Mababa |
Lumiko pakaliwa |
Mataas |
Mababa |
Mababa |
Tigilan mo na |
Mataas |
Mataas |
Mataas |
Tigilan mo na |
Kaya't tulad ng ipinakita sa talahanayan sa itaas, para sa orasan na matalinong pag-ikot ng 2A ay dapat na mataas at ang 1A ay dapat na mababa. Katulad nito para sa anti clockwise 1A ay dapat na mataas at 2A ay dapat na mababa.
Tuwing ang isang awtorisadong card ay dadalhin malapit sa module, ang motor ay na-program upang ilipat ang pakaliit para sa isang segundo, upang ipakita ang tol ng tol ay binuksan pagkatapos ng isang segundo bumalik ito, na nagsasabi na ang toll gate ay sarado. Ang pagtatrabaho ng toll plaza ay pinakamahusay na ipinaliwanag sa hakbang-hakbang ng C code na ibigay sa ibaba.
Paliwanag sa Programming
Nasa ibaba ang linya sa linya na paliwanag para sa code ng RFID Toll Collection System. Maaari mong maunawaan ang konsepto at pagtatrabaho ng proyektong ito sa pamamagitan ng pagbabasa ng code sa ibaba. Upang mag-download o makopya, mahahanap mo ang kumpletong code sa ilalim ng pahina.
#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
# tukuyin ang RS 6 // na nagbibigay ng pangalang " registroelection " sa ika- 6 na pin ng PORTD, dahil nakakonekta ito 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 <
UCSRC - = (1 <
UCSRC & = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // pagtatakda ng rate ng baud // Ang sumusunod ay naglalaman ng mga ID ng mga tag, dapat itong baguhin para sa iba't ibang mga tag, Dapat itong i-update para gumana ang proyekto
/ * Matapos itapon ang programa sa tagapamahala dapat kumuha ng mga card na dapat pahintulutan at makuha ang mga tag ID. Ang mga ito ay nakuha sa pamamagitan ng paglalagay ng tag na malapit sa module ng RFID at ang ID ay ipapakita 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 ay pinapayagan lamang namin ang limang mga kard, 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. Ilagay ang sunud-sunod na malapit sa module, makukuha mo ang 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 ipinapadala ng ID 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); // nagsasabi 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 maiimbak ang kumpletong ID ng tag send_a_string ("RFID NUMBER"); // pagpapadala ng string send_a_command (0x80 + 0x40 + 0); // paglipat ng courser sa pangalawang linya habang (1) { habang (! (UCSRA & (1 <
{ } 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 na 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 <
PORTB & = ~ (1 <
_delay_ms (220); // pagkaantala _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB - = (1 <
PORTB & = ~ (1 <
_delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); _delay_ms (220); PORTB & = ~ (1 <
PORTB - = (1 <
} } UCSRB - = (1 <
} } 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 ++); } } |