अंत में, हमने OMower प्रोजेक्ट के लिए वादा किया SDK (Arduino IDE में डेवलपमेंट सपोर्ट के साथ 32-बिट ATSAM3X8E कंट्रोलर पर आधारित पहिएदार रोबोट के लिए एक ओपन सॉफ्टवेयर और हार्डवेयर प्लेटफ़ॉर्म) प्रकाशित करने के लिए लगभग मिला। सॉफ्टवेयर पूरा होने का स्तर बहुत अच्छा नहीं है (उदाहरण के लिए, बम्पर, बारिश और घास सेंसर के लिए कोई कक्षाएं नहीं हैं, कुछ फ़ंक्शन पूरी तरह से डीबग नहीं किए जाते हैं), लेकिन यहां तक कि अपने वर्तमान रूप में भी रोबोट आरटीके जीपीएस के माध्यम से उच्च सटीकता के साथ ड्राइव कर सकता है, यह लगभग वह सब कुछ है जिसकी आवश्यकता है मावर्स - सोनार, वायर्ड परिधि, कम्पास और जीपीएस नेविगेशन, एक चार्जिंग स्टेशन या सौर पैनल से चार्ज करना।
OMower परियोजना पर मेरा पिछला लेखसर्किट के साथ एसडीके कोड और किकाड फाइलें और बोर्ड की वायरिंग
गीथब पर होती है ।
वर्तमान में, केवल दो प्लेटफार्मों का समर्थन किया जाता है - पोलुअर दोहरे MC33926 मोटर चालकों के साथ OMower बोर्ड v3 और Arduino ड्यू + IHM12A1 मोटर ड्राइवरों का एक गुच्छा (छोटे चार-पहिया चेसिस पर परीक्षण मशीन)। Arduino ड्यू पर आधारित अर्दोवर समर्थन जोड़ा जा सकता है। यह IMU GY-80 बोर्ड के लिए अत्यधिक वांछनीय है, इसके बिना, नेविगेशन बस काम नहीं करता है (हालांकि आप एक साधारण घास काटने की मशीन आदमी बना सकते हैं जो गलती से तार परिधि के अंदर ड्राइव करता है)।
बोर्ड के नए, चौथे संस्करण में, उस पर एक IMU MPU9250 डालने और उपयोगकर्ता की सेटिंग्स को बचाने के लिए FRAM चिप जोड़ने की योजना है, जो नियंत्रक के आंतरिक फ्लैश में नहीं है (जो कि फर्मवेयर को फिर से लोड किए जाने पर रीसेट हो जाता है), अच्छी तरह से, सभी प्रकार के कार्ड इसमें संग्रहीत किए जा सकते हैं। इसके अलावा, मैं शायद रोकनेवाला और संधारित्र असेंबलियों के आकार में वृद्धि करूंगा, 0402 "घुटने पर टांका लगाना" एक हेअर ड्रायर के साथ औसत से नीचे एक खुशी थी, और कनेक्टर्स के लिए जगह बढ़ाता हूं ताकि आप उन क्लिपों को डाल सकें, न कि केवल चिपके हुए पिन।
API कोड मुट्ठी भर कक्षाओं (omower - *। H फ़ाइलों) के रूप में लिखा जाता है, जिन्हें आपको अपने सॉफ़्टवेयर में ऑब्जेक्ट के रूप में शामिल करने की आवश्यकता होती है (और, वैकल्पिक रूप से, उनमें से सभी को शामिल करें, आप केवल उन लोगों को ले सकते हैं जो आधार वाले को छोड़कर)। समझ और परीक्षण को सरल बनाने के लिए, OMower_Simple
लिखा गया
था , जो किसी भी स्मार्टफोन से pfodApp के माध्यम से जारी किए गए आदेशों का एक बहुत बड़ा सेट निष्पादित करता है।
एसडीके सभी निम्न-स्तरीय कार्यों को नियंत्रित करता है और मुख्य रूप से इंटरप्ट पर काम करता है, जो अंतिम सॉफ्टवेयर प्रोग्रामर को किसी विशेष रोबोट के विशिष्ट विवरण से स्वतंत्र सॉफ्टवेयर लिखने की क्षमता देता है, और बहुत ही स्वतंत्र तरीके से (आप एक राज्य मशीन लिख सकते हैं, या आप बस स्टार्ट ड्राइव फ़ंक्शन को कॉल कर सकते हैं। और रोबोट को वांछित बिंदु तक पहुंचने के लिए प्रतीक्षा करें)। केवल रोबोट की सवारी के आरंभीकरण और नियंत्रण के कार्यों को कॉल करने की प्रक्रियाएं प्रोग्रामर के कंधे (जहां वास्तव में, सोनार और अन्य सेंसर के संचालन के लिए जाने और प्रसंस्करण के लिए) के कंधों पर पड़ती हैं।
बोर्ड पर अतिरिक्त बाहरी उपकरणों को जोड़ने के लिए (और निश्चित रूप से एसडीके में समर्थन) - कई बाहरी कनेक्टर हैं। उदाहरण के लिए, PPM इनपुट के साथ मानक इमदादी ड्राइव चार टुकड़ों (या यहां तक कि छह अगर आप दो मोटर्स से इनकार करते हैं) तक जुड़ सकते हैं। घास काटने की मशीन के लिए "मानक" सेंसर का एक बहुत हैं, इनमें से छह के रूप में कई हैं, और परिधि सेंसर के चार। बेशक, ज्यादातर मामलों में, इतनी ज़रूरत नहीं होती है और उनके कनेक्टर का हिस्सा कुछ अन्य उपकरणों को जोड़ने के लिए इस्तेमाल किया जा सकता है (लगभग माइक्रोकंट्रोलर के सभी आउटपुट आउटपुट हैं)। ऑरेंज पीआई ज़ीरो द्वारा बौद्धिक भाग (प्रसंस्करण आरटीके जीपीएस, वाईफाई के साथ कनेक्टिविटी) का प्रदर्शन किया जाता है, जो एक विशेष कनेक्टर में स्थापित होता है।
मैं वक्र और अधूरे कोड के लिए पहले से माफी मांगता हूं, मुझे अन्य परियोजनाओं में खुदाई करनी पड़ी, और सभी प्रकार की कठिनाइयों का सामना करना पड़ा, जिन्हें मैं शायद ही सामना कर सकता हूं। लेकिन मैंने कई नई चीजें सीखीं, उदाहरण के लिए, कि हमारे स्थानों में पृथ्वी के दीर्घवृत्त की वक्रता लगभग 40 मीटर है, और पृथ्वी के चुंबकीय ध्रुव वर्ष-दर-वर्ष दसियों किलोमीटर घूमते हैं (इसे ध्यान में रखे बिना, रोबोट ने बहुत घुमावदार रेखाओं के साथ बिंदु से बिंदु तक यात्रा की)। कई बार ऐसा लगा कि मैं स्पेस रॉकेट लॉन्च कर रहा हूं, न कि लॉन घास काटने की जगह। :)
खैर, एक बोनस के रूप में, मैंने डेकावे DW1000 के साथ arduino के लिए अपने फर्मवेयर के स्रोतों को भी निर्धारित किया है, जो इन उपकरणों के एक मिनी-नेटवर्क का आयोजन करता है और रोबोट को अपने घर के अंदर या जहां RTK जीपीएस अपने निर्देशांक (लगभग एक अनंत राशि के लिए समर्थन के साथ) निर्धारित नहीं कर सकता है। टैग और कमरों में विभाजित)। यह
फर्मवेयर अभी भी बहुत कच्चा है, लेकिन यह किसी के काम आ सकता है।
अपडेट करें, मैंने लेख को इस बात की कहानी के साथ पूरक करने का फैसला किया कि यह अंदर कैसे व्यवस्थित है:
एसडीके उपयोगकर्ता को अपनी ज़रूरत की सभी वस्तुओं का निर्धारण करना चाहिए, सभी के लिए शुरुआती () फ़ंक्शन को कॉल करें (केवल एक बार हार्डवेयर इनिशियलाइज़ेशन), फिर उनके मापदंडों का मान सेट करें (फ्लैश या बस डिफ़ॉल्ट मानों से पढ़ने के बाद), सभी के लिए इनिट () कॉल कर सकते हैं (फ़ंक्शन) जिस उपकरण को ऑब्जेक्ट के लिए जिम्मेदार है, उसे रीसेट करने के लिए उपयोग किया जाता है), पोल 10 / पोल 20 / पोल 50 (10, 20 और 50 बार प्रति सेकंड) के लिए हुक फ़ंक्शन सेट करें, जिसमें से सभी उपयोग की गई वस्तुओं के संबंधित पोल * () फ़ंक्शन को बुलाया जाना चाहिए। सैद्धांतिक रूप से, एसडीके के कोड में ही यह सब स्वचालित करना संभव था, लेकिन मैंने नियंत्रक संसाधनों की अतिरिक्त खपत के कारण ऐसा नहीं करने का फैसला किया। उपयोग का एक उदाहरण आपको OMower_Simple.ino पर देखना होगा
मुख्य वर्गों में से एक मोटर ऑब्जेक्ट (ओमोवर-मोटर्स.एच) है, जो मोटर चालकों को इसके पोल 10 () फ़ंक्शन से नियंत्रित करता है। उपयोगकर्ता केवल रोल / मूव (टर्न और राइड विदाउट नेविगेशन) या रोलचार्ज / मूवकास्ट (नेविन्थिंग क्लास के कुछ ऑब्जेक्ट चाइल्ड के डेटा पर आधारित नेविगेशन / करेक्शन के साथ सवारी करता है), जो कि रीडकोर्सर्र () कार्यों के माध्यम से वांछित ड्राइविंग दिशा से विचलन का मूल्य देता है। )।
नेविन्थ के डेरिवेटिव्स imu और gps classes (omower-imu.h और omower-gps.h) की वस्तुएं हैं, पहला कम्पास / एक्सेलेरोमीटर / जाइरोस्कोप डेटा को एक सुविधाजनक रूप में पढ़ने और परिवर्तित करने के लिए जिम्मेदार है (यह दो अक्षों पर डिग्री में कम्पास और झुकाव मान देता है। )। दूसरा एक - GPS डेटा प्रोसेस करता है और अगर आप GPS या RTK GPS निर्देशांक (बाद के लिए, एंटीना को रोबोट बॉडी के केंद्र में नहीं रखा जाता है और ओडोमीटर सेंसरों के लिए अल्पकालिक सुधार) में सवारी की आवश्यकता होती है, तो मोटर ऑब्जेक्ट को सही दिशा में निर्देशित करता है। उपयोगकर्ता प्रोग्राम GPS रिसीवर के साथ संचार के लिए स्वयं जिम्मेदार है और NMEA स्ट्रिंग्स या तैयार निर्देशांक को जीपीएस ऑब्जेक्ट तक पहुंचाता है।
मोव ऑब्जेक्ट (omower-mow.h) कतरनी मोटर के लिए जिम्मेदार है और इसके एक्ट्यूएटर एक स्टेपर मोटर (यदि कोई हो) के साथ लहराता है। यूजर कहता है कि किस गति से घूमना है और किस कटिंग की ऊंचाई तय करनी है।
PwmServo ऑब्जेक्ट (omower-pwmservo.h) पीडब्लूएम-ए / बी / सी / डी / ई / एफ / जी / एच आउटपुट को नियंत्रित करता है (यह टाइमर के साथ संभावित संघर्ष के कारण अन्य पुस्तकालयों के माध्यम से नहीं किया जा सकता है)।
पावर ऑब्जेक्ट (omower-power.h) चार्ज नियामकों को नियंत्रित करने और एडीसी मूल्यों को वोल्ट और एम्पीयर में परिवर्तित करने के लिए जिम्मेदार है जिसे हर कोई समझता है। उपयोगकर्ता कार्यक्रम को चार्ज इलेक्ट्रोड पर वोल्टेज की घटना का पता लगाना चाहिए और चार्जिंग चालू करने के कार्य को कॉल करना चाहिए, फिर यह चार्जिंग चालू से मेल खाने के लिए नियामकों के पीडब्लूएम चक्रों को उठाएगा।
चूंकि मानक अर्डुइन सीरियल * का उपयोग करने से ऑब्जेक्ट्स इंटरप्ट हैंडलिंग (नीचे देखें) को बाधित कर सकते हैं, सीरियल पोर्ट को पढ़ने और प्रसारित करने के लिए एक सीरियल ऑब्जेक्ट (omower-serial.h) है। दुर्भाग्य से, I2C बसों के साथ एक ही समस्या मौजूद है, उन्हें नियत-i2c-block.h में परिभाषित फ़ंक्शन का उपयोग करके उपयोग किया जाना चाहिए।
अन्य वस्तुओं के कार्य उनके नाम से स्पष्ट हैं, आप केवल हेडर फ़ाइलों (omower-sonars.h, omower-rtc.h, omower-current * .h, omower-odometry.h, आदि) में टिप्पणियों को देख सकते हैं।
अब सबसे निचले स्तर पर व्यवधान के बारे में। चेसिस ऑब्जेक्ट (omower-chassis.h) TIM7 को प्रति सेकंड 100 इंटरप्ट करता है। प्रत्येक रुकावट पर, MAX11617 ADC चिप के 12 चैनल पढ़े जाते हैं (एक विशेष सरणी में दर्ज किए जाते हैं, जहाँ से OMower SDK ऑब्जेक्ट उनके मानों को पढ़ते हैं - max11617-adc-scan.h)। प्रत्येक सेकंड पर - पोल 50 () फंक्शन हुक, हर पांचवें - पोल 20 (), हर दसवें पर पोल 10 () के लिए एक सॉफ्ट इंटरप्ट उत्पन्न होता है। वे सभी अतुल्यकालिक रूप से काम करते हैं (जो सुविधाजनक है, लेकिन I2C बस के उपयोग पर प्रतिबंध लगाता है, बाद में मैं वहां कुछ लेनदेन / सेमाफोर जोड़ने की योजना बनाता हूं)।
TIM5 टाइमर को 38462 हर्ट्ज की आवृत्ति के साथ व्यवधान उत्पन्न करने के लिए भी कॉन्फ़िगर किया गया है। इस रुकावट से, आंतरिक एडीसी नियंत्रक के सभी चैनलों को पढ़ा जाता है और एक विशेष सरणी में प्रवेश किया जाता है (यह रिंग बफर में चयनित बफर के लिए प्रत्येक प्राप्त मूल्य में प्रवेश करने का समर्थन करता है, जो कि किया जाता है, उदाहरण के लिए, परिधि वर्ग द्वारा, बाद में इन नमूनों को फ़िल्टर करके फूरियर रूपांतरण का उपयोग करके)।
संदेश आउटपुट के लिए न्यूनतम प्राथमिकता निर्धारित करने के साथ डिबगिंग जानकारी जारी करने के लिए एक डीबग () फ़ंक्शन है (जबकि, डीबगिंग नहीं किया जाता है, कंसोल पर कुछ भी आउटपुट नहीं होगा, लेकिन किसी भी समय आप कम से कम अधिकतम स्तर सक्षम कर सकते हैं, यह स्पैम हो जाएगा)। डिबगिंग मानों के स्वरूपों में (* प्रिंटफ-प्रारूप), फ़्लोटिंग-पॉइंट नंबर समर्थित हैं (मानक Arduin फ़ंक्शन के विपरीत)।
अद्यतन: ओएमओवर बोर्ड का नया चौथा संस्करण, अब तक केवल एक सर्किट (पीसीबी के निर्माण की प्रतीक्षा कर रहा है)। इसके अलावा एक कम्पास / एक्सेलेरोमीटर MPU9250, सेटिंग्स, मैप्स, वेपाइंट्स और अन्य चीजों को बचाने के लिए F-RAM की 128 किलोबाइट्स, सभी कनेक्टरों को latches (Molex 22-11-20x3 / 10-11-20x3, एक 2.54 से पुराने संस्करण के साथ संगत) पिंस), सोनार और ओडोमीटर के लिए 74HC4050 लॉजिक लेवल ट्रांसलेटर, अधिक शक्तिशाली 3.3 / 5 वोल्ट पावर कन्वर्टर्स (तीन एम्पीयर तक), कनेक्टर्स पर दो और पीडब्लूएम / पीपीएम आउटपुट, दूसरे स्टेपर मोटर ड्राइवर के स्वतंत्र नियंत्रण के लिए अलग लाइन, स्थिरता के लिए अधिक बफर कैपेसिटर। आसान विधानसभा के लिए बड़े एसएमडी तत्व मामूली संशोधन।
