DIY करते-करते-खुद अंतरिक्ष यान नियंत्रण कक्ष


नमस्कार प्रिय पाठकों!

एक विचार मुझे यहां आया था, लेकिन एक अंतरिक्ष यान के लिए नियंत्रण कक्ष को इकट्ठा करने के लिए नहीं। को USB। मूल चालक समर्थन के साथ। कस्टम छिपाई। छड़ी करने के लिए और सब कुछ काम करता है, बिना किसी नाच और तंबू के। नतीजतन, हमें अंतरिक्ष सिमुलेटर के लिए एक प्रकार का राक्षसी "गेमपैड" मिला। सामान्य तौर पर, खुद के लिए न्यायाधीश।

सबसे पहले, मुझे थोड़ा अंदाजा था कि अंत में क्या होगा। मुझे दो मुख्य जॉयस्टिक चाहिए थे, जैसे सोयूज़-एमएस, कुछ स्विच, बटन और कई डिस्प्ले।

अपनी तालिका की कार्यशील सतह का अनुमान लगाने के बाद, मैंने कंसोल की चौड़ाई चौड़ाई और गहराई 500 * 300 मिमी चुनी। और निर्माण सामग्री की तलाश में निर्माण गोदामों और दुकानों के माध्यम से अफवाह फैलाने के बाद, उन्होंने 125 मिमी की ऊंचाई को चुना। नतीजतन, मैंने 4 मिमी प्लाईवुड की एक शीट अधिग्रहित की, 20 * 12 मिमी और एक बोर्ड 120 * 20 मिमी।

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



लेकिन अभी के लिए, पेंटिंग का काम एक तरफ छोड़ दें और मैं इलेक्ट्रॉनिक स्टफिंग के बारे में बात करूंगा।

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


बाकी छोटी चीज़ों से समस्या नहीं हुई। नियंत्रक ने STM32 का चयन किया। जॉयस्टिक के लिए एक एडीसी के रूप में, 16-बिट ADS1118। एक 12 वी बिजली की आपूर्ति भी खरीदी गई थी। वास्तव में, यह वोल्टेज इस तथ्य के कारण है कि मुझे "शाह" से एक ईंधन गेज मिला, जिसे मैं यहां संलग्न करना चाहता था।


तस्वीर में, बिजली की आपूर्ति, 5 और 3.3 V, STM32, MCP23017, ADS1118 के लिए स्टेबलाइजर्स

नियंत्रक 100-पिन STM32F407VET6, इससे जुड़ा:

4 पदों के लिए 2 चयनकर्ता
1 चर अवरोध करनेवाला
2 एक्सल स्विच
4 मुख्य कुल्हाड़ियों
2 सहायक कुल्हाड़ियों
2 नियंत्रण धुरों
4 कुंजी स्विच, 2 बटन प्रत्येक
एलईडी के साथ 20 बटन
एलईडी के साथ 4 मुख्य स्विच
एलईडी के साथ 2 कवक बटन
2 टाइमर बटन
एलईडी के साथ 3 स्विच
13 स्विच
2 ADS1118 (ADC)
4 MAX7219 (8-अंकीय एलईडी डिस्प्ले)
2 TM1637 (प्रदर्शन घंटे)
1 PCF8574 (I / O विस्तारक, चरित्र-संश्लेषित प्रदर्शन में प्लग किया गया)


परिणामी संरचना

यह एमके के सैकड़ों पैरों के लिए थोड़ा बहुत होगा, मैंने तय किया, और यहां I / O विस्तारकों को जोड़ा: 16 इनपुट या आउटपुट के लिए MCP23017 के चार टुकड़े। आगे देखते हुए, मैं कहूँगा कि 400 kHz की I2C बस की गति से, प्रति चिप के बारे में 0.13 एमएस प्रति चिप के आदान-प्रदान में देरी हुई। यही है, यह एक मार्जिन के साथ 1 एमएस के न्यूनतम यूएसबी मतदान समय को कवर करता है।

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

ADS1118 ADC USB गति के साथ कुछ हद तक नहीं रखता है, इसका घोषित प्रदर्शन प्रति सेकंड 820 नमूनों में है, जो 1.2 एमएस है, जबकि इसमें कई इनपुट हैं जो पहले से ही मल्टीप्लेक्सर के माध्यम से ADC से जुड़े हैं। मैंने एक चिप पर 2 इनपुट का उपयोग किया है, इसलिए मानों का अद्यतन समय 2.4 एमएस है। बुरा है, लेकिन आप क्या कर सकते हैं? दुर्भाग्य से, अली पर कोई अन्य 16-बिट फास्ट एडीसी नहीं हैं।


अंदर यह ऐसा दिखता है, लेकिन तारों को स्थापित करने के बाद यह बहुत खराब है

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

बेशक, CubeMX और HAL पुस्तकालयों का उपयोग किया जाता है। वैसे, मैंने हाल ही में एचएएल पर स्विच किया और सुविधा के बारे में सोचा। मुझे नहीं पता कि यह अभी भी बहुत लोकप्रिय क्यों नहीं है, मुख्य बात यह है कि इसे पहले पता लगाना है, और फिर यह बहुत सरलता से चलेगा। ऐसा लगता है कि आप arduino प्रोग्रामिंग कर रहे हैं।

डिवाइस में हमारे पास USB कस्टम छिपाई होगी। HID माउस, कीबोर्ड, गेमपैड, जॉयस्टिक, कुछ और है। और रिवाज है। यह सब ऑपरेटिंग सिस्टम के ड्राइवरों की आवश्यकता नहीं है। अधिक सटीक रूप से, वे पहले से ही डेवलपर द्वारा लिखे गए हैं। एक कस्टम डिवाइस अच्छा है कि हम स्वयं अपने विवेक पर उपरोक्त सभी उपकरणों की क्षमताओं को जोड़ते हैं।

सामान्य तौर पर, USB चीज बहुत जटिल होती है, इसमें लगभग एक हजार पृष्ठों का मैनुअल होता है और आप इसे स्नैप से नहीं ले सकते। भारी मैनुअल को कौन नहीं पढ़ना चाहता है, नटशेल, गूगल में एक बेहतरीन लेख यूएसबी है। उसका अनुवाद भी है। मैं "उंगलियों पर" कुछ बिंदुओं को समझाने की कोशिश करूंगा।

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

वास्तव में, CubeMX हमसे बेहतर कस्टम HID आरंभीकरण कोड उत्पन्न करेगा।





कृपया संख्या 3 के तहत अंतिम तस्वीर पर ध्यान दें। यह बाइट्स में डिस्क्रिप्टर का आकार है, जो यह निर्धारित करता है कि हमारे डिवाइस पर कौन से अक्ष और बटन हैं। यह डिस्क्रिप्टर HID डिस्क्रिप्टर टूल में उत्पन्न होता है। स्वाध्याय के लिए कई उदाहरण हैं। आम तौर पर, यहाँ मेरा वर्णनकर्ता है। समझने में आसानी के लिए अभी तक कोई डेटा नहीं है, लेकिन जॉयस्टिक के सभी बटन और कुल्हाड़ी मौजूद हैं। इसे usbd_custom_hid_if.c फ़ाइल में रखा जाना चाहिए। डिफ़ॉल्ट रूप से, यह हैंडल क्यूब को खाली करता है।

छिपाई वर्णक (आकार 104 बाइट्स)
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { /* USER CODE BEGIN 0 */ 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x09, 0x04, // USAGE (Joystick) 0xa1, 0x01, // COLLECTION (Application) 0x05, 0x02, // USAGE_PAGE (Simulation Controls) 0x09, 0xbb, // USAGE (Throttle) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535) 0x75, 0x10, // REPORT_SIZE (16) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Pointer) 0xa1, 0x00, // COLLECTION (Physical) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x32, // USAGE (Z) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x33, // USAGE (Rx) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x34, // USAGE (Ry) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x35, // USAGE (Rz) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x36, // USAGE (Slider) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x39, // USAGE (Hat switch) 0x15, 0x01, // LOGICAL_MINIMUM (1) 0x25, 0x08, // LOGICAL_MAXIMUM (8) 0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x46, 0x0e, 0x01, // PHYSICAL_MAXIMUM (270) 0x65, 0x14, // UNIT (Eng Rot:Angular Pos) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x40, // USAGE_MAXIMUM (Button 64) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x40, // REPORT_COUNT (64) 0x55, 0x00, // UNIT_EXPONENT (0) 0x65, 0x00, // UNIT (None) 0x81, 0x02, // INPUT (Data,Var,Abs) /* USER CODE END 0 */ 0xC0 /* END_COLLECTION */ }; 


वास्तव में, यह आपकी पसंद के अनुसार बनाया जा सकता है, पहले आप USAGE PAGE पैरामीटर और आवश्यक USAGE सेट करते हैं, उदाहरण के लिए, USAGE (थ्रॉटल) अक्ष, और उसके बाद INPUT (डेटा, Var, Abs) शब्द के बाद, सिस्टम मान लेगा कि हमारे पास "गैस" अक्ष है। चर अक्ष का आयाम और उनकी संख्या पैरामीटर LOGICAL_MAXIMUM, MINIMUM, REPORT_SIZE, REPORT_COUNT द्वारा निर्धारित की जाती है, जो INPUT से पहले होनी चाहिए।

इन मापदंडों के बारे में अधिक जानकारी, साथ ही क्या (डेटा, वार, एबीएस) मानव इंटरफ़ेस डिवाइस (छिपाई) v1.11 के लिए डिवाइस क्लास परिभाषा में पाया जा सकता है।

निम्नलिखित मेरे विवरणक से थ्रोटल अक्ष को शुरू करने का एक उदाहरण है। इस उदाहरण में, थ्रॉटल की मूल्य सीमा 0-65535 है, जो एक uint16_t चर से मेल खाती है।

  0x05, 0x02, // USAGE_PAGE (Simulation Controls) 0x09, 0xbb, // USAGE (Throttle) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535) 0x75, 0x10, // REPORT_SIZE (16) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 

और हां, फिर भी, मान लें कि आप हर बार LOGICAL_MAXIMUM, MINIMUM, REPORT_SIZE, REPORT_COUNT नहीं लिख सकते, मेजबान पिछले मान से इस मान का निर्धारण करेगा। यह कुल्हाड़ियों द्वारा चित्रित किया गया है जो आकार और संख्या को निर्दिष्ट किए बिना एक के बाद एक जाते हैं:

  0x09, 0x32, // USAGE (Z) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x33, // USAGE (Rx) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x34, // USAGE (Ry) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x35, // USAGE (Rz) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x36, // USAGE (Slider) 

निम्नलिखित संरचना इस सभी विवरणक से मेल खाती है, जो स्पॉइलर के नीचे अधिक है। वास्तव में, यह अब अनिवार्य नहीं है, यह संकेत के आधार पर रिकॉर्ड करने के लिए अधिक सुविधाजनक है।

 #pragma pack(push, 1) typedef struct _myReportStruct { uint16_t Throttle; uint16_t X; uint16_t Y; uint16_t Z; uint16_t Rx; uint16_t Ry; uint16_t Rz; uint16_t Slider; uint8_t Hat; // 0 - none, 1 - up, 2 - up-right, 3 - right, 4 - down-right... uint32_t Buttons1; // 32 buttons of 1 bit each uint32_t Buttons2; // 32 buttons of 1 bit each }myReportStruct; #pragma pack(pop) volatile myReportStruct Desk; 

यह संरचना फ़ंक्शन द्वारा होस्ट को भेजी जा सकती है

 USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, (uint8_t *) &Desk, sizeof(Desk)); 

पहला पैरामीटर एक यूएसबी हैंडल है, यह पहले से ही हमारे क्यूब में बनाया गया है। आपको आवश्यक फ़ाइल को शामिल करने की आवश्यकता हो सकती है जिसमें यह संभाल पहली बार शुरू की गई है और बाहरी USBD_HandleTypeDef hUsbDeviceFS लिखें; ताकि आप उसके साथ काम कर सकें। दूसरा पैरामीटर हमारी संरचना का एक संकेतक है और तीसरा बाइट्स में संरचना का आकार है।

नियंत्रक को भरने और चमकाने के बाद, आप देखेंगे कि कुछ यूएसबी धीरे-धीरे आगे बढ़ रहा है। हमारे पैनल का डेटा जल्दी से अपडेट नहीं होता है। त्वरित होने के लिए, usbd_customhid.h फ़ाइलों में आपको #define CUSTOM_HID_EPIN_SIZE को अधिकतम मान 0x40 में बदलना होगा, #define CUSTOM_HID_POUT_SIZE ने भी 0x40 सेट किया है। Usbd_customhid.c फ़ाइल में, एंडपॉइंट डिस्क्रिप्टर में टिप्पणियों को ढूंढें "/ * bInterval: पोलिंग इंटरवल (20 एमएस) * /" और प्रत्येक दो बिंदु के लिए डिस्क्रिप्टर बाइट को 0x01 में बदल दें, केवल दो बार। जो 1 एमएस डेटा एक्सचेंज के अनुरूप होगा।


यह कुछ इस तरह होना चाहिए। किसी भी ड्राइवर को स्थापित किए बिना मानक डिवाइस

सामान्य तौर पर, प्रबंधन फ़ंक्शन थोड़ा समझा जाता है। यह करना काफी आसान है और सभी बटन और कुल्हाड़ी पहले से ही काम कर रहे हैं। यह डिस्प्ले को काम करने के लिए बना हुआ है। मैंने इसे किया, लगभग छह महीने, और आधे साल तक पैनल एक लंबे बक्से में धूल इकट्ठा कर रहा है। कोई समय नहीं। इसलिए, मैंने इस रूप में लेख को बाहर करने का फैसला किया, अन्यथा यह बाहर नहीं आने का भी जोखिम है।

डिस्प्ले के साथ, एक्सिस के साथ सब कुछ वैसा ही है। उनके लिए, हमें अपने डिवाइस HID डिस्क्रिप्टर को पूरक करने की आवश्यकता है, बस यह इंगित करें कि ये डिस्प्ले हैं और इनपुट डेटा को स्वीकार करने के बजाय, होस्ट आउटपुट डेटा भेजेगा।

HID डिवाइस के हैंडल में काफी वृद्धि हुई है। यहाँ मैंने पहले से ही रिपोर्ट आईडी मापदंडों को लागू किया है ताकि पूर्ण डेटा के साथ प्रेषित / प्राप्त बफ़र और समापन बिंदुओं को रोकना न हो और यह पता चले कि हमें किस प्रकार का टेलीग्राम प्राप्त हुआ है। रिपोर्ट आईडी टेलीग्राम की शुरुआत में आने वाले मूल्य के साथ एक uint8_t बाइट है। हम डिवाइस डिस्क्रिप्टर HID में जो मान सेट करते हैं।

CUSTOM_HID_ReportDesc_FS
 //AXIS 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x04, // USAGE (Joystick) 0xa1, 0x01, // COLLECTION (Application)28 0x05, 0x02, // USAGE_PAGE (Simulation Controls) 0x09, 0xbb, // USAGE (Throttle) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535) 0x75, 0x10, // REPORT_SIZE (16) 0x95, 0x01, // REPORT_COUNT (1) 0x85, 0x01, // REPORT_ID (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Pointer) 0xa1, 0x00, // COLLECTION (Physical) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x32, // USAGE (Z) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x33, // USAGE (Rx) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x34, // USAGE (Ry) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x35, // USAGE (Rz) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x09, 0x36, // USAGE (Slider) 0x81, 0x02, // INPUT (Data,Var,Abs) //HAT 0x09, 0x39, // USAGE (Hat switch) 0x15, 0x01, // LOGICAL_MINIMUM (1) 0x25, 0x08, // LOGICAL_MAXIMUM (8) 0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x46, 0x0e, 0x01, // PHYSICAL_MAXIMUM (270) 0x65, 0x14, // UNIT (Eng Rot:Angular Pos) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) //Buttons 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x40, // USAGE_MAXIMUM (Button 64) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x40, // REPORT_COUNT (64) 0x55, 0x00, // UNIT_EXPONENT (0) 0x65, 0x00, // UNIT (None) 0x81, 0x02, // INPUT (Data,Var,Abs) //LEDs 0x85, 0x02, // REPORT_ID (2) 0x05, 0x08, // USAGE_PAGE (LEDs) 0x09, 0x4B, // USAGE (Generic Indicator) 0x95, 0x40, // REPORT_COUNT (16) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0xc0, // END_COLLECTION //LCD Displays 0x05, 0x14, // USAGE_PAGE (Alphnumeric Display) 0x09, 0x01, // USAGE (Alphanumeric Display) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0xa1, 0x02, // COLLECTION (Logical) 0x09, 0x32, // USAGE (Cursor Position Report) 0xa1, 0x02, // COLLECTION (Logical) 0x85, 0x04, // REPORT_ID (4) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x01, // REPORT_COUNT (1) 0x25, 0x13, // LOGICAL_MAXIMUM (19) 0x09, 0x34, // USAGE (Column) 0xb1, 0x22, // FEATURE (Data,Var,Abs,NPrf) 0x25, 0x03, // LOGICAL_MAXIMUM (3) 0x09, 0x33, // USAGE (Row) 0x91, 0x22, // OUTPUT (Data,Var,Abs,NPrf) 0xc0, // END_COLLECTION 0x09, 0x2b, // USAGE (Character Report) 0xa1, 0x02, // COLLECTION (Logical) 0x85, 0x05, // REPORT_ID (5) 0x95, 0x14, // REPORT_COUNT (20) 0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (255) 0x09, 0x2c, // USAGE (Display Data) 0x92, 0x02, 0x01, // OUTPUT (Data,Var,Abs,Buf) 0xc0, // END_COLLECTION 0x09, 0x24, // USAGE (Display Control Report) 0x85, 0x06, // REPORT_ID (6) 0x95, 0x01, // REPORT_COUNT (1) 0x91, 0x22, // OUTPUT (Data,Var,Abs,NPrf) 0xc0, // END_COLLECTION //LED Displays 0x05, 0x14, // USAGE_PAGE (Alphnumeric Display) 0x09, 0x01, // USAGE (Alphanumeric Display) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0xa1, 0x02, // COLLECTION (Logical) 0x09, 0x2b, // USAGE (Character Report) 0xa1, 0x02, // COLLECTION (Logical) 0x85, 0x07, // REPORT_ID (7) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x28, // REPORT_COUNT (40) 0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (255) 0x09, 0x2c, // USAGE (Display Data) 0x92, 0x02, 0x01, // OUTPUT (Data,Var,Abs,Buf) 0xc0, // END_COLLECTION //Other DATA 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x08, // REPORT_ID (8) 0x09, 0x01, // USAGE (Vendor Usage 1) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x27, 0xff, 0xff, 0x00, 0x00, // LOGICAL_MAXIMUM (65535) 0x75, 0x10, // REPORT_SIZE (16) 0x95, 0x0A, // REPORT_COUNT (10) 0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol) 

आउटपुट को स्थैतिक int8_t फ़ंक्शन CUSTOM_HID_OutEvent_FS (uint8_t event_idx, uint8_t राज्य) में संसाधित किया जाता है , जो कि डिफ़ॉल्ट रूप से usbd_cid_hid_if.c पर स्थित है।

स्थिर int8_t CUSTOM_HID_OutEvent_FS ()
 static int8_t CUSTOM_HID_OutEvent_FS(uint8_t event_idx, uint8_t state) { /* USER CODE BEGIN 6 */ uint8_t dataReceiveArray[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE]; USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceFS.pClassData; for (uint8_t i = 0; i < USBD_CUSTOMHID_OUTREPORT_BUF_SIZE; i++) { dataReceiveArray[i] = hhid->Report_buf[i]; } if (dataReceiveArray[0] == 2) //report ID 2 leds { //  Report id == 2,   -     dataReceiveArray[1 + N], ,  LED } if (dataReceiveArray[0] == 4) //report ID 4 cursor position { //  Report id == 4,   -,     LCD } if (dataReceiveArray[0] == 5) //report ID 5 display data { //  Report id == 5,   -,     USB  LCD } //   ,   ID     return (USBD_OK); /* USER CODE END 6 */ } 


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


एलईडी डिस्प्ले टेस्ट

इस स्तर पर, मैं अब तक समाप्त कर चुका हूं। और यह पता नहीं है कि मैं फिर से शुरू करूंगा।

यह कीबोर्ड की तुलना में अधिक रोचक सिमुलेटर में खेला जाता है। लेकिन इतना नहीं कि प्रत्यक्ष रूप से वाह प्रभाव था। कीबोर्ड, यह एक नियंत्रण कक्ष जैसा दिखता है। लेकिन जॉयस्टिक एक्सल को नियंत्रित करना कम से कम, असामान्य है। एक अंतरिक्ष यात्री की तरह महसूस करें। सच है, पूर्ण विसर्जन के लिए एक स्पेससूट की जरूरत होती है।

मुझे आशा है कि आप रुचि रखते थे। टाइपोस, अशुद्धियां और भ्रम मौजूद हैं। जो लोग कोड में गहरी खुदाई करना चाहते हैं वे यहां देख सकते हैं।

निष्ठा से।

Source: https://habr.com/ru/post/hi434854/


All Articles