माइक्रोप्रोसेसर तकनीक में समानांतर में चलने वाले कार्यों को थ्रेड कहा जाता है। यह बहुत सुविधाजनक है, क्योंकि एक ही समय में कई ऑपरेशन करना अक्सर आवश्यक होता है। क्या एक वास्तविक प्रोसेसर की तरह, Arduino माइक्रोकंट्रोलर को एक साथ कई कार्य करना संभव है? चलो देखते हैं।
यह आवश्यक है
- - अरुडिनो;
- - 1 एलईडी;
- - 1 पीजो बजर।
अनुदेश
चरण 1
सामान्यतया, Arduino सही समानांतरकरण, या मल्टीथ्रेडिंग का समर्थन नहीं करता है।
लेकिन आप माइक्रोकंट्रोलर को यह जांचने के लिए कह सकते हैं कि "लूप ()" चक्र के प्रत्येक दोहराव पर कुछ अतिरिक्त, पृष्ठभूमि कार्य को निष्पादित करने का समय आ गया है या नहीं। इस मामले में, उपयोगकर्ता को यह प्रतीत होगा कि एक साथ कई कार्य किए जा रहे हैं।
उदाहरण के लिए, आइए किसी दी गई आवृत्ति पर एक एलईडी को झपकाएं और समानांतर में, एक पीजोइलेक्ट्रिक एमिटर से जलपरी की तरह उठने और गिरने वाली आवाज़ें उत्सर्जित करें।
हमने एलईडी और पीजो एमिटर दोनों को Arduino से एक से अधिक बार जोड़ा है। आइए सर्किट को इकट्ठा करें जैसा कि चित्र में दिखाया गया है। यदि आप एक एलईडी को "13" के अलावा किसी अन्य डिजिटल पिन से जोड़ रहे हैं, तो याद रखें कि लगभग 220 ओम का वर्तमान सीमित अवरोधक है।
चरण दो
आइए इस तरह से एक स्केच लिखें और इसे Arduino पर अपलोड करें।
बोर्ड को लोड करने के बाद, आप देख सकते हैं कि स्केच को ठीक उसी तरह निष्पादित नहीं किया गया है जैसा हमें इसकी आवश्यकता है: जब तक सायरन पूरी तरह से चालू नहीं हो जाता, तब तक एलईडी नहीं झपकेगी, और हम चाहेंगे कि सायरन बजने के दौरान एलईडी पलक झपकाए। यहां क्या समस्या है?
तथ्य यह है कि इस समस्या को सामान्य तरीके से हल नहीं किया जा सकता है। कार्य माइक्रोकंट्रोलर द्वारा कड़ाई से क्रमिक रूप से किए जाते हैं। "देरी ()" ऑपरेटर एक निर्दिष्ट अवधि के लिए कार्यक्रम के निष्पादन में देरी करता है, और जब तक यह समय समाप्त नहीं हो जाता, तब तक निम्नलिखित प्रोग्राम कमांड निष्पादित नहीं होंगे। इस वजह से, हम प्रोग्राम के "लूप ()" में प्रत्येक कार्य के लिए एक अलग निष्पादन अवधि निर्धारित नहीं कर सकते हैं।
इसलिए, आपको किसी तरह मल्टीटास्किंग का अनुकरण करने की आवश्यकता है।
चरण 3
जिस विकल्प में Arduino छद्म-समानांतर में कार्य करेगा, वह Arduino डेवलपर्स द्वारा https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay लेख में सुझाया गया है।
विधि का सार यह है कि "लूप ()" लूप के प्रत्येक दोहराव के साथ, हम जांचते हैं कि यह एलईडी को ब्लिंक करने का समय है (पृष्ठभूमि कार्य करने के लिए) या नहीं। और अगर ऐसा होता है, तो हम एलईडी की स्थिति को उलट देते हैं। यह "देरी ()" ऑपरेटर को दरकिनार करने का एक प्रकार है।
इस पद्धति का एक महत्वपूर्ण नुकसान यह है कि एलईडी नियंत्रण इकाई के सामने कोड अनुभाग को "ledInterval" एलईडी के ब्लिंकिंग समय अंतराल की तुलना में तेजी से निष्पादित किया जाना चाहिए। अन्यथा, पलक झपकना आवश्यकता से कम बार होगा, और हमें कार्यों के समानांतर निष्पादन का प्रभाव नहीं मिलेगा। विशेष रूप से, हमारे स्केच में, सायरन ध्वनि परिवर्तन की अवधि 200 + 200 + 200 + 200 = 800 मिसे है, और हम एलईडी ब्लिंकिंग अंतराल को 200 मिसे पर सेट करते हैं। लेकिन एलईडी ८०० मिसे की अवधि के साथ चमकेगी, जो कि हमारे द्वारा सेट किए गए समय से ४ गुना अलग है। सामान्य तौर पर, यदि कोड में "देरी ()" ऑपरेटर का उपयोग किया जाता है, तो छद्म-समानांतरता का अनुकरण करना मुश्किल है, इसलिए इससे बचने की सलाह दी जाती है।
इस मामले में, सायरन ध्वनि नियंत्रण इकाई के लिए यह भी जांचना आवश्यक होगा कि समय आ गया है या नहीं, और "देरी ()" का उपयोग न करें। लेकिन इससे कोड की मात्रा बढ़ जाएगी और प्रोग्राम की पठनीयता खराब हो जाएगी।
चरण 4
इस समस्या को हल करने के लिए, हम अद्भुत ArduinoThread लाइब्रेरी का उपयोग करेंगे, जो आपको आसानी से छद्म समानांतर प्रक्रियाओं को बनाने की अनुमति देती है। यह एक समान तरीके से काम करता है, लेकिन यह आपको समय की जांच करने के लिए कोड लिखने की अनुमति नहीं देता है - चाहे आपको इस लूप में कार्य को निष्पादित करने की आवश्यकता हो या नहीं। यह कोड की मात्रा को कम करता है और स्केच की पठनीयता में सुधार करता है। आइए कार्रवाई में पुस्तकालय की जाँच करें।
सबसे पहले, आधिकारिक साइट https://github.com/ivanseidel/ArduinoThread/archive/master.zip से लाइब्रेरी आर्काइव डाउनलोड करें और इसे Arduino IDE की "लाइब्रेरीज़" डायरेक्टरी में अनज़िप करें। फिर "ArduinoThread-master" फ़ोल्डर का नाम बदलकर "ArduinoThread" कर दें।
चरण 5
कनेक्शन आरेख वही रहेगा। केवल प्रोग्राम कोड बदलेगा। अब यह साइडबार की तरह ही होगा।
कार्यक्रम में, हम दो धाराएँ बनाते हैं, प्रत्येक अपना ऑपरेशन करता है: एक एलईडी से झपकाता है, दूसरा सायरन की आवाज़ को नियंत्रित करता है। लूप के प्रत्येक पुनरावृत्ति में, प्रत्येक थ्रेड के लिए, हम जांचते हैं कि इसके निष्पादन का समय आ गया है या नहीं। यदि यह आता है, तो इसे "रन ()" विधि का उपयोग करके निष्पादन के लिए लॉन्च किया जाता है। मुख्य बात "देरी ()" ऑपरेटर का उपयोग नहीं करना है।
कोड में अधिक विस्तृत स्पष्टीकरण दिए गए हैं।
आइए कोड को Arduino मेमोरी में लोड करें, इसे चलाएं। अब सब कुछ ठीक वैसा ही काम करता है जैसा उसे करना चाहिए!