विषयसूची:

कार स्टीरियो एडेप्टर के लिए स्टीयरिंग व्हील कीज़ (कैन बस -> की 1): 6 कदम
कार स्टीरियो एडेप्टर के लिए स्टीयरिंग व्हील कीज़ (कैन बस -> की 1): 6 कदम

वीडियो: कार स्टीरियो एडेप्टर के लिए स्टीयरिंग व्हील कीज़ (कैन बस -> की 1): 6 कदम

वीडियो: कार स्टीरियो एडेप्टर के लिए स्टीयरिंग व्हील कीज़ (कैन बस -> की 1): 6 कदम
वीडियो: Android player Steering Wheel Control learn. Connect Steering Wheel buttons in Android Car stereo. 2024, जुलाई
Anonim
बस सूँघ सकते हैं
बस सूँघ सकते हैं
स्टीरियो को कमांड भेजना
स्टीरियो को कमांड भेजना

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

अपनी पिछली कारों पर स्टीरियो को बदलने के बाद, बिना ज्यादा सोचे या शोध के, मैंने एक प्रसिद्ध "सस्ती" वेबसाइट से 40 डॉलर के प्रतिस्थापन स्टीरियो का आदेश दिया। स्टीरियो एक रिवर्सिंग कैमरा, कार प्ले और अतिरिक्त सुविधाओं के एक समूह के साथ आया था, जो कि अधिक महंगे डोंगल की तुलना में बहुत बेहतर मूल्य लग रहा था जो केवल एक ही काम करता है।

एक नया फेसप्लेट खरीदने और पेंट करने के बाद, 3 डी प्रिंटिंग एक माउंट, और बहुत सारे अतिरिक्त काम (जो अपने आप में एक निर्देश योग्य हो सकता है), मैं एक अप्रिय खोज पर आया। स्टीयरिंग व्हील की कमांड को CAN बस के माध्यम से भेजा गया था, लेकिन स्टीरियो में केवल Key1 इनपुट था। आधे रास्ते को छोड़ने के लिए एक नहीं होने के कारण, मैंने एक 60£ एडॉप्टर का आदेश दिया, जो काम नहीं कर रहा था। इस बिंदु पर मैंने खुद एडॉप्टर बनाने का फैसला किया।

मैं एक इलेक्ट्रिकल इंजीनियर नहीं हूं, मेरे पास केवल प्रारंभिक इलेक्ट्रॉनिक्स ज्ञान है और यह मेरे लिए एक सीखने और अन्वेषण परियोजना थी। मेरी सलाह होगी कि आप पहले अपने वाहन के चश्मे की जांच करें और एक संगत रेडियो ऑर्डर करें, लेकिन यदि आप पहले से ही फंस गए हैं (जैसा कि मैं था) अपने जोखिम पर निर्देश का पालन करें।

आपूर्ति

एडेप्टर (लगभग 15$)

  • Arduino Pro Mini 5V (या एक संगत बोर्ड)
  • MCP2515 CAN बस मॉड्यूल
  • 60x80 मिमी परफ़ॉर्मर
  • X9C104 डिजिटल पोटेंशियोमीटर 100K ओम (आपके स्टीरियो पर निर्भर करता है)
  • DC-DC स्टेप डाउन रेगुलेटर LM2596S 3-40V 3A
  • केबल फ्यूज होल्डर + फ्यूज (100-200 ओम)
  • इसे प्रिंट करने के लिए प्रोजेक्ट बॉक्स या 3D प्रिंटर
  • कार स्टीरियो जैक (पुरुष + महिला)
  • टांका लगाने की आपूर्ति, तार, आदि।

परीक्षण सहायक (सख्ती से आवश्यक नहीं है लेकिन परीक्षण को बहुत आसान बना देगा)

  • Arduino (कोई भी 5V बोर्ड करेगा)
  • MCP2515 CAN बस मॉड्यूल
  • ब्रेडबोर्ड + जंपर्स

चरण 1: बस सूँघ सकते हैं

आपकी कार के अंदर तारों का एक गुच्छा सिस्टम के एक समूह को आपस में जोड़ने के बजाय, कुछ आधुनिक वाहनों में प्रत्येक घटक के लिए तारों के जोड़े होते हैं। इन तारों के माध्यम से सूचना डिजिटल डेटा पैकेट के रूप में भेजी जाती है, और सभी सिस्टम सभी संदेशों को पढ़ सकते हैं। यह कैन बस नेटवर्क है (आपकी कार में कई नेटवर्क हो सकते हैं, इसलिए सभी जानकारी दिखाई नहीं दे सकती है)।

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

यदि आप भाग्यशाली हैं तो आपको अपनी कार के मूल्य कहीं ऑनलाइन मिल सकते हैं, और इस चरण को छोड़ सकते हैं।

यह प्रक्रिया थोड़ी शामिल है और इसे पहले ही अन्य स्थानों पर समझाया जा चुका है, इसलिए मैं इसे संक्षेप में बताऊंगा:

  • अपने वाहन पर CAN बस संचार के लिए सही मान ज्ञात कीजिए। मेरी कार (2009 फिएट आइडिया) के लिए यह 50 केबीपीएस बॉड दर और 8 मेगाहर्ट्ज घड़ी की गति थी।
  • "स्निफ़र" कॉन्फ़िगरेशन में CAN बस मॉड्यूल और एक Arduino का उपयोग करके CAN बस नेटवर्क से कनेक्ट करें।
  • https://github.com/alexandreblin/python-can-monito… जैसे टूल का उपयोग करके अपने लैपटॉप पर CAN बस मान पढ़ें। इसके बिना ऐसा करना बहुत मुश्किल होगा, क्योंकि बहुत सारे संदेश तब भी भेजे जाते हैं जब कार कुछ नहीं कर रही होती है।
  • स्टीयरिंग व्हील बटन दबाएं और मान परिवर्तन नोट करें। यह थोड़ा मुश्किल हो सकता है क्योंकि बहुत सारे संदेश भेजे जाते हैं और यह पता लगाना मुश्किल हो सकता है कि कौन सा संदेश है।

प्रक्रिया को गहराई से समझाते हुए दो महान लेख यहां दिए गए हैं:

  • https://medium.com/@alexandreblin/can-bus-reverse-…
  • https://www.instructables.com/id/CAN-Bus-Sniffing-…

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

आईडी | आईडी हेक्स | बाइट 0 | बाइट 1 | बटन

------------------------------------------- 964 | ३सी४ | 00 | 00 | कोई बटन नहीं 964 | ३सी४ | 04 | 00 | एसआरसी 964 | ३सी४ | 10 | 00 | >> ९६४ | ३सी४ | 08 | 00 | << 964 | ३सी४ | 00 | 80 | फोन 964 | ३सी४ | 00 | 08 | ईएससी 964 | ३सी४ | 80 | 00 | + 964 | ३सी४ | 40 | 00 | - 964 | ३सी४ | 00 | 40 | विन ९६४ | ३सी४ | 00 | 02 | ऊपर ९६४ | ३सी४ | 00 | 01 | डाउन 964 | ३सी४ | 00 | 04 | ठीक है

सबसिस्टम आईडी 3C4 (इस मामले में) है, जो एक हेक्साडेसिमल संख्या है, इसलिए हमें इसे Arduino स्केच में 0x3C4 की तरह लिखना चाहिए। हम बाइट्स 0 और 1 में भी रुचि रखते हैं (आपके मामले में और बाइट्स हो सकते हैं)। ये भी हेक्साडेसिमल मान हैं, इसलिए इन्हें एक अग्रणी 0x के साथ भी लिखा जाना चाहिए।

यदि आप मानों को बाइनरी में परिवर्तित करते हैं, तो आप देखेंगे कि बिट्स ओवरलैप नहीं होते हैं (उदाहरण के लिए + 0b10000000 और - 0b01000000) यह एक ही समय में कई कुंजियों को दबाया जा सकता है।

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

चरण 2: स्टीरियो को कमांड भेजना

स्टीरियो को कमांड भेजना
स्टीरियो को कमांड भेजना

एडेप्टर का निर्माण शुरू करने से पहले, पहले यह जांचना सबसे अच्छा है कि क्या स्टीरियो कमांड प्राप्त कर सकता है।

मेरे पास कार की अतिरिक्त बैटरी थी, इसलिए मैंने स्टीरियो को सीधे इससे जोड़ा। यदि आपके पास 12V बेंच टॉप पावर स्रोत है, तो और भी बेहतर। दुर्भाग्य से मुझे अपनी इकाई पर Key1 इनपुट के बारे में अधिक जानकारी ऑनलाइन नहीं मिली, इसलिए मैंने प्रयोग का सहारा लिया। मैं इस बिंदु पर स्टीरियो को जलाने के बारे में अत्यधिक चिंतित नहीं था, क्योंकि यह अपेक्षाकृत सस्ता है, और यह मेरी कार के साथ काम करने का मेरा आखिरी प्रयास था।

स्टीरियो में एक कमांड लर्निंग स्क्रीन होती है, जहां दो प्रतिरोध मूल्यों (1K और 3.3K) में से एक का चयन करना और "वोल्टेज" मान (0-255) देखना संभव है। "वोल्टेज" उद्धृत किया गया है क्योंकि यह भ्रामक है। मैंने बिना किसी किस्मत के Key1 पर अलग-अलग वोल्टेज लगाने में बहुत समय बिताया। मैंने बिना किसी भाग्य के वोल्टेज को लागू करने के लिए विभिन्न प्रतिरोधों का उपयोग करने का भी प्रयास किया।

सफलता तब मिली जब मैंने Key1 तार को बैटरी ग्राउंड पर छूने की कोशिश की, जिसके परिणामस्वरूप "वोल्टेज" गिरकर 0 हो गया। यह विभिन्न प्रतिरोधों के संयोजन में सीखने की स्क्रीन पर लगातार "वोल्टेज" मान उत्पन्न करेगा।

अब जब मुझे पता था कि स्टीरियो को इनपुट कैसे भेजना है, तो मुझे उन्हें Arduino से भेजने का एक तरीका चाहिए। इस बिंदु पर मैंने मल्टीप्लेक्सर्स के बारे में नहीं सुना है, जो कुछ प्रतिरोधों के साथ, एक तेज़ और अधिक विश्वसनीय समाधान हो सकता है (मुझे अभी भी यकीन नहीं है कि यह संभव है), इसलिए मैंने एक डिजिटल पोटेंशियोमीटर का उपयोग किया। पहले तो मेरे पास काम करने के लिए डिजिटल पॉट प्राप्त करने में समस्याएँ थीं, जब तक कि मुझे यह पता नहीं चला कि मुझे वोल्टेज डिवाइडर के बजाय एक चर अवरोधक के रूप में कार्य करने के लिए इसे रिओस्तात के रूप में तार करने की आवश्यकता है। मूल रूप से मुझे आरएच और आरडब्ल्यू टर्मिनलों को जोड़ना था।

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

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

चरण 3: एडेप्टर का निर्माण

एडेप्टर का निर्माण
एडेप्टर का निर्माण
एडेप्टर का निर्माण
एडेप्टर का निर्माण
एडेप्टर का निर्माण
एडेप्टर का निर्माण

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

ऊपर बाईं ओर स्टेप डाउन रेगुलेटर है, जो कार की बैटरी से 12V को 5V में बदल देता है, जिसे अन्य घटकों द्वारा उपयोग किया जा सकता है।

नीचे बाईं ओर CAN बस मॉड्यूल है, जो कार के CAN बस नेटवर्क से मूल्यों को पढ़ता है और उन्हें Arduino पर अग्रेषित करता है।

ऊपर दाईं ओर डिजिटल पोटेंशियोमीटर (रिओस्टेट के रूप में वायर्ड) है जो जमीन और स्टीरियो के Key1 इनपुट के बीच एक चर अवरोधक के रूप में कार्य करता है।

नीचे दाईं ओर Arduino है, जो एडॉप्टर के दिमाग के रूप में कार्य करता है, CAN बस संदेशों को प्रतिरोधों में बदल देता है जो स्टीरियो द्वारा पढ़े जाते हैं।

12V इनपुट पर एक 150mA फ्यूज है, जो संभवतः सर्किट की रक्षा नहीं करेगा, लेकिन शॉर्ट के मामले में आग को रोकने के लिए है।

चरण 4: सॉफ्टवेयर

सॉफ्टवेयर
सॉफ्टवेयर

डाउनलोड करने के बाद तीनों.ino फाइल को एक ही फोल्डर में डाल दें। इस तरह से सभी एक ही स्केच का हिस्सा होंगे और एक साथ अरुडिनो में तैनात हो जाएंगे।

आपको Arduino IDE में आवश्यक लाइब्रेरी जोड़ने की भी आवश्यकता है। ऐसा करने के लिए, निम्न फ़ाइलें डाउनलोड करें:

github.com/autowp/arduino-mcp2515/archive/…

github.com/philbowles/Arduino-X9C/archive/…

फिर स्केच> लाइब्रेरी शामिल करें> ऐड. Zip लाइब्रेरी में जाकर दोनों को जोड़ें।

CanBusStereoAdapter.ino

इस फाइल में बेसिक सेटअप किया जाता है।

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

सभी कारों में समान स्टीयरिंग व्हील कमांड नहीं होते हैं, इसलिए परिभाषित मूल्यों को हटाने, जोड़ने या संपादित करने के लिए स्वतंत्र महसूस करें।

"STEERING_ID" में अपना सबसिस्टम आईडी बदलना न भूलें।

CanBus.ino

यह फ़ाइल CAN बस श्रोता को सेट करती है, पैकेटों की व्याख्या करती है, और प्रतिरोध मानों को एक गोलाकार बफर में डालती है।

अपनी कार के अनुरूप "सेटअपकैनबस" फ़ंक्शन में CAN बस कॉन्फ़िगरेशन को समायोजित करें।

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

यदि आपने "CanBusStereoAdapter.ino" में किसी भी कमांड परिभाषा को बदल दिया है, तो आपको उन्हें "handleMessageData" फ़ंक्शन में भी अपडेट करना होगा। "हैंडलमैसेजडेटा" जांचता है कि क्या प्रदान किए गए डेटा फ्रेम में बिटवाइज और ऑपरेशन का उपयोग करके कोई भी ज्ञात कमांड हो सकता है।

उदाहरण के लिए, यदि मैंने एक ही समय में >> और + को दबाया है जो हमें 0b10010000 के मान के साथ एक डेटा फ्रेम देगा। >> (मेरी कार के लिए) बाइनरी में 0b00010000 है, और + 0b10000000 है।

--------------- >> -------------- + ------------- << --- -- डेटा0 | 0b10010000 | 0b10010000 | 0b10010000 कमांड | और 0b00010000 | और 0b10000000 | और 0b00001000 परिणाम | = 0b00010000 | = 0b10000000 | = 0b00000000

यहां हम देख सकते हैं कि डेटा फ्रेम में कमांड मौजूद होने पर AND ऑपरेशन का परिणाम 0 से अधिक होगा। तो हमें बस इतना करना है कि हमारे द्वारा परिभाषित प्रत्येक कमांड के लिए {डेटा फ्रेम} और {कमांड वैल्यू}> 0 की जांच करें।

ध्यान रखें कि प्रत्येक डेटा फ़्रेम में अलग-अलग कमांड होते हैं, इसलिए यह ठीक है यदि कमांड मान समान हैं, क्योंकि हम उन्हें अपने स्वयं के फ़्रेम के विरुद्ध जाँच रहे हैं। मेरे उदाहरण में << और ESC दोनों का मान 0b00001000 (0x08) समान है, लेकिन << डेटा 0 में है और ESC डेटा 1 में है।

यह निर्धारित करने के बाद कि एक फ्रेम में एक कमांड मौजूद है, हम सर्कुलर बफर में एक डिजिटल पॉट वैल्यू जोड़ते हैं। मान 0 से 99 तक होते हैं, लेकिन मैंने देखा है कि स्टीरियो द्वारा पढ़ा गया "वोल्टेज" रैखिक नहीं है, इसलिए अपने लिए मूल्यों का परीक्षण करें।

DigitalPot.ino

यह फ़ाइल सर्कुलर बफर से मूल्यों को पॉप करती है और उन्हें निष्पादित करने के लिए डिजिटल पॉट में भेजती है। मेरे मामले में "pot.setPotMin(false);" प्रतिरोध को अधिकतम तक बढ़ा देगा, जिसे स्टीरियो अधिकतम "वोल्टेज" के रूप में पढ़ेगा। आपके स्टीरियो के लिए आपको डिजिटल पॉट को न्यूनतम पर सेट करने की आवश्यकता हो सकती है, इसलिए इसका परीक्षण करें।

चरण 5: परियोजना संलग्नक

परियोजना संलग्नक
परियोजना संलग्नक

मेरे पास एक 3D प्रिंटर है इसलिए मैंने अपने एडॉप्टर के लिए दो भाग के बाड़े को प्रिंट करने का निर्णय लिया। मैंने एक फ़्यूज़न 360 फ़ाइल शामिल की है जिसे आप संपादित कर सकते हैं, और gcode फ़ाइलें जो एक 60x80mm परफ़बोर्ड में फिट होंगी।

यदि आपके पास 3D प्रिंटर तक पहुंच नहीं है, तो आप एक तैयार प्रोजेक्ट एनक्लोजर या एक मजबूत कंटेनर का उपयोग कर सकते हैं।

चरण 6: अंतिम विचार

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

मेरे परीक्षणों से बिजली की खपत 20-30 एमए है। मैंने स्लीप मोड में इसे 10 mA तक कम कर दिया, और घटकों से एलईडी को हटाकर और भी कम जा सकता था, लेकिन मैंने इससे परेशान न होने का फैसला किया क्योंकि यह केवल कार के चलने के दौरान ही चलेगा।

मैं अंतिम परिणाम से काफी खुश हूं। प्रतिक्रिया समय उचित है, और यह शायद ही कभी आदेशों को याद करता है।

भले ही मेरा समय निवेश व्यावसायिक रूप से उपलब्ध एडेप्टर (जो काम नहीं करता) की लागत से कहीं अधिक था, मैंने जो ज्ञान प्राप्त किया वह अमूल्य है।

सिफारिश की: