अपने उपकरणों के लिए एक टच कीबोर्ड विकसित करें

इस लेख में, मैं एक टच कीबोर्ड विकसित करने की प्रक्रिया का वर्णन करूंगा जिसका उपयोग मेरे उपकरणों में किया जा सकता है। यह कीबोर्ड इकट्ठा करना आसान है, क्योंकि यह यांत्रिक भागों का अभाव है, और यांत्रिक प्रतिक्रिया की कमी उपयोग की कृपा से ऑफसेट है।



एक परियोजना को विकसित करने की प्रक्रिया में, मुझे 8 बटन के साथ एक सुविधाजनक कीबोर्ड की आवश्यकता थी। मैंने कैपेसिटिव सेंसर को लागू करने के लिए - प्रसिद्ध दृष्टिकोण का सहारा लेने का फैसला किया।

मैंने अपने लेख में पहले ही एक स्मारिका उपकरण के बारे में भौतिक सिद्धांत का वर्णन किया था, जिसे मैंने अपने हाथ में लेने पर महसूस किया ( http://habrahabr.ru/blogs/DIY/111627/ )

सिद्धांत बिल्कुल समान है, कार्यान्वयन में एकमात्र अंतर यह है कि दो माइक्रोकंट्रोलर पिन का उपयोग नहीं किया जाता है, लेकिन एक।

शुरू करने के लिए, हम इसके लिए क्या प्रयास करेंगे का एक वीडियो:







चरण 1: सर्किटरी





सेंसर की सर्किट्री थोड़ी बदल गई है, इस तथ्य के कारण कि प्रति सेंसर माइक्रोकंट्रोलर के केवल एक पैर का उपयोग करना आवश्यक है, और दो नहीं। हालांकि, यदि आपको अतिरिक्त पैरों के लिए खेद नहीं है, तो आप पहले की तरह सब कुछ छोड़ सकते हैं।



छवि



सेंसर का मतदान क्रम थोड़ा अलग होगा। प्रारंभ में, PD0 को पिन करने के लिए एक लॉग भेजा गया था। 0।

इस प्रकार, बिजली स्रोत से मेगाहोम रोकनेवाला के माध्यम से प्रवाह और पिन में बहता है। यदि सेंसर को चार्ज किया गया था, तो उसमें से करंट भी PD0 पिन से निकल जाएगा।



सर्वेक्षण के समय, हम आउटपुट से इनपुट पर पिन स्विच करते हैं (सस्पेंडर्स अक्षम हैं!)। इस समय, पिन आईओएम के कई दसियों (या यहां तक ​​कि सैकड़ों) के प्रतिरोध के प्रतिरोध के साथ एक उच्च प्रतिबाधा अवस्था में चला जाता है। पिन की दिशा में धारा व्यावहारिक रूप से बहना बंद कर देती है, और सेंसर की ओर बहना शुरू कर देती है। जैसे ही सेंसर लॉग स्तर से ऊपर एक वोल्टेज के लिए चार्ज किया जाता है। 1, यह माइक्रोकंट्रोलर इनपुट एकता दिखाएगा।

PD0 के बाद से पारित होने वाले समय को मापने के लिए जब तक कि उच्च 1 प्रतिबाधा की स्थिति में नहीं डाल दिया जाता है जब तक कि लॉग 1 इस पर प्रकट नहीं होता है, हम यह निष्कर्ष निकाल सकते हैं कि सेंसर कैपेसिटेंस बदलता है, और इसलिए, स्पर्श के क्षण को पकड़ता है।



संरचनात्मक रूप से, सेंसर एक आयताकार पैड 10x10 मिमी है, लेकिन वास्तव में इसका आकार व्यावहारिक रूप से असीमित है, आप मंडलियां, सांप बना सकते हैं, उन्हें खंडों और क्षेत्रों में विभाजित कर सकते हैं - सामान्य रूप से, किसी भी रूप में जानकारी दर्ज करें।



नीचे तैयार सर्किट बोर्ड की एक तस्वीर है। शुल्क कस्टम-मेड है, लेकिन घर पर एक बनाने के लिए भी मुश्किल नहीं है। ब्रेडबोर्ड का उपयोग करते समय, बोर्ड के शीर्ष पर चिपके पन्नी फाइबरग्लास का एक टुकड़ा सेंसर के रूप में कार्य कर सकता है।



छवि



अवसाद को इंगित करने के लिए प्रत्येक संवेदक के ऊपर एक एसएमडी डायोड स्थित होता है।

यह सब एक ATMega88 माइक्रोकंट्रोलर द्वारा नियंत्रित किया जाता है, 20 मेगाहर्ट्ज की आवृत्ति पर घाव होता है।

इस प्रकार, इस कीबोर्ड से आउटपुट को आपकी ज़रूरत के अनुसार किया जा सकता है और जो मेगा खींच देगा। मेरे मामले में, SPI सुविधाजनक था (मैं प्रोग्रामर से डिस्कनेक्ट किए बिना फ्लैश कर रहा था और परीक्षण कर रहा था, और यह बस पहले से ही डिवाइस में इस्तेमाल किया गया था), लेकिन आप SPI UART, I2C के साथ बिल्ट-इन मेगा का उपयोग कर सकते हैं, या ObjDev से यूएसबी के सॉफ्टवेयर कार्यान्वयन का उपयोग कर सकते हैं। हां, वास्तव में, यह संभव है और हार्डवेयर, जैसे कि एफटीडीआई कनवर्टर यूएसबी-> यूएआरटी।



अंतिम चित्र (Altium से एक स्क्रीनशॉट) नीचे प्रस्तुत किया गया है।



छवि



फिर से, कुछ भी जटिल नहीं है, कुछ भी अधिक नहीं है - एक मेगा क्लॉकिंग सर्किट, कंडेनर्स के लिए स्मूथिंग पावर, एक प्रोग्रामिंग / कनेक्टिंग कनेक्टर, 8 डायोड और 8 सेंसर।



क्या दिलचस्प है: जिस दूरी पर संवेदक हाथ महसूस कर सकता है वह टाइमर की लंबाई, इसकी आवृत्ति, साथ ही प्रतिरोध जिसके माध्यम से सेंसर जुड़ा हुआ है, पर निर्भर करता है। यह बस समझाया गया है - एक तेज टाइमर छोटे समय के अंतराल का पता लगा सकता है, और सेंसर के साथ गैल्वेनिक संपर्क की अनुपस्थिति में, चार्जिंग समय काफी कम हो जाता है। 20 मेगाहर्ट्ज मेगा और इसका 16-बिट टाइमर लगभग 1 मिमी के प्लास्टिक (plexiglass) की एक परत के माध्यम से आत्मविश्वास से एक स्पर्श का पता लगाने के लिए पर्याप्त है।

आप मेगा को थोड़ा तेज कर सकते हैं और प्रतिरोध को थोड़ा बढ़ा सकते हैं, लेकिन बेहतर नहीं है कि इसे दूर न किया जाए - ओवरक्लॉक किए गए मेगा की स्थिरता की गारंटी नहीं है, और बहुत अधिक प्रतिरोध लीकेज करंट के साथ चार्ज करंट के बराबर हो सकता है, जो सेंसर को निष्क्रिय बना देगा।

जैसा कि हो सकता है, प्लास्टिक के पतले टुकड़े के साथ सेंसर को कवर करने के लिए ऑपरेशन का सामान्य मोड काफी पर्याप्त है। एक आदर्श विकल्प कांच पर एक प्रवाहकीय कोटिंग स्प्रे करना होगा, लेकिन मुझे इस दिशा में प्रयोग करने का अधिक अवसर नहीं मिला।



आगे हम कोड का इंतजार कर रहे हैं।



चरण 2: कोड





सिद्धांत रूप में, सब कुछ पहले ही ऊपर वर्णित किया गया है, लेकिन कुछ स्पष्टता के लिए मैं परियोजना कोड दूंगा।



#include <avr/interrupt.h> #include <avr/io.h> unsigned char KBD_STATUS=0x00, TMP_STATUS=0x00; //    ,     unsigned short SensorTimes[8]={0,0,0,0,0,0,0,0}; //   unsigned short SensorHI[8]={0,0,0,0,0,0,0,0}, //   -   SensorLO[8]={0,0,0,0,0,0,0,0}; //    void CheckSensors(); unsigned short SensToLED[8]={8,16,32,1,4,2,1,2}; //. , ..     ) ISR(TIMER0_OVF_vect) { CheckSensors(); //  for(unsigned short i=0;i<8;i++) { if(KBD_STATUS&(1<<i)==0) // .  ,       if(i==3||i==7) PORTB|=SensToLED[i]; //    .        else PORTC|=SensToLED[i]; //      . else if(i==3||i==7) PORTB|=SensToLED[i]; else PORTC&=~SensToLED[i]; } } ISR(SPI_STC_vect) //       SPI { SPDR=KBD_STATUS; //   ! } void InitSPIMode3() // SPI { DDRB= 0b00010011; PORTB=0b00000011; SPCR= 0b11001100; SPSR=0x00; } void Calibrate() //     { unsigned char i=1,k=0; while(i!=0) { TCNT1=0x0000; TCCR1B=0x01; DDRD = ~i; while((PIND&i)==0); TCCR1B=0x00; DDRD|=i; SensorTimes[k]=TCNT1; SensorHI[k]=SensorTimes[k]+70; SensorLO[k]=SensorTimes[k]+20; k++; i<<=1; } } void CheckSensors() //     { unsigned char i=1,k=0; TMP_STATUS=KBD_STATUS; TCNT1=0x0000; TCCR1B=0x01; DDRD = 0b11111110; while(i!=0) { TCNT1=0x0000; TCCR1B=0x01; DDRD = ~i; while((PIND&i)==0); TCCR1B=0x00; DDRD|=i; if(TCNT1>SensorHI[k]) //,        TMP_STATUS|=i; else if(TCNT1<=SensorLO[k]) TMP_STATUS&=~i; k++; i<<=1; } KBD_STATUS=TMP_STATUS; } int main() { DDRD=0xFF; PORTD=0x00; PORTC=0xFF; DDRC=0xFF; TCCR0=0b00000101; TCNT0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; TIMSK=0x01; ACSR=0x80; SFIOR=0x00; InitSPIMode3(); for(int i=0;i<1024;i++) //        CheckSensors(); //  ) KBD_STATUS=0x00; TMP_STATUS=0x00; Calibrate(); // sei(); while(1); }
      
      






All Articles