विषयसूची:

मानक से परे जानाFirmata - पुनरीक्षित: 5 कदम
मानक से परे जानाFirmata - पुनरीक्षित: 5 कदम

वीडियो: मानक से परे जानाFirmata - पुनरीक्षित: 5 कदम

वीडियो: मानक से परे जानाFirmata - पुनरीक्षित: 5 कदम
वीडियो: How to calculate IQ of any person in 5 Min ? किसी भी आदमी का IQ 5 मिनट में कैसे पता करें ? 2024, जुलाई
Anonim
मानक से परे जा रहे हैंFirmata - पर दोबारा गौर किया गया
मानक से परे जा रहे हैंFirmata - पर दोबारा गौर किया गया

कुछ समय पहले, पाइमाटा4 लाइब्रेरी में DHT22 आर्द्रता/तापमान सेंसर के लिए समर्थन जोड़ने में मार्गदर्शन के लिए, मुझे डॉ मार्टिन व्हीलर, एक pymata4 उपयोगकर्ता द्वारा संपर्क किया गया था। Pymata4 पुस्तकालय, अपने Arduino समकक्ष, FirmataExpress के संयोजन के साथ, उपयोगकर्ताओं को दूरस्थ रूप से अपने Arduino उपकरणों को नियंत्रित और मॉनिटर करने की अनुमति देता है। ईमेल एक्सचेंजों के कुछ ही दौर में, डॉ. व्हीलर pymata4 और FirmataExpress दोनों को संशोधित करने में सफल रहे। नतीजतन, DHT22 और DHT11 सेंसर के लिए समर्थन अब pymata4 और FirmataExpress का एक मानक हिस्सा है।

2014 के मई में, मैंने अतिरिक्त उपकरणों के लिए फ़र्माटा में समर्थन जोड़ने पर एक लेख लिखा था। उस लेख पर विचार करते हुए, मुझे एहसास हुआ कि उस लेख के लिए कागज पर कलम लेने के बाद से कितना बदल गया है। इस लेख के अलावा, डॉ. व्हीलर ने अपने प्रयासों का दस्तावेजीकरण किया, और आप इसे भी देखना चाहेंगे।

FirmataExpress StandardFirmata पर आधारित है, और StandardFirmata निर्देशिका संरचना विकसित हुई है। इसके अलावा, pymata4 API भी 2014 के मूल PyMata API से काफी अलग है। मैंने सोचा कि यह उस लेख को फिर से देखने और अपडेट करने का सही समय होगा। डॉ. व्हीलर के कार्य को आधार के रूप में उपयोग करते हुए, आइए जानें कि pymata4/FirmataExpress कार्यक्षमता को कैसे बढ़ाया जाए।

शुरू करने से पहले - Arduino/Firmata के बारे में कुछ पृष्ठभूमि की जानकारी

तो फर्मेटा क्या है? फर्मेटा वेब पेज से उद्धृत करते हुए, "फर्मटा एक मेजबान कंप्यूटर पर सॉफ्टवेयर से माइक्रोकंट्रोलर के साथ संचार करने के लिए एक सामान्य प्रोटोकॉल है।"

Arduino Firmata, Arduino माइक्रोकंट्रोलर और PC के बीच कमांड और रिपोर्ट जानकारी दोनों को ट्रांसपोर्ट करने के लिए एक सीरियल इंटरफ़ेस का उपयोग करता है, आमतौर पर एक सीरियल / USB लिंक का उपयोग करके 57600 बीपीएस पर सेट किया जाता है। इस लिंक पर स्थानांतरित डेटा बाइनरी है, और प्रोटोकॉल क्लाइंट/सर्वर मॉडल में कार्यान्वित किया जाता है।

सर्वर साइड को Arduino स्केच के रूप में Arduino माइक्रोकंट्रोलर पर अपलोड किया जाता है। Arduino IDE के साथ शामिल StandardFirmata स्केच, क्लाइंट के आदेशानुसार Arduino I/O पिन को नियंत्रित करता है। यह इनपुट पिन परिवर्तन और अन्य रिपोर्ट जानकारी क्लाइंट को वापस रिपोर्ट करता है। FirmataExpress StandardFirmata का एक विस्तारित संस्करण है। यह 115200 बीपीएस की सीरियल लिंक स्पीड से चलता है।

इस आलेख के लिए प्रयुक्त Arduino क्लाइंट pymata4 है। यह एक पायथन एप्लिकेशन है जिसे पीसी पर निष्पादित किया जाता है। यह दोनों Arduino सर्वर को कमांड भेजता है और रिपोर्ट प्राप्त करता है। चूंकि पाइमाटा 4 को पायथन में लागू किया गया है, यह विंडोज, लिनक्स (रास्पबेरी पाई सहित) और मैकओएस कंप्यूटर पर चलता है।

फर्मेटा का उपयोग क्यों करें?

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

लेकिन StandardFirmata का उपयोग करने का यही एकमात्र कारण नहीं है। हल्के वजन वाले Arduino अनुप्रयोगों को विकसित करते समय, एक पीसी उपकरण और डिबगिंग क्षमताएं प्रदान कर सकता है जो सीधे Arduino माइक्रोकंट्रोलर पर उपलब्ध नहीं होती हैं। "फिक्स्ड" क्लाइंट और सर्वर का उपयोग करने से एप्लिकेशन की जटिलता को एक पीसी तक सीमित रखने में मदद मिलती है, जिसे अधिक आसानी से प्रबंधित किया जाता है। एक बार एप्लिकेशन पूर्ण हो जाने के बाद, इसे एक कस्टम, स्टैंडअलोन Arduino स्केच में अनुवादित किया जा सकता है।

पाइमाटा 4 का उपयोग क्यों करें?

इसके लेखक होने के नाते, निश्चित रूप से, मैं पक्षपाती हूं। कहा जा रहा है, यह एकमात्र पायथन-आधारित फ़र्मेटा क्लाइंट है जिसे पिछले कई वर्षों से लगातार बनाए रखा गया है। यह एक सहज और उपयोग में आसान एपीआई प्रदान करता है। StandardFirmata आधारित रेखाचित्रों के अलावा, यह StandardFirmataWifI स्केच का उपयोग करते समय ESP-8266 जैसे उपकरणों के लिए WiFi पर Firmata का समर्थन करता है।

इसके अलावा, pymata4 को एक उपयोगकर्ता द्वारा आसानी से विस्तारित करने के लिए डिज़ाइन किया गया था ताकि अतिरिक्त सेंसर और एक्चुएटर्स का समर्थन किया जा सके जो वर्तमान में StandardFirmata द्वारा समर्थित नहीं हैं।

चरण 1: फर्मेटा प्रोटोकॉल को समझना

फर्मेटा प्रोटोकॉल को समझना
फर्मेटा प्रोटोकॉल को समझना

Arduino Firmata संचार प्रोटोकॉल MIDI प्रोटोकॉल से लिया गया है, जो डेटा का प्रतिनिधित्व करने के लिए एक या अधिक 7-बिट बाइट्स का उपयोग करता है।

फर्मेटा को उपयोगकर्ता-एक्सटेंसिबल होने के लिए डिज़ाइन किया गया था। यह एक्स्टेंसिबिलिटी प्रदान करने वाला तंत्र सिस्टम एक्सक्लूसिव (SysEx) मैसेजिंग प्रोटोकॉल है।

एक SysEx संदेश का प्रारूप, जैसा कि फर्मेटा प्रोटोकॉल द्वारा परिभाषित किया गया है, ऊपर दिए गए उदाहरण में दिखाया गया है। यह हेक्साडेसिमल 0xF0 के निश्चित मान के साथ START_SYSEX बाइट से शुरू होता है, और उसके बाद एक अद्वितीय SysEx कमांड बाइट होता है। कमांड बाइट का मान हेक्साडेसिमल 0x00-0x7F की सीमा में होना चाहिए। कमांड बाइट के बाद 7-बिट डेटा बाइट्स की एक अनिर्दिष्ट संख्या होती है। अंत में, संदेश को हेक्साडेसिमल 0xF7 के निश्चित मान के साथ END_SYSEX बाइट के साथ समाप्त किया जाता है।

फर्मेटा डेटा एन्कोडिंग/डिकोडिंग

चूंकि SysEx संदेश के उपयोगकर्ता डेटा भाग में 7-बिट बाइट्स की एक श्रृंखला होती है, आप सोच सकते हैं कि कोई 128 (0x7f) से अधिक मान का प्रतिनिधित्व कैसे करता है? डेटा लिंक पर डेटा को मार्शल करने से पहले फ़र्माटा उन मानों को कई 7-बिट बाइट विखंडू में अलग करके एन्कोड करता है। डेटा आइटम का सबसे कम महत्वपूर्ण बाइट (LSB) पहले भेजा जाता है, उसके बाद कन्वेंशन द्वारा डेटा आइटम के तेजी से महत्वपूर्ण घटकों को भेजा जाता है। डेटा आइटम का सबसे महत्वपूर्ण बाइट (MSB) भेजा गया अंतिम डेटा आइटम है।

यह कैसे होता है?

मान लें कि हम SysEx संदेश के डेटा भाग में मान 525 शामिल करना चाहते हैं। चूंकि 525 का मान स्पष्ट रूप से 128 के मान से अधिक है, इसलिए हमें इसे 7-बिट बाइट "चंक्स" में विभाजित या अलग करना होगा।

यहां बताया गया है कि यह कैसे किया जाता है।

दशमलव में 525 का मान 0x20D के हेक्साडेसिमल मान के बराबर है, जो 2-बाइट मान है। LSB प्राप्त करने के लिए, हम मान को 0x7F के साथ AND'ing करके छिपाते हैं। दोनों "सी" और पायथन कार्यान्वयन नीचे दिखाए गए हैं:

// "सी" एलएसबी को अलग करने के लिए कार्यान्वयन

int max_distance_LSB = max_distance और 0x7f; // निचले बाइट को मास्क करें # LSB max_distance_LSB = max_distance और 0x7F को अलग करने के लिए पायथन कार्यान्वयन # निचले बाइट को मास्क करें

मास्किंग के बाद, max_distance_LSB में 0x0d होगा। 0x20D और 0x7F = 0x0D।

इसके बाद, हमें इस 2-बाइट मान के लिए MSB को अलग करने की आवश्यकता है। ऐसा करने के लिए, हम 0x20D के मान को दाईं ओर, 7 स्थानों पर स्थानांतरित करेंगे।

// "सी" 2 बाइट मान के एमएसबी को अलग करने के लिए कार्यान्वयन

int max_distance_MSB = max_distance >> 7; // हाई ऑर्डर बाइट को शिफ्ट करें # Python कार्यान्वयन को 2 बाइट मान के MSB को अलग करने के लिए max_distance_MSB = max_distance >> 7 # शिफ्ट ऊपरी बाइट प्राप्त करने के लिए शिफ्ट करने के बाद, max_distance_MSB में 0x04 का मान होगा।

जब "खंडित" मार्शल डेटा प्राप्त होता है, तो इसे एक मान में पुन: संयोजित करने की आवश्यकता होती है। यहां बताया गया है कि कैसे डेटा को "सी" और पायथन दोनों में फिर से इकट्ठा किया जाता है

// "सी" कार्यान्वयन 2 बाइट को फिर से इकट्ठा करने के लिए, // 7 बिट मान एकल मान में int max_distance = argv [0] + (argv [1] << 7); # 2 बाइट, # 7 बिट मानों को एक मान max_distance = डेटा [0] + (डेटा [1] << 7) में फिर से इकट्ठा करने के लिए पायथन कार्यान्वयन

पुन: संयोजन के बाद, मान एक बार फिर 525 दशमलव या 0x20D हेक्साडेसिमल के बराबर होता है।

यह डिस्सेप्लर/पुन: असेंबली प्रक्रिया क्लाइंट या सर्वर द्वारा की जा सकती है।

चरण 2: आइए आरंभ करें

एक नए उपकरण का समर्थन करने के लिए Arduino निवासी सर्वर और PC निवासी Python क्लाइंट दोनों में परिवर्तन की आवश्यकता होती है। आवश्यक संशोधनों को स्पष्ट करने के लिए डॉ. व्हीलर के कार्य का उपयोग किया जाएगा।

शायद सबसे महत्वपूर्ण कदम यह तय करना है कि क्या आप मौजूदा सहायक डिवाइस लाइब्रेरी को समीकरण के Arduino पक्ष में एकीकृत करना चाहते हैं या अपना खुद का लिखना चाहते हैं। यह अनुशंसा की जाती है कि यदि आप एक मौजूदा पुस्तकालय पा सकते हैं, तो इसे खरोंच से लिखने की तुलना में इसका उपयोग करना कहीं अधिक सरल है।

DHT डिवाइस सपोर्ट के लिए, डॉ. व्हीलर ने DHTNew लाइब्रेरी पर अपना एक्सटेंशन कोड आधारित किया। बहुत चतुराई से, डॉ. व्हीलर ने Arduino की ओर न्यूनतम अवरोधन प्रदान करने के लिए DHTNew लाइब्रेरी की कार्यक्षमता को Arduino और pymata4 समीकरण के पक्षों में विभाजित किया।

यदि हम DHTNew को देखें, तो यह निम्नलिखित सभी कार्य करता है:

  • चयनित पिन डिजिटल आउटपुट मोड सेट करता है।
  • नवीनतम आर्द्रता और तापमान मूल्यों को पुनः प्राप्त करने के लिए एक एन्कोडेड सिग्नल को देखता है।
  • किसी भी त्रुटि के लिए जाँच करता है और रिपोर्ट करता है।
  • प्राप्त कच्चे डेटा से मानव-पठनीय तापमान और आर्द्रता मूल्यों की गणना करता है।

FirmataExpress पक्ष पर चीजों को यथासंभव कुशल रखने के लिए, डॉ. व्हीलर ने डेटा रूपांतरण रूटीन को Arduino से pymata4 में उतार दिया।

चरण 3: DHT समर्थन के लिए FirmataExpress को संशोधित करना

फर्मटाएक्सप्रेस डायरेक्टरी ट्री

नीचे वे सभी फाइलें हैं जिनमें FirmataExpress रिपॉजिटरी शामिल है। यह पेड़ StandardFiramata के समान है, बस कुछ फ़ाइल नाम रिपॉजिटरी नाम को दर्शाते हैं।

जिन फ़ाइलों में संशोधन की आवश्यकता होती है, वे वे हैं जिनके आगे एक तारक (*) होता है।

फर्मटा एक्सप्रेस

* बोर्ड.एच

उदाहरण

फर्मेटा एक्सप्रेस

बोर्डएक्स

* FirmataExpress.ino

LICENSE.txt

मेकफ़ाइल

├── * FirmataConstants.h

* FirmataDefines.h

FirmataExpress.cpp

FirmataExpress.h

├── FirmataMarshaller.cpp

├── FirmataMarshaller.h

FirmataParser.cpp

FirmataParser.h

आइए प्रत्येक फाइल और किए गए परिवर्तनों को देखें।

बोर्ड.एच

इस फ़ाइल में प्रत्येक समर्थित बोर्ड प्रकार के लिए पिन-प्रकार मैक्रो परिभाषाएँ हैं। यह समर्थित उपकरणों की अधिकतम संख्या को परिभाषित करता है जब एक से अधिक उपकरणों का समर्थन करने की आवश्यकता होती है।

DHT डिवाइस के लिए, एक बार में 6 डिवाइस तक कनेक्ट किए जा सकते हैं और इस मान को इस प्रकार परिभाषित किया गया है:

#ifndef MAX_DHTS

#define MAX_DHTS 6 #endif

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

#परिभाषित IS_PIN_DHT(p) (IS_PIN_DIGITAL(p) && (p) - 2 <MAX_DHTS)

साथ ही एक पिन-नंबर रूपांतरण को परिभाषित करने के लिए मैक्रो।

#परिभाषित पिन_टीओ_डीएचटी(पी) PIN_TO_DIGITAL(p)

फर्मटा कॉन्स्टेंट्स.एच

इस फ़ाइल में फ़र्मवेयर संस्करण संख्या है, जिसे आप अपने Arduino पर लोड किए गए संस्करण का ट्रैक रखने के लिए संशोधित करना चाह सकते हैं। इसमें Firmata संदेश मान भी शामिल हैं, जिसमें Firmata SysEx संदेश भी शामिल हैं।

आपको इस फ़ाइल में अपने डिवाइस के लिए एक नया संदेश या संदेशों का सेट असाइन करना होगा। DHT के लिए, दो संदेश जोड़े गए। एक पिन को "DHT" पिन के रूप में कॉन्फ़िगर करता है, और दूसरा, एक रिपोर्टर संदेश के रूप में, क्लाइंट को नवीनतम DHT डेटा वापस भेजते समय।

स्थिर स्थिरांक int DHT_CONFIG = 0x64;

स्थिर स्थिरांक int DHT_DATA = 0x65;

इस फ़ाइल में पिन मोड भी निर्दिष्ट हैं। DHT के लिए, एक नया पिन मोड बनाया गया था:

स्थिर स्थिरांक इंट PIN_MODE_DHT = 0x0F; // DHT के लिए कॉन्फ़िगर किया गया पिन

नया पिन मोड जोड़ते समय, TOTAL_PIN_MODES को समायोजित किया जाना चाहिए:

स्थिर स्थिरांक int TOTAL_PIN_MODES = 17;

FirmataDefines.h

FirmataConstants.h में जोड़े गए नए संदेशों को प्रतिबिंबित करने के लिए इस फ़ाइल को अद्यतन किया जाना चाहिए:

#ifdef DHT_CONFIG#undef DHT_CONFIG #endif #define DHT_CONFIG फर्मटा:: DHT_CONFIG // DHT अनुरोध #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA फर्मटा:: DHT_DATA // DHT उत्तर #ifdef पिन_MODE_MODE_DHT #undef #undef::पिन_मोड_डीएचटी

FirmataExpress.ino

इस चर्चा में, हम इस Arduino स्केच में किए गए परिवर्तनों के "उच्च-बिंदु" को कवर करेंगे।

एक साथ छह DHT उपकरणों तक का समर्थन करने के लिए FirmataExpress के लिए, डिवाइस के प्रत्येक संबंधित पिन नंबर, इसके वेकअपडेले मान और डिवाइस प्रकार, जो कि DHT22 या DHT11 है, का ट्रैक रखने के लिए 3 सरणियों का निर्माण किया गया था:

// डीएचटी सेंसर

इंट numActiveDHTs = 0; // uint8_t DHT_PinNumbers[MAX_DHTS] संलग्न DHT की संख्या; uint8_t DHT_WakeUpDelay[MAX_DHTS]; uint8_t DHT_TYPE[MAX_DHTS];

क्योंकि दोनों प्रकार के उपकरणों को पढ़ने के बीच लगभग 2 सेकंड की आवश्यकता होती है, हमें यह सुनिश्चित करने की आवश्यकता है कि हम प्रत्येक DHT को 2-सेकंड की समय सीमा में केवल एक बार पढ़ें। कुछ डिवाइस, जैसे DHT डिवाइस और HC-SR04 दूरी सेंसर, केवल समय-समय पर एक्सेस किए जाते हैं। यह उन्हें अपने वातावरण के साथ बातचीत करने का समय देता है।

uint8_t अगलाडीएचटी = 0; // अगले डिवाइस को पढ़ने के लिए dht में इंडेक्स करें

uint8_t वर्तमानDHT = 0; // ट्रैक करता है कि कौन सा सेंसर सक्रिय है। int dhtNumLoops = 0; // लूप बी 4 के माध्यम से एक डीएचटी int dhtLoopCounter = 0 तक पहुंचने की लक्ष्य संख्या; // लूप काउंटर

DHT डिवाइस को कॉन्फ़िगर करना और पढ़ना

जब फर्मटाएक्सप्रेस को डीएचटी ऑपरेशन के लिए पिन को कॉन्फ़िगर करने के लिए एक SysEx कमांड प्राप्त होता है, तो यह सत्यापित करता है कि डीएचटी उपकरणों की अधिकतम संख्या पार नहीं हुई है। यदि नए DHT का समर्थन किया जा सकता है, तो DHT सरणियों को अद्यतन किया जाता है। यदि DHT प्रकार अज्ञात है, तो एक SysEx स्ट्रिंग संदेश बनाया जाता है और वापस pymata4 में प्रेषित किया जाता है

मामला DHT_CONFIG: int DHT_Pin = argv[0]; int DHT_type = argv[1]; अगर (numActiveDHTs <MAX_DHTS) {if (DHT_type == 22) {DHT_WakeUpDelay[numActiveDHTs] = 1; } और अगर (DHT_type == 11) {DHT_WakeUpDelay[numActiveDHTs] = 18; } और { Firmata.sendString ("त्रुटि: अज्ञात सेंसर प्रकार, वैध सेंसर 11, 22 हैं"); टूटना; } // सेंसर DHT_PinNumbers[numActiveDHTs] = DHT_Pin का परीक्षण करें; DHT_TYPE[numActiveDHTs] = DHT_type; सेटपिनमोड कॉलबैक (DHT_Pin, PIN_MODE_DHT);

FirmataExpress तब DHT डिवाइस के साथ संचार करने का प्रयास करता है। यदि कोई त्रुटि है, तो यह त्रुटि डेटा के साथ एक SysEx संदेश बनाता है और SysEx संदेश को वापस pymat4 पर भेजता है। _bits वेरिएबल DHT डिवाइस द्वारा लौटाए गए डेटा को pymata4 द्वारा अतिरिक्त प्रोसेसिंग के लिए रखता है यदि वांछित है।

Firmata.लिखें (START_SYSEX);

Firmata.लिखें (DHT_DATA); Firmata.write(DHT_Pin); Firmata.write(DHT_type); के लिए (uint8_t i = 0; i > 7 & 0x7f); } Firmata.write(abs(rv)); फर्मटा.लिखें(1); Firmata.लिखें (END_SYSEX);

यदि वैध डेटा लौटाया जाता है, तो सक्रिय डीएचटी की संख्या बढ़ जाती है। डेटा के लिए अगले DHT की जाँच करने से पहले कितने लूप पुनरावृत्तियों को पूरा करने का ट्रैक रखने वाला एक चर भी समायोजित किया जाता है। यह चर आश्वासन देता है कि सिस्टम में कितने भी DHT जोड़े जाएं, वे सभी 2 सेकंड की अवधि के भीतर पढ़े जाएंगे।

int rv = readDhtSensor (numActiveDHTs);

अगर (आरवी == डीएचटीएलआईबी_ओके) {numActiveDHTs++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // सब ठीक }

यदि स्केच के लूप फ़ंक्शन में एक या अधिक DHT डिवाइस कॉन्फ़िगर किए गए हैं, तो अगला DHT डिवाइस पढ़ा जाता है। या तो वैध डेटा या इसकी त्रुटि स्थिति को SysEx संदेश के रूप में pymata4 में वापस कर दिया जाता है:

अगर (dhtLoopCounter++> dhtNumLoops) { अगर (numActiveDHTs) { int rv = readDhtSensor (nextDHT); uint8_t current_pin = DHT_PinNumbers[nextDHT]; uint8_t current_type = DHT_TYPE[nextDHT]; dhtLoopCounter = 0; करंटडीएचटी = नेक्स्ट डीएचटी; अगर (अगला डीएचटी ++> = numActiveDHTs - 1) {नेक्स्ट डीएचटी = 0; } अगर (आरवी == डीएचटीएलआईबी_ओके) {// टेस्ट चेकसम uint8_t योग = _बिट्स[0] + _बिट्स[1] + _बिट्स[2] + _बिट्स[3]; अगर (_बिट्स [4]! = योग) {आरवी = -1; } } // त्रुटि स्थिति के साथ संदेश को वापस भेजें Firmata.write(START_SYSEX); Firmata.लिखें (DHT_DATA); Firmata.write(current_pin); Firmata.write(current_type); के लिए (uint8_t i = 0; i < sizeof(_bits) - 1; ++i) { Firmata.write(_bits); // Firmata.write(_bits } Firmata.write(abs(rv)); Firmata.write(0); Firmata.write(END_SYSEX); } }

डीएचटी डिवाइस के साथ संचार करने के लिए इस्तेमाल किया जाने वाला कोड सीधे डीएचटीन्यू लाइब्रेरी से लिया गया है:

int readDhtSensor(int index){

// डेटा प्राप्त करने के लिए इनिट बफर uint8_t मास्क = 128; uint8_t आईडीएक्स = 0; // खाली बफर // मेमसेट (_bits, 0, sizeof (_bits)); के लिए (uint8_t i = 0; i 5 BYTES for (uint8_t i = 40; i!= 0; i--) {loopCnt = DHTLIB_TIMEOUT; जबकि (डिजिटल रीड (पिन) == कम) { अगर (--loopCnt == 0) वापसी DHTLIB_ERROR_TIMEOUT; } uint32_t t = micros (); loopCnt = DHTLIB_TIMEOUT; जबकि (डिजिटल रीड (पिन) == हाई) {अगर (--loopCnt == 0) DHTLIB_ERROR_TIMEOUT लौटाएं; } अगर ((माइक्रो () - टी)> ४०) { _bits [idx] | = मुखौटा; } मुखौटा >>= १; अगर (मुखौटा == 0) // अगला बाइट? {मुखौटा = 128; आईडीएक्स ++; }} DHTLIB_OK लौटाएं; }

चरण 4: DHT समर्थन के लिए Pymata4 को संशोधित करना

Private_constants.h

DHT का समर्थन करने के लिए, हमें इस फ़ाइल में नए पिन-प्रकार और SysEx संदेश दोनों जोड़ने होंगे:

# पिन मोड इनपुट = 0x00 # इनपुट के रूप में पिन सेट OUTPUT = 0x01 # आउटपुट के रूप में पिन सेट ANALOG = 0x02 # एनालॉग इनपुट मोड में एनालॉग पिन PWM = 0x03 # PWM आउटपुट मोड में डिजिटल पिन सर्वो = 0x04 # सर्वो आउटपुट मोड में डिजिटल पिन I2C = 0x06 # I2C सेटअप में शामिल पिन STEPPER = 0x08 # स्टेपर मोड में कोई भी पिन SERIAL = 0x0a PULLUP = 0x0b # पुलअप मोड में कोई भी पिन सोनार = 0x0c # सोनार मोड में कोई भी पिन टोन = 0x0d # टोन मोड में कोई भी पिन PIXY = 0x0e # पिक्सी कैमरा मोड के लिए आरक्षित DHT = 0x0f # DHT सेंसर IGNORE = 0x7f # DHT SysEx कमांड संदेश DHT_CONFIG = 0x64 # dht कॉन्फ़िगरेशन कमांड DHT_DATA = 0x65 # dht सेंसर उत्तर

जोड़े गए पिन प्रकार और SysEx कमांड को FirmataConstants.h के मान से मेल खाना चाहिए।

pymata4.py

एक संदेश हैंडलर के साथ आने वाले फर्मटा संदेश को जल्दी से जोड़ने के लिए Pymata4 एक पायथन शब्दकोश का उपयोग करता है। इस डिक्शनरी का नाम है report_dispatch.

शब्दकोश प्रविष्टि के लिए प्रारूप है:

{MessageID: [message_handler, संसाधित किए जाने वाले डेटा बाइट्स की संख्या]}

आने वाले DHT संदेशों को संभालने के लिए शब्दकोश में एक प्रविष्टि जोड़ी गई थी:

{PrivateConstants. DHT_DATA: [self._dht_read_response, 7]}

संदेश में डेटा के 7 बाइट्स Arduino डिजिटल पिन नंबर, DHT डिवाइस का प्रकार (22 या 11), और कच्चे डेटा के 5 बाइट्स हैं।

_dht_read_response विधि किसी भी रिपोर्ट की गई त्रुटि की जांच करती है। यदि कोई रिपोर्ट की गई त्रुटियां नहीं हैं, तो आर्द्रता और तापमान की गणना Arduino DHTNew लाइब्रेरी से पोर्ट किए गए एल्गोरिदम का उपयोग करके की जाती है।

परिकलित मान उपयोगकर्ता द्वारा प्रदत्त कॉलबैक विधि के माध्यम से रिपोर्ट किए जाते हैं। उन्हें आंतरिक पिन_डेटा डेटा संरचना में भी संग्रहीत किया जाता है। रिपोर्ट किए गए अंतिम मान को dht_read विधि का उपयोग करके pin_data पोलिंग द्वारा वापस बुलाया जा सकता है।

एक नया DHT डिवाइस कॉन्फ़िगर करना

एक नया DHT डिवाइस जोड़ते समय, set_pin_mode_dht विधि को कॉल किया जाता है। यह विधि डिजिटल पिन के लिए pin_data को अपडेट करती है। यह एक DHT_CONFIG SysEx संदेश भी बनाता है और उसे FirmataExpress पर भेजता है।

चरण 5: रैपिंग अप

जैसा कि हमने देखा है, एक नए डिवाइस के लिए फर्मटा समर्थन जोड़ने के लिए आपको Arduino FirmataExpress सर्वर कोड और पायथन-आधारित pymata4 क्लाइंट कोड को संशोधित करने की आवश्यकता है। FirmataExpress कोड डिबग करने के लिए चुनौतीपूर्ण हो सकता है। डिबगिंग में सहायता के लिए फर्मटाटा एक्सप्रेस में प्रिंटडाटा नामक एक विधि जोड़ी गई थी। यह विधि आपको FirmataExpress से डेटा मान भेजने की अनुमति देती है और उन्हें pymata4 कंसोल पर प्रिंट करेगी।

इस फ़ंक्शन के लिए एक वर्ण स्ट्रिंग के लिए एक पॉइंटर और वह मान जो आप देखना चाहते हैं, दोनों की आवश्यकता होती है। यदि डेटा मान argc नामक चर में समाहित है, तो आप निम्न पैरामीटर के साथ PrintData को कॉल कर सकते हैं।

प्रिंटडाटा ((चार *) "argc =", argc);

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

हैप्पी कोडिंग!

सिफारिश की: