सभी को नमस्कार।
मरम्मत की प्रक्रिया में, कार्य एक मार्ग स्विच बनाने के लिए उत्पन्न हुआ। बेशक, मैं इसे सबसे सरल और सुविधाजनक तरीके से करना चाहता था, फोन से बुनियादी नियंत्रण कार्यों को जोड़ना। मैंने इसके लिए सबसे सरल और सबसे सुविधाजनक तकनीक चुनी (निश्चित रूप से, मेरी राय में) - माइक्रोफ़ोन, और इसे करना शुरू कर दिया। मैंने esp8266 पर तैयार बोर्ड लिया और इसके लिए एक घंटे का खाली समय आवंटित किया। लेकिन, जैसा कि यह बहुत लोकप्रिय नहीं है और रन-इन परियोजनाओं के साथ नहीं है, कार्य थोड़ा सा खींच दिया गया है।
जैसा कि यह निकला, मुझे जो डिजाइन सबसे सुविधाजनक लगा, वह निकला, यह बिल्कुल भी काम नहीं करता है। मुझे इसका विश्लेषण करने में कुछ समय बिताना पड़ा, इसके अलावा मैंने पूरी प्रक्रिया का पर्याप्त वर्णन करने का निर्णय लिया। लेख की मात्रा तेज गति से बढ़ने लगी, इसलिए मैंने इसे भागों में विभाजित करने और उन सभी विवरणों को बाहर फेंकने का फैसला किया जो मेरी राय में अनावश्यक हैं।
पहले भाग में तीन भाग होते हैं:
- एक मार्ग स्विच के विकास के लिए सबसे सरल माध्यम के चयन पर सैद्धांतिक विचार,
- चयनित उपकरण, नुकसान, पर चयनित बुनियादी फर्मवेयर का व्यावहारिक लॉन्च
- फर्मवेयर विकास
सबसे आसान विकास का माहौल चुनना
क्लासिक आइटम (उदाहरण के लिए, स्थिरता) के अलावा, "खाली समय का एक मिनट है" जैसे स्मार्ट घर के लिए, अनिवार्य उपकरण आवश्यकताओं की सूची भी विकास, स्थापना और समर्थन में आसानी जोड़ती है। उपकरणों को आवश्यक सेंसर या नियंत्रण उपकरणों को आसानी से कनेक्ट करने की आवश्यकता होती है। पूरे सिस्टम के साथ संवाद करने के लिए सुविधाजनक और आसान तरीके थे। इस डिवाइस के लिए फर्मवेयर लिखने में आसानी सुनिश्चित करना आवश्यक है, यह ध्यान में रखते हुए कि डिवाइस वहां स्थित हो सकता है जहां इसे प्राप्त करना मुश्किल होगा। और निश्चित रूप से, विकास में आसानी, यह विशेष रूप से DIY के लिए महत्वपूर्ण है, जब, उदाहरण के लिए, पूरे सिस्टम की विफलताओं के बिना काम करने के 2 साल बाद।
अचानक मैं फर्मवेयर में कुछ समायोजन जोड़ना चाहता हूं। इन सुधारों को बनाने के लिए, आपको यह याद रखना होगा कि यह प्रणाली कैसे काम करती है, जो कभी-कभी समायोजन से अधिक समय ले सकती है।
एक भोज उदाहरण पर विचार करें: आपको एक पीसी से सहित इसे नियंत्रित करने की क्षमता के साथ एक सरल पास-थ्रू स्विच बनाने की आवश्यकता है। हाल के समय में, यह कार्य काफी जटिल था, इसके लिए किसी प्रकार का माइक्रोकंट्रोलर (सबसे लोकप्रिय एवीआर या तस्वीर) लेना आवश्यक था, और फर्मवेयर लिखने के लिए, एक नियम के रूप में, आपको इसके लिए प्रलेखन पढ़ने की आवश्यकता है। यदि आप बॉक्स से बाहर सब कुछ करना चाहते हैं, तो आपको बोर्ड को अलग करने की आवश्यकता है, जहां एसी / डीसी, एक माइक्रोकंट्रोलर और एक संचार इंटरफ़ेस डालना है। LUT (या मुद्रित सर्किट बोर्ड का आदेश देने) के बाद, सब कुछ मिलाप, एक प्रोग्रामर, और फ्लैश फर्मवेयर खरीदें। और फिर 2-3 वर्षों के बाद, यदि आवश्यक हो, तो कुछ ठीक करने के लिए, सभी उपकरणों की तलाश करें और खरोंच से सब कुछ सीखें ...
इस प्रक्रिया को सरल बनाने के लिए, तैयार किए गए समाधान बाजार पर दिखाई देने लगे। सबसे सफल समाधान Arduino है। यह समाधान आईडीई द्वारा प्रदान किया जाता है, अपडेट फ़ंक्शन के साथ बूटलोडर, जो आपको प्रोग्रामर के उपयोग के बिना मानक इंटरफ़ेस के माध्यम से विशेष रूप से डिवाइस के साथ काम करने की अनुमति देता है। यह केवल बनाने के लिए, फर्मवेयर बनाना संभव बनाता है
वहां सब कुछ कैसे व्यवस्थित किया जाता है, इसकी बहुत सतही समझ। बाहरी मॉड्यूल का एक सेट सोल्डरिंग लोहे के बिना उपकरणों को कनेक्ट करना संभव बनाता है। लेकिन फिर भी, संपादन करने के लिए आपको Arduino सॉफ़्टवेयर स्थापित करने की आवश्यकता है, फ़र्मवेयर को कहीं स्टोर करें।
हमारा पास-थ्रू स्विच काफी बड़ा हो जाएगा, इसमें एक Arduino बोर्ड + AC / DC + रिले मॉड्यूल होगा। और अगर आपको समायोजन करने की आवश्यकता है, तो आपको यह याद रखना होगा कि कोड कहाँ है, और फिर से Arduino सॉफ़्टवेयर स्थापित करें।
अपने आप को स्रोत कोड संकलित करने की आवश्यकता को बचाने के लिए (यानी, अतिरिक्त सॉफ़्टवेयर स्थापित करें और इसे संग्रहीत करें), सबसे तार्किक समाधान या तो दुभाषियों का उपयोग करता है या सीधे माइक्रोकंट्रोलर पर कोड को संकलित करता प्रतीत होता है। सौभाग्य से, परियोजनाएं अब दिखाई दी हैं जो इसे करने की अनुमति देती हैं। उदाहरण के लिए, NodeMCU, एस्प 8266 माइक्रोकंट्रोलर के लिए लुआ भाषा दुभाषिया: फर्मवेयर में फ़ाइल सिस्टम के लिए अंतर्निहित समर्थन है, जो आपको डिवाइस से / से स्क्रिप्ट डाउनलोड / पढ़ने की अनुमति देता है। एक और काफी गंभीर परियोजना है माइक्रोपिथॉन, अजगर का एक स्ट्रिप-डाउन संस्करण जो विशेष रूप से माइक्रोकंट्रोलर के लिए सिलवाया गया है। इस पर चर्चा होगी।
MicroPython आज सबसे लोकप्रिय अजगर प्रोग्रामिंग भाषा में से एक का कार्यान्वयन है। यह बड़ी संख्या में आर्किटेक्चर और SoC (नंगे-हाथ, CC3200, esp8266, esp32, nRF, pic16bit, stm32) का समर्थन करता है। परियोजना सक्रिय रूप से विकसित हो रही है और इसमें बड़ी संख्या में अतिरिक्त मॉड्यूल हैं।
Esp8266 माइक्रोप्रोसेसर एक हार्डवेयर भाग के रूप में बहुत उपयुक्त है, इस तथ्य के कारण कि इस पर निर्मित बजट वाईफाई स्विच मॉड्यूल बाजार पर बेचे जाते हैं। उनमें वह सब कुछ है जो हमें चाहिए: एसी / डीसी, एक अंतर्निर्मित संचार इंटरफ़ेस (वाईफाई) के साथ एक माइक्रोकंट्रोलर। ब्रांड नाम Sonoff के तहत उपलब्ध है। एस्प 8266 माइक्रोप्रोसेसरों में मेमोरी नहीं होती है, यह अलग से सोल्डर किया जाता है और एक अलग आकार हो सकता है। सोनऑफ बेसिक के लिए उन्होंने 1Mb मॉड्यूल लगाया।
Esp8266 पर बुनियादी फर्मवेयर शुरू करना। सोनऑफ बेसिक।
नुकसान की अनुपस्थिति में, अजगर में प्रोग्रामिंग के लिए तुरंत आगे बढ़ना संभव होगा। लेकिन, दुर्भाग्य से, कई ऐसे मुद्दे हैं जिन्हें हल करने की आवश्यकता है, ताकि फर्मवेयर को प्रोग्राम और संशोधित करने के लिए यह बहुत आसान और सरल था। बेशक, हम वाईफ़ाई के माध्यम से ऐसा करने में रुचि रखते हैं, बिना किसी अतिरिक्त उपकरणों का उपयोग किए बिना एक लैपटॉप को छोड़कर।
पहला नुकसान, निश्चित रूप से, बुनियादी फर्मवेयर है जो आपके बोर्ड पर दर्ज किया गया है। यदि आपने एक डिबग बोर्ड खरीदा है, तो आप इस पर सबसे अधिक संभावना पाएंगे कि सोनऑफ बेसिक है, तो मालिकाना फर्मवेयर। इस बोर्ड को अपने लिए तैयार करने के लिए, आपको वहां आवश्यक फर्मवेयर लिखना होगा। कुछ माइक्रोकंट्रोलर्स में, खरीद करना आवश्यक है
एक विशेष प्रोग्रामर, हमारे मामले में हम भाग्यशाली थे, आपको बस एक USB <-> UART कनवर्टर प्राप्त करना होगा। यदि आप माइक्रोकंट्रोलर्स के साथ काम करते हैं, तो यह एक से अधिक बार काम में आएगा, और उनकी कीमत आमतौर पर $ 3 की सीमा में होती है।
सोनऑफ बेसिक के लिए कोई कंघी नहीं है जो आपको UART के माध्यम से कनेक्ट करने की अनुमति देती है, और हमें डिवाइस को प्रोग्राम करने के लिए इसकी आवश्यकता है। डिवाइस को बस प्रोग्राम करने के लिए, अपने हाथों में टांका लगाने वाले लोहे को लेना आवश्यक नहीं है, यह संपर्कों को झुकाव और फर्मवेयर को लिखने के लिए पर्याप्त है। यह देखते हुए कि आगे काम वाईफ़ाई के माध्यम से होगा, हमें अब इन संपर्कों की आवश्यकता नहीं होगी। लेकिन हम पास के माध्यम से एक स्विच लागू करते हैं, जिसका अर्थ है कि हमें सोल्डर करने की आवश्यकता है,
कम से कम तीन पैर।
सोनऑफ बेसिक के लिए, केवल 1 निःशुल्क GPIO कनेक्टर और 2 RX, TX कनेक्टर है। यह देखते हुए कि हमें RX, TX की आवश्यकता एक बार है (फर्मवेयर को फ्लैश करने के लिए), भविष्य में उन्हें GPIO को रिप्रोग्राम किया जा सकता है, एस्प 8266 के लिए धन्यवाद। लेकिन इस मामले में, हमें UART के माध्यम से डिबगिंग को छोड़ने की आवश्यकता है, सौभाग्य से हमने पहले से ही ऐसा करने की योजना बनाई है, क्योंकि वाईफाई के माध्यम से, सुविधा के दृष्टिकोण से, डीबगिंग बहुत सरल है।
चूंकि MicroPython का संस्करण प्रक्रिया में बदल सकता है, इसलिए हम वाईफाई के माध्यम से अपडेट विधि को डीबग करने में रुचि रखते हैं। ओटीए बचाव के लिए आता है। OTA एक फर्मवेयर है जो आपको एक डिवाइस को रीप्रोग्राम करने की अनुमति देता है। यह काफी सरलता से काम करता है। डिवाइस को चालू करने के बाद, फर्मवेयर यह निर्धारित करता है कि क्या इसे फिर से शुरू करने की आवश्यकता है, यदि आवश्यक हो, तो एक विशेष लॉन्च करता है
वाईफ़ाई updater, यदि नहीं, तो उपयोगकर्ता फर्मवेयर लॉन्च करता है। कार्यान्वयन अलग हो सकता है, फ़र्मवेयर स्वयं को अधिलेखित कर सकता है या मेमोरी के एक मुक्त क्षेत्र को लिख सकता है। आप यह भी निर्धारित कर सकते हैं कि डबिंग प्रोग्राम को अलग-अलग तरीके से चलाना है या नहीं। उदाहरण के लिए, कस्टम फर्मवेयर के cxumma पर विचार करें यदि यह अभिसरण नहीं करता है,
फिर जबरन फ्लैशिंग पर जाएं। आप GPIO से डेटा पढ़ सकते हैं या अपडेट को कहीं और शुरू करने की आवश्यकता के बारे में जानकारी लिख सकते हैं।
एक updater के रूप में, MicroPython प्रोजेक्ट yaota8266 प्रोजेक्ट को संदर्भित करता है। Yaota8266 डिवाइस को चमकाने और प्रत्येक पैकेट पर हस्ताक्षर करने का दावा करता है। यह ध्यान दिया जाना चाहिए कि सार्वजनिक कुंजी फर्मवेयर में ही एम्बेडेड है, यही कारण है कि यह पहले से ही इकट्ठे फर्मवेयर को अपलोड करने का कोई मतलब नहीं है, क्योंकि यह आपकी कुंजी को सीवे करने के लिए आवश्यक है।
असेंबल की गई छवि में निजी कुंजी को संशोधित करने का कोई कार्य नहीं है, इसलिए हमारे मामले में फर्मवेयर को स्वयं इकट्ठा करना आसान है। एक दिलचस्प विशेषता यह है कि हस्ताक्षर सत्यापन फ़ंक्शन है, लेकिन कोड में टिप्पणी की गई है, अर्थात। वास्तव में, हमें बिना किसी सुरक्षा लाभ के मुश्किलें आती हैं। Yaota8266 का मूल संस्करण नहीं जा रहा है,
सौभाग्य से, जीथब पर कांटे हैं जो इस समस्या को हल करते हैं, साथ ही वे यह निर्धारित करने की क्षमता भी जोड़ते हैं कि क्या आरटीसी क्षेत्र में लेखन के आधार पर फ्लैशिंग की जानी चाहिए, जो माइक्रोप्थॉन को बूटलोडर मोड पर स्विच करना संभव बनाता है।
सभी सुधारों को शामिल करने के बाद भी, हमारा ओटीए फर्मवेयर त्रुटियों के साथ लिखेगा, लेकिन एनओडीएमसीयू डिबग बोर्डों पर सफलतापूर्वक काम करेगा। ऐसा टाइमआउट के कारण होता है। होस्ट मशीन से अपडेट करते समय, यूडीपी पैकेट भेजे जाते हैं और एक प्रतिक्रिया की उम्मीद की जाती है यदि फ्लैश रिकॉर्डिंग सामान्य से अधिक समय लेती है, तो टाइमआउट होता है, और पैकेट फिर से भेजा जाता है। लाभ तय करना आसान है,
सिर्फ ota- क्लाइंट कोड में टाइमआउट बढ़ाना।
सोनऑफ पर ओटीए + माइक्रोपीथॉन बंडल में भी दिलचस्प विषमताएं हैं। उनमें से एक इस तथ्य से संबंधित है कि एसपीआई फ्लैश के साथ एस्प-एसडीके में काम करने के लिए मानक कार्य 4k ब्लॉकों पर संचालित होते हैं, और इस ब्लॉक आकार को FAT फाइल सिस्टम को लागू करने के लिए चुना गया था। बदले में, इस तथ्य के कारण कि एसपीआई फ्लैश केवल 1Mb है, जिसमें से ~ 300Kb OTA फर्मवेयर है, ~ 500Kb MicroPython फर्मवेयर है, फ़ाइल सिस्टम के लिए 200Kb से कम रहता है, अर्थात। 50 से कम ब्लॉक। हालांकि, चयनित लाइब्रेरी जो कि वसा को लागू करती है, एफएस नहीं बना सकती है जहां 50 से कम ब्लॉक हैं। समस्या को हल करने के कई तरीके हैं: ब्लॉक आकार को कम करें (एफएटी आपको 512 सेट करने की अनुमति देता है), फैट लाइब्रेरी को ठीक करें, एसपीआई एफएस का उपयोग करें (उम्मीद है कि ऐसी विषमताएं नहीं हैं)। मैंने ब्लॉक को घटाकर 512 करने का रास्ता अपनाया।
माइक्रोकंट्रोलर SPI फ़्लैश का उपयोग करते हैं - यह NOR और / या NAND मेमोरी है। इस मेमोरी की टिप्पणी यह है कि "कोई भी डेटा लिखें" की कोई अवधारणा नहीं है। आप केवल मान (0xff पर) रीसेट कर सकते हैं, या वांछित बिट्स को "0" पर सेट कर सकते हैं। एसपीआई फ्लैश आमतौर पर एनआर मेमोरी है, इसमें किसी भी बाइट को 0xff पर रीसेट करने का कार्य है, जबकि नंद केवल ब्लॉकों द्वारा रीसेट कर सकता है। यानी यदि रीसेट ब्लॉक का न्यूनतम आकार लिखने के लिए 4k है
1 बाइट मेमोरी के लिए, पूरे ब्लॉक को पढ़ना आवश्यक है, इसे 0xFF पर रीसेट करना आवश्यक है, और फिर वांछित बाइट को वांछित मूल्य पर सेट करके ब्लॉक लिखें। एसपीआई फ्लैश के निर्माताओं के पास काम के लिए लगभग समान ही एपीआई हैं, लेकिन, जैसा कि अभ्यास से पता चला है, एसपीआई फ्लैश के एक बाइट को लिखने का आदेश अलग हो सकता है। कहीं यह स्वचालित रूप से 0xFF पर लिखने से पहले रीसेट हो जाएगा, कहीं नहीं।
यदि आप एफएटी अनुभाग को 512 बाइट्स में बदलते हैं, तो एक टूटी हुई प्रणाली प्राप्त करने का एक मौका है यदि रिकॉर्डिंग के समय एक विशिष्ट एसपीआई फ्लैश स्वचालित बाइट रीसेट का समर्थन नहीं करता है। और यह सिर्फ एक ऐसी स्मृति थी जो मुझे सोनऑफ बेसिक में आई थी। अफवाह यह है कि वे वहां Winbond 25q80bv स्थापित करते थे, लेकिन अब PUYA 25q80h, जिसमें न्यूनतम बाइट्स 256 बाइट्स हैं। समाधान लगता होगा
सरल, आपको केवल दो पृष्ठ मिटाने होंगे, जहां इसे FAT ब्लॉक लिखने से पहले लिखा जाएगा, लेकिन कार्यान्वयन इस तथ्य से जटिल है कि sdk-esp केवल 4k ब्लॉक में हटाने का समर्थन करता है। चूंकि FAT पर लिखना हमारे स्विच के लिए बहुत दुर्लभ होगा,
केवल फर्मवेयर स्क्रिप्ट को अपडेट करते समय, आप खराब तरीके से जा सकते हैं और 4k ब्लॉकों में 512 बाइट ब्लॉक को अपडेट कर सकते हैं। इस मेमोरी के लिए दस्तावेज़ का कहना है कि मेमोरी 100,000 रीराइट साइकल का सामना कर सकती है, अर्थात। समस्या की एक समान परिधि हमें इस मूल्य को 4 गुना कम कर देगी, अर्थात 25,000 तक।
MicroPython में डिफ़ॉल्ट रूप से एक कंसोल होता है, इसे REPL कहा जाता है और यह COM पोर्ट के माध्यम से काम करता है। हम इस स्थिति से बहुत खुश नहीं हैं, क्योंकि हम वाईफाई के माध्यम से डिवाइस के साथ संवाद करना चाहते हैं। सौभाग्य से, MicroPython भी WebRepl के साथ आता है, लेकिन यह स्वचालित रूप से शुरू नहीं होता है। आप बूट-एरोमा में ऑटोरन रजिस्टर कर सकते हैं, लेकिन मैंने इसे सीधे _boot.py, सिस्टम फ़ाइल से चलाने का फैसला किया, यह फर्मवेयर फाइल में ही सेव हो जाता है।
पहली शुरुआत के बाद, हमारे फर्मवेयर एक फ़ाइल सिस्टम बनाएंगे, वेबरेप लॉन्च करेंगे और एक एक्सेस पॉइंट बनाएंगे। आप इसे कनेक्ट कर सकते हैं और अपने स्थानीय नेटवर्क से कनेक्ट करने के लिए पैरामीटर लिख सकते हैं, या, जैसा कि मैंने किया था, कॉम पोर्ट का उपयोग करके नेटवर्क को कॉन्फ़िगर करें, जिसके बाद केवल वाईफाई का उपयोग किया जाना चाहिए।
परीक्षण कार्य के लिए, आप जावास्क्रिप्ट में लिखे गए वेबरेप क्लाइंट का उपयोग कर सकते हैं। क्लाइंट को प्रोजेक्ट के संबंधित पृष्ठ पर एक ब्राउज़र में लॉन्च किया जा सकता है। एक अन्य विकल्प mpfshell परियोजना का उपयोग करना है, यह डिवाइस के साथ काम करने के लिए अधिक सुविधाजनक फ़ंक्शन प्रदान करता है।
इसलिए, इन सभी नुकसानों पर काबू पाने के बाद, आप सीधे स्विच प्रोग्रामिंग में जा सकते हैं।
फर्मवेयर विकास
फर्मवेयर को विकसित करने के लिए, हमें जीपीओ के काम करने के तरीके के बारे में सोचना होगा। सामान्य तौर पर, इसे विशुद्ध रूप से सहज रूप से समझा जा सकता है:
- यदि हम आउटपुट मोड (OUT) सेट करते हैं, तो पैर GND या Vcc का उत्पादन करता है।
- यदि हम इनपुट मोड (IN) सेट करते हैं, तो पैर "हवा में खतरे", जिस स्थिति में माइक्रोकंट्रोलर कुछ भी दे सकता है
- ताकि माइक्रोकंट्रोलर कुछ भी बाहर न दे, अंतर्निहित माइक्रोकंट्रोलर का उपयोग करके पैर को वांछित मूल्य तक खींचा जा सकता है
पुल-अप रेसिस्टर्स PULL_UP या PULL_DOWN।
आपको इस बात का भी अंदाजा होना चाहिए कि हमारे बीच क्या व्यवधान हैं: हमारे मामले में, यह कोड है जिसे किसी प्रकार की घटना होने पर निष्पादित करने की आवश्यकता होती है: एक बटन दबाया गया / जारी किया गया या स्थानीय नेटवर्क से एक संदेश आया जिसे डिवाइस को चालू या बंद करने की आवश्यकता थी।
आरंभ करने के लिए, आइए पाइथन में एक सरल स्विच (पास-थ्रू नहीं) प्रोग्राम लिखें।
from machine import Pin class SW: def __init__(self, portin, portout): self.pin = Pin(portin , Pin.PULL_UP)
मैंने इस स्विचहोम फ़ाइल का नाम दिया और इसे बूट-थ्रू में चलाने का आदेश दिया:
from switch import sw
फर्मवेयर शुरू करने के बाद, मुझे एक स्व ऑब्जेक्ट मिला, अगर मैं sw.change () को निष्पादित करता हूं, तो एक प्रोग्राम स्विच होगा
दूसरी स्थिति पर जाएं। जब एक मुक्त पिन माइक्रोकंट्रोलर में Vcc के लिए छोटा है
रिले क्रमशः चालू या बंद होता है।
अगला चरण एमक्यूटीटी क्लाइंट का लॉन्च होगा और फोन से स्विच को स्विच करने की क्षमता होगी।