हम कार्यालयों, शॉपिंग मॉल और कई अन्य स्थानों पर जानते हैं, जहां केवल प्राधिकरण कार्ड वाले व्यक्ति को कमरे में प्रवेश करने की अनुमति है। ये सिस्टम RFID संचार प्रणाली का उपयोग करते हैं। आरएफआईडी का उपयोग शॉपिंग मॉल में चोरी रोकने के लिए किया जाता है क्योंकि उत्पादों को आरएफआईडी चिप के साथ टैग किया जाता है और जब कोई व्यक्ति आरएफआईडी चिप के साथ इमारत को छोड़ देता है तो एक अलार्म स्वचालित रूप से उठाया जाता है। RFID टैग को रेत के हिस्से के रूप में छोटा बनाया गया है। RFID प्रमाणीकरण प्रणाली डिजाइन करना आसान है और लागत में सस्ते हैं। आजकल कुछ स्कूल और कॉलेज RFID आधारित उपस्थिति प्रणाली का उपयोग करते हैं ।
इस परियोजना में हम एक वोटिंग मशीन डिजाइन करने जा रहे हैं जो केवल प्रमाणीकृत वोटों की गिनती करती है। यह आरएफआईडी (रेडियो फ्रीक्वेंसी आइडेंटिफिकेशन) टैग का उपयोग करके किया जाता है। यहां हम केवल अधिकृत RFID टैग धारकों को वोट देने के लिए ATMEGA के लिए एक कार्यक्रम लिखने जा रहे हैं। (इस सरल वोटिंग मशीन परियोजना की भी जाँच करें)
अवयव आवश्यक
हार्डवेयर: ATMEGA32, बिजली की आपूर्ति (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF संधारित्र (बिजली की आपूर्ति से जुड़े), बटन (पांच टुकड़े), 10KΩ रोकनेवाला (पांच टुकड़े), 100nF संधारित्र (पांच टुकड़े), LED (दो टुकड़े), ईएम -18 (आरएफआईडी रीडर मॉड्यूल)।
सॉफ्टवेयर: Atmel स्टूडियो 6.1, progisp या फ़्लैश मैजिक।
सर्किट आरेख और स्पष्टीकरण
ATMEGA32 के सर्किट पोर्ता में LCD के डेटा पोर्ट से जुड़ा होता है। यहां किसी को फ्यूज बाइट्स को बदलकर, PORTC में ATMT में JTAG संचार को अक्षम करना याद रखना चाहिए, यदि कोई PORTC को सामान्य संचार पोर्ट के रूप में उपयोग करना चाहता है। 16x2 एलसीडी में कुल मिलाकर 16 पिन होते हैं अगर एक काला प्रकाश है, अगर कोई बैक लाइट नहीं है तो 14 पिन होंगे। एक बिजली या पीछे की हल्की पिंस को छोड़ सकता है। अब 14 पिनों में 8 डेटा पिन (7-14 या D0-D7), 2 पावर सप्लाई पिन (1 & 2 या VSS & VDD या gnd & + 5v), कंट्रास्ट कंट्रोल के लिए 3 rd पिन (VEE- नियंत्रण हैं कि पात्रों को कितना मोटा होना चाहिए दिखाया गया है), 3 नियंत्रण पिन (रुपये और आरडब्ल्यू और ई)
सर्किट में, आप देख सकते हैं कि मैंने केवल दो नियंत्रण पिन लिए हैं, इससे बेहतर समझ का लचीलापन मिलता है, कंट्रास्ट बिट और READ / WRITE का अक्सर उपयोग नहीं किया जाता है, इसलिए इन्हें जमीन पर छोटा किया जा सकता है। यह एलसीडी को कंट्रास्ट और रीड मोड में डालता है। हमें केवल वर्ण और डेटा भेजने के लिए सक्षम और आरएस पिन को नियंत्रित करने की आवश्यकता है।
एलसीडी के लिए जो कनेक्शन दिए गए हैं, वे नीचे दिए गए हैं:
PIN1 या VSS जमीन पर
PIN2 या VDD या VCC से + 5v पावर
पिन 3 या वीईई को ग्राउंड (शुरुआती के लिए अधिकतम विपरीत देता है)
पिन 4 या आरएस (रजिस्टर चयन) को यूसी के पीडी 6 में
पिन 5 या आरडब्ल्यू (पढ़ें / लिखें) को जमीन पर रखें (रीड मोड में एलसीडी लगाता है उपयोगकर्ता के लिए संचार को आसान बनाता है)
पिन 6 या uC के PD5 के लिए E (सक्षम करें)
पिन 7 या U0 से PA0 के लिए
पिन 8 या u1 के पी 1 से डी 1
PIN9 या u2 के पीए 2 को डी 2
पिन 10 या यूसी के पीए 3 से 3 डी
पिन 11 या यू 4 के पी 4 से डी 4
PIN12 या U5 के PA5
PIN13 या U6 के PA6
पिन 14 या U7 के PA7
सर्किट में, आप देख सकते हैं कि हमने 8bit संचार (D0-D7) का उपयोग किया है। हालाँकि यह अनिवार्य नहीं है और हम 4bit संचार (D4-D7) का उपयोग कर सकते हैं लेकिन 4 बिट संचार कार्यक्रम थोड़ा जटिल हो जाता है, इसलिए मैंने 8 बिट संचार को प्राथमिकता दी।
इसलिए उपरोक्त तालिका के मात्र अवलोकन से हम एलसीडी के 10 पिन को कंट्रोलर से जोड़ रहे हैं जिसमें 8 पिन डेटा पिन और 2 पिन नियंत्रण के लिए हैं।
आगे बढ़ने से पहले, हमें धारावाहिक संचार के बारे में समझने की आवश्यकता है। यहां आरएफआईडी मॉड्यूल धारावाहिक में नियंत्रक को डेटा भेजता है। इसमें संचार की अन्य विधा है लेकिन आसान संचार के लिए हम RS232 को चुन रहे हैं। मॉड्यूल का RS232 पिन ATMEGA के RXD पिन से जुड़ा है।
RFID मॉड्यूल द्वारा भेजा गया डेटा निम्नानुसार है:
अब RFID मॉड्यूल इंटरफ़ेस के लिए, निम्नलिखित विशेषताएं आवश्यक हैं:
1. नियंत्रक का RXD पिन (डेटा प्राप्त करने की सुविधा) सक्षम होना चाहिए।
2. चूंकि संचार धारावाहिक है, हमें यह जानने की आवश्यकता है कि जब भी डेटा बाय प्राप्त होता है, ताकि हम प्रोग्राम को पूर्ण बाइट प्राप्त होने तक रोक सकें। यह डेटा को पूर्ण व्यवधान प्राप्त करने में सक्षम करके किया जाता है।
3. RFID 8bit मोड में कंट्रोलर को डेटा भेजता है। इसलिए एक बार में दो अक्षर कंट्रोलर को भेजे जाएंगे। यह चित्र 3 के ब्लॉक में दिखाया गया है
4. आंकड़ा 3 से, कोई समता बिट नहीं हैं, मॉड्यूल द्वारा भेजे गए डेटा में एक स्टॉप बिट।
उपरोक्त विशेषताएं नियंत्रक रजिस्टरों में सेट की गई हैं; हम उनकी संक्षिप्त चर्चा करने जा रहे हैं,
RED (RXEN): यह बिट डेटा सुविधा को दर्शाता है, इस बिट को कंट्रोलर द्वारा प्राप्त किए जाने वाले मॉड्यूल से डेटा के लिए सेट किया जाना चाहिए, यह नियंत्रक के RXD पिन को भी सक्षम करता है।
BROWN (RXCIE): सफल डेटा रिसेप्शन के बाद एक अंतर प्राप्त करने के लिए इस बिट को सेट किया जाना चाहिए। इस बिट को सक्षम करके हमें पता चलता है, 8 बिट डेटा प्राप्त होने के ठीक बाद।
PINK (URSEL): UCSRC में अन्य बिट्स को सक्षम करने से पहले यह सेट किया जाना चाहिए, UCSRC में अन्य आवश्यक बिट्स सेट करने के बाद; URSEL को निष्क्रिय किया जाना चाहिए या शून्य पर रखा जाना चाहिए।
YELLOW (UCSZ0, UCSZ1, UCSZ2): इन तीन बिट्स का उपयोग हम एक ही बार में प्राप्त या प्राप्त कर रहे डेटा बिट्स की संख्या का चयन करने के लिए करते हैं।
चूंकि RFID मॉड्यूल द्वारा भेजा गया डेटा 8bit डेटा प्रकार (FIGURE3) है, इसलिए हमें UCSZ0, UCSZ1 को एक और UCSZ2 को शून्य पर सेट करना होगा।
ORANGE (UMSEL): यह बिट इस आधार पर सेट होता है कि क्या सिस्टम एसिंक्रोनस रूप से संचार कर रहा है (दोनों अलग-अलग घड़ी का उपयोग करते हैं) या सिंक्रोनाइज़ (दोनों एक ही घड़ी का उपयोग करते हैं),
चूंकि मॉड्यूल और नियंत्रक अलग-अलग घड़ी का उपयोग करते हैं, इसलिए इस बिट को शून्य पर सेट किया जाना चाहिए या अकेले छोड़ दिया जाना चाहिए क्योंकि वे डिफ़ॉल्ट रूप से शून्य पर सेट हैं।
GREEN (UPM1, UPM0): ये दोनों बिट्स बिट समता के आधार पर समायोजित किए जाते हैं जिनका हम संचार में उपयोग कर रहे हैं।
चूंकि RFID मॉड्यूल बिना समता के डेटा भेजता है (FIGURE3), हमने UPM1, UPM0 दोनों को शून्य पर सेट किया है या उन्हें अकेले छोड़ा जा सकता है क्योंकि किसी भी रजिस्टर में सभी बिट्स डिफ़ॉल्ट रूप से शून्य पर सेट हैं।
BLUE (USBS): इस बिट का उपयोग संचार के दौरान हमारे द्वारा उपयोग किए जाने वाले स्टॉप बिट्स की संख्या को चुनने के लिए किया जाता है।
चूंकि RFID मॉड्यूल एक स्टॉप बिट (आंकड़ा 3) के साथ डेटा भेजता है, हमें बस USBS बिट को अकेला छोड़ना होगा।
अब अंत में हमें बॉड दर निर्धारित करने की आवश्यकता है, यह आंकड़ा 3 से स्पष्ट है कि आरएफआईडी मॉड्यूल नियंत्रक को 9600 एमबी (बिट प्रति सेकंड) की बॉड दर के साथ डेटा भेजता है।
बॉड दर को उचित UBRRH चुनकर नियंत्रक में सेट किया गया है,
UBRRH मान बॉड दर और सीपीयू क्रिस्टल आवृत्ति को संदर्भित करते हुए चुना जाता है,
इसलिए क्रॉस संदर्भ द्वारा UBRR मान को '6' के रूप में देखा जाता है, और इसलिए बॉड दर निर्धारित है।
यहां पांच बटन मौजूद हैं, चार उम्मीदवारों के वोटों को बढ़ाने के लिए और पांचवां उम्मीदवारों के वोटों को शून्य पर लाने के लिए है। यहां मौजूद कैपेसिटर बटन के उछलते प्रभाव को कम करने के लिए है। यदि वे निकाल दिए जाते हैं, तो नियंत्रक प्रत्येक बार बटन दबाए जाने पर एक से अधिक गणना कर सकता है।
पिन के लिए जुड़े प्रतिरोधों को वर्तमान को सीमित करने के लिए होता है, जब बटन को पिन को जमीन पर खींचने के लिए दबाया जाता है। जब भी कोई बटन दबाया जाता है, तो नियंत्रक का संबंधित पिन जमीन पर खिंच जाता है और इस प्रकार नियंत्रक पहचानता है कि निश्चित बटन दबाया गया है और इसी कार्रवाई की जानी चाहिए, यह उम्मीदवार के वोटों को बढ़ाने या बटन दबाए गए वोटों के आधार पर रीसेट हो सकता है।
जब एक संबंधित व्यक्ति का प्रतिनिधित्व करने वाला बटन दबाया जाता है, तो नियंत्रक इसे चुनता है और वृद्धि के बाद संबंधित व्यक्ति संख्या को अपनी मेमोरी के अंदर बढ़ाता है, यह 16x2 एलसीडी डिस्प्ले पर संबंधित व्यक्तियों को दिखाता है।
वोटिंग मशीन के काम को नीचे दिए गए C कोड के चरण द्वारा समझाया गया है:
कोड स्पष्टीकरण
पिनों पर डेटा प्रवाह नियंत्रण को सक्षम करने के लिए #include // हैडर
#define F_CPU 1000000 // कंट्रोलर क्रिस्टल फ्रिक्वेंसी को बताना
#शामिल
#Dfine E 5 // PORTD के 5 वें पिन को "इनेबल" नाम देना, क्योंकि यह एलसीडी इनेबल पिन से जुड़ा है
#define RS 6 // PORTD के 6 वें पिन को "registerselection" नाम दे रहा है, क्योंकि एलसीडी एलसीडी पिन से जुड़ा है
शून्य send_a_command (अहस्ताक्षरित char कमांड);
शून्य send_a_character (अहस्ताक्षरित वर्ण);
void send_a_string (char * string_of_characters);
इंट मेन (शून्य)
{{
DDRA = 0xFF; // आउटपुट पिंस के रूप में पोर्टा डाल रहा है
DDRD = 0b11111110;
_delay_ms (50); // 50ms की देरी दे रही है
DDRB = 0b11110000; // कुछ पोर्टब पिन को इनपुट के रूप में लेना।
UCSRB - = (1 <
// डेटा को सक्षम करने से पूर्ण अवरोधन प्राप्त होता है, जिससे डेटा को पिन प्राप्त करने में सक्षम होता है
UCSRC - = (1 <
// URSEL की स्थापना करके अन्य बिट्स को बदलना, 8 बिट संचार के लिए सेटिंग
UCSRC और = ~ (1 <
UBRRH & = ~ (1 <
UBRRL = 6; // बॉड दर निर्धारित करना
int16_t VOTEA = 0; // व्यक्ति 1 वोट मेमोरी मेमोरी
चार, एलसीडी पर चरित्र प्रदर्शित करने वाले person1 वोट
int16_t VOTEB = 0;; // person2 वोट स्मृति भंडारण
चार बी; एलसीडी पर चरित्र प्रदर्शित करने वाले व्यक्ति 2 वोट
int16_t VOTEC = 0;; // person3 वोट मेमोरी मेमोरी
चार, एलसीडी पर चरित्र प्रदर्शित करने वाले व्यक्ति 3 वोट
int16_t मतदान = 0;; // person4 वोट मेमोरी मेमोरी
एलसीडी पर चरित्र प्रदर्शित करने वाले चार डी; / / व्यक्ति 4 वोट
// निम्नलिखित में टैग की आईडी है, इन्हें अलग-अलग टैग के लिए बदला जाना चाहिए, प्रोजेक्ट के काम करने के लिए इन्हें अपडेट किया जाना चाहिए
// कंट्रोलर में प्रोग्राम को डंप करने के बाद, उन कार्ड्स को लेना होगा जिन्हें अधिकृत किया जाना चाहिए और टैग आईडी प्राप्त करना चाहिए, ये आरएफआईडी मॉड्यूल के पास टैग रखकर प्राप्त किए जाते हैं और आईडी स्क्रीन पर दिखाई जाएगी। आईडी प्राप्त करने के बाद, प्रोग्राम को नीचे दिए गए आईडी नंबर को नए आईडी नंबर के साथ बदलकर अपडेट किया जाना चाहिए।
char ADMIT = {{(0x97), (0xa1), (0x90)}, {(0x97), (0xa1), (0x90), (0x93)}, {(0x97), (0x97), (0xa1), (0x90), (0x94)}, {(0x97), (0xa1), (0x90), (0x95)}, {(0x97), (0xa1), (0x90), (0x90)}}; |
अब ऊपर हम केवल पाँच कार्ड अधिकृत कर रहे हैं, इन्हें किसी भी संख्या में बदला जा सकता है, उदाहरण के लिए विचार करें कि डिफ़ॉल्ट प्रोग्राम को कंट्रोलर में डंप किया जाता है, कार्ड प्राप्त करें जो कि मॉड्यूल के पास एक के बाद एक अधिकृत स्थान होने चाहिए, आपको xxxxxxxx (907a4F87) के रूप में प्रत्येक के लिए आईडी मिलेगी।
अगर हमारे पास 7 टैग हैं, तो हमारे पास 7 आठ बिट आईडी होंगे।
// अब सात कार्ड के लिए यह जाता है // चार ADMIT = {{(0x90), (0x7a), (0x4F), (0x87)}, // मॉड्यूल द्वारा आईडी भेजने के लिए मेमोरी आवंटित करना int i = 0; int वोट = 0; int k = 0; send_a_command (0x01); // स्पष्ट स्क्रीन 0x01 = 00000001 _delay_ms (50); send_a_command (0x38); // बता रहे हैं कि एलसीडी हम 8bit कमांड / डेटा मोड का उपयोग कर रहे हैं _delay_ms (50); send_a_command (0b00001111); // LCD स्क्रीन पर और निमिष निमिष char MEM; // टैग की पूरी आईडी स्टोर करने के लिए मेमोरी आवंटित करना send_a_string ("RFID NUMBER"); // स्ट्रिंग भेजना send_a_command (0x80 + 0x40 + 0); // दूसरी पंक्ति में प्रांगण को आगे बढ़ाना जबकि (1) {{ जबकि (! (UCSRA & 1 <)
{{ } COUNTA = UDR; // UDR प्राप्त आठ बिट डेटा को संग्रहीत करता है और इसे पूर्णांक में ले जाया जाता है। MEM = COUNTA; // पहले दो अक्षर मेमोरी में अपडेट होते हैं itoa (COUNTA, SHOWA, 16); // एलसीडी में वेरिएबल नंबर डालने के लिए कमांड (वेरिएबल नंबर, जिसमें कैरेक्टर को रिप्लेस करना है, कौन सा बेस वेरिएबल है (दस यहां जैसे हम बेस 10 में नंबर गिन रहे हैं)) send_a_string (शोवा); // एलसीडी पर आंगन की स्थिति के बाद दूसरे व्यक्ति के चरित्र (वेरिएबल नंबर द्वारा प्रतिस्थापित) को प्रदर्शित करने के लिए प्रदर्शन करना जबकि (! (UCSRA & 1 <)
{{ } कूंटा = यूडीआर; itoa (COUNTA, SHOWA, 16); send_a_string (शोवा); MEM = COUNTA; // तीसरे और चौथे अक्षर को मेमोरी में अपडेट किया जाता है जबकि (! (UCSRA & 1 <)
{{ } कूंटा = यूडीआर; itoa (COUNTA, SHOWA, 16); send_a_string (शोवा); MEM = COUNTA; // पांचवें और छठे वर्णों को मेमोरी में अपडेट किया जाता है जबकि (! (UCSRA & 1 <)
{{ } कूंटा = यूडीआर; itoa (COUNTA, SHOWA, 16); send_a_string (शोवा); MEM = COUNTA; // सातवें और आठ अक्षर मेमोरी में अपडेट किए जाते हैं send_a_string (""); send_a_command (0x80 + 0x40 + 0); UCSRB और = ~ (1 <
के लिए (i = 0; मैं <5; मैं ++) {{ यदि ((MEM == ADMIT) और (MEM == ADMIT) और (MEM == ADMIT) और (MEM == ADMIT) {स्मृति के पात्रों के साथ एक बार में दो वर्णों की तुलना करते हुए प्राधिकरण के लिए चेक जाँच PORTB - = (1 <
वोट = 1; // अगर अधिकृत सेट वोट } } if (वोट == 0) // वोट सेट नहीं होने पर प्राधिकरण विफल हो गया {{ UCSRB - = (1 <
} जबकि (वोट == 1) // अधिकृत होने पर इस लूप को मतदान तक करें {{ send_a_command (0x80 + 0); // लाइन 1 पर स्थिति शून्य पर जाएं send_a_string ("अब वोट करें"); // स्ट्रिंग प्रदर्शित करना अगर (bit_is_clear (PINB, 0)) // जब बटन एक दबाया जाता है {{ VOTEA ++; // एक व्यक्ति द्वारा प्रथम व्यक्ति की वोट मेमोरी में वृद्धि वोट देना = 0; वोट देने के बाद लूप जाना } if (bit_is_clear (PINB, 1)) // जब बटन 2 दबाया जाता है {{ VOTEB ++; // एक से 2 एन डी व्यक्ति की वोट मेमोरी बढ़ाता है वोट = 0; } अगर (bit_is_clear (PINB, 2)) // जब बटन 3 दबाया जाता है {{ VOTEC ++; // एक से 3 आरडी व्यक्ति के वोट मेमोरी में वृद्धि वोट = 0; } if (bit_is_clear (PINB, 3)) // जब बटन 4 दबाया जाता है {{ VOTED ++; // एक से 4 वें व्यक्ति की वोट मेमोरी बढ़ाता है वोट = 0; } if (वोट == 0) // वोट प्राप्त होने के बाद साफ़ किया गया {{ send_a_command (0x80 + 0); // लाइन 1 की स्थिति पर जाएं send_a_string ("वोट के लिए धन्यवाद"); // प्रदर्शन स्ट्रिंग के लिए (k = 0; k <10; k ++) {{ _delay_ms (220); } PORTB & = ~ (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // सभी चार व्यक्तियों के वोट प्रदर्शित करना send_a_string ("ए ="); send_a_command (0x80 + 2); itoa (VOTEA, ए, 10); send_a_string (ए); send_a_command (0x80 + 8); send_a_string ("बी ="); 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 ("डी ="); send_a_command (0x80 + 0x40 + 10); itoa (वोट, डी, 10); send_a_string (D); send_a_command (0x80 + 0x40 + 16); के लिए (k = 0; k <25; k ++) {{ _delay_ms (220); } UCSRB - = (1 <
send_a_command (0x01); send_a_command (0x80 + 0); // शून्य स्थिति में जा रहा है send_a_string ("RFID NUMBER"); // एक स्ट्रिंग भेजें send_a_command (0x80 + 0x40 + 0); } } शून्य send_a_command (अहस्ताक्षरित चार कमांड) {{ पोर्तो = आज्ञा; पोर्ट और = ~ (1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
पोर्टा = 0; } शून्य send_a_character (अहस्ताक्षरित वर्ण) {{ पोर्टा = चरित्र; PORTD - = 1 <
PORTD - = 1 <
_delay_ms (50); PORTD & = ~ 1 <
पोर्टा = 0; } शून्य send_a_string (char * string_of_characters) {{ जबकि (* string_of_characters> 0) {{ send_a_character (* string_of_characters ++); } } |