दो Arduino बोर्डों को एक साथ जोड़ने और एक दूसरे को डेटा भेजने के लिए इस मजबूत धारावाहिक संचार प्रोटोकॉल का उपयोग करें।

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

हम आपको Arduino और ब्रेडबोर्ड का उपयोग करके MCP2515 CAN मॉड्यूल के साथ CAN बस बनाने का तरीका बताएंगे। हम Arduino CAN लाइब्रेरी पर भी जाएँगे और CAN बस पर डेटा भेजने और प्राप्त करने का तरीका प्रदर्शित करेंगे।

कैन बस क्या है?

कैन बस एक सीरियल कम्युनिकेशन प्रोटोकॉल है जिसे बॉश ने 1980 के दशक में विकसित किया था। इसकी उच्च विश्वसनीयता और मजबूती के कारण इसका व्यापक रूप से विभिन्न अनुप्रयोगों में उपयोग किया जाता है। यह केवल दो लाइनों पर न्यूनतम विलंबता के साथ उच्च गति पर उपकरणों के बीच डेटा के संचरण की अनुमति देता है: CAN High और CAN Low।

1994 में, CAN बस एक अंतरराष्ट्रीय मानक (ISO 11898) बन गया जिसे विशेष रूप से ऑटोमोटिव अनुप्रयोगों में इलेक्ट्रॉनिक नियंत्रकों के बीच तेजी से सीरियल डेटा विनिमय के लिए डिज़ाइन किया गया था। पर हमारी विस्तृत मार्गदर्शिका देखें CAN बस क्या है और यह ऑटोमोटिव सिस्टम में क्या भूमिका निभाती है अधिक विवरण के लिए।

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

MCP2515 CAN मॉड्यूल को जानना

MCP2515 CAN बस कंट्रोलर मॉड्यूल एक ऐसा उपकरण है जो व्यापक रूप से उपयोग किए जाने वाले CAN प्रोटोकॉल संस्करण 2.0B के लिए असाधारण समर्थन प्रदान करता है। यह मॉड्यूल 1 एमबीपीएस तक की उच्च डेटा दरों पर संचार के लिए आदर्श है।

MCP2515 IC एक SPI इंटरफ़ेस वाला एक स्वतंत्र CAN नियंत्रक है जो माइक्रोकंट्रोलर्स की एक विस्तृत श्रृंखला के साथ संचार को सक्षम बनाता है। दूसरी ओर, TJA1050 IC, MCP2515 CAN नियंत्रक IC और भौतिक CAN बस के बीच एक इंटरफ़ेस के रूप में कार्य करता है।

अतिरिक्त सुविधा के लिए, एक जम्पर है जो आपको 120 ओम टर्मिनेशन संलग्न करने में सक्षम बनाता है, जिससे आपके तारों को कनेक्ट करना और भी आसान हो जाता है CAN_H & क्या मैं यह कर सकता हूं अन्य कैन मॉड्यूल के साथ संचार के लिए पेंच।

विशेषता

विनिर्देश

ट्रांसीवर

टीजेए1050

माइक्रोकंट्रोलर इंटरफ़ेस

एसपीआई (मल्टी कैन बस एकीकरण के लिए अनुमति देता है)

क्रिस्टल ऑसिलेटर

8 मेगाहर्ट्ज

समापन

120Ω

रफ़्तार

1 एमबीपीएस

बिजली की खपत

कम-वर्तमान स्टैंडबाय ऑपरेशन

आयाम

40 x 28 मिमी

नोड क्षमता

112 नोड्स तक का समर्थन करता है

आप से अतिरिक्त जानकारी प्राप्त कर सकते हैं MCP2515 डेटाशीट यदि आपको अधिक उन्नत परियोजना के लिए इस मॉड्यूल की आवश्यकता है।

संदेश संरचना कर सकते हैं

CAN संदेश संरचना में कई खंड होते हैं, लेकिन इस परियोजना के लिए सबसे महत्वपूर्ण खंड पहचानकर्ता और डेटा हैं। पहचानकर्ता, जिसे CAN ID या पैरामीटर ग्रुप नंबर (PGN) के रूप में भी जाना जाता है, CAN पर उपकरणों की पहचान करता है नेटवर्क, और पहचानकर्ता की लंबाई कैन प्रोटोकॉल के प्रकार के आधार पर 11 या 29 बिट्स हो सकती है इस्तेमाल किया गया।

इस बीच, डेटा प्रेषित होने वाले वास्तविक सेंसर/नियंत्रण डेटा का प्रतिनिधित्व करता है। डेटा कहीं भी 0 से 8 बाइट लंबा हो सकता है, और डेटा लंबाई कोड (डीएलसी) मौजूद डेटा बाइट्स की संख्या को इंगित करता है।

Arduino MCP2515 CAN बस लाइब्रेरी

यह पुस्तकालय लागू करता है CAN V2.0B प्रोटोकॉल, जो 1Mbps तक की गति से काम कर सकता है। यह एक SPI इंटरफ़ेस प्रदान करता है जो मानक (11-बिट) और विस्तारित (29-बिट) डेटा दोनों का समर्थन करते हुए 10MHz तक की गति पर काम कर सकता है। क्या अधिक है, यह दो प्राप्त बफ़र्स के साथ आता है, जो प्राथमिकता वाले संदेश भंडारण की अनुमति देता है।

CAN बस को इनिशियलाइज़ करना

यहां वह सेटअप कोड दिया गया है जिसकी आपको CAN बस को इनिशियलाइज़ करने के लिए आवश्यकता होगी:

#शामिल करना
#शामिल करना

एमसीपी2515 mcp2515(10); // सीएस पिन सेट करें

खालीपनस्थापित करना(){
जबकि (!धारावाहिक);
धारावाहिक.शुरू(9600);
एसपीआई.शुरू(); // एसपीआई संचार शुरू करता है

mcp2515.रीसेट ();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

यह MCP2515 को 500Kbps की CAN बिट दर और 8MHz की ऑसिलेटर फ्रीक्वेंसी के साथ इनिशियलाइज़ करता है।

MCP2515 ऑपरेशनल मोड्स कर सकता है

MCP2515 CAN बस नियंत्रक के साथ उपयोग किए जाने वाले तीन परिचालन मोड हैं:

  • सेटनॉर्मलमोड (): संदेश भेजने और प्राप्त करने के लिए नियंत्रक सेट करता है।
  • सेट लूपबैक मोड (): नियंत्रक को संदेश भेजने और प्राप्त करने के लिए सेट करता है, लेकिन इसके द्वारा भेजे गए संदेश भी स्वयं प्राप्त होंगे।
  • सेट लिस्टेनऑनलीमोड (): नियंत्रक को केवल संदेश प्राप्त करने के लिए सेट करता है।

ये फ़ंक्शन कॉल हैं जिनका उपयोग MCP2515 CAN बस नियंत्रक के परिचालन मोड को सेट करने के लिए किया जाता है।

mcp2515.setNormalMode();

mcp2515.setLoopbackMode ();

mcp2515.setListenOnlyMode();

कैन बस पर डेटा भेजना

CAN बस पर संदेश भेजने के लिए, उपयोग करें संदेश भेजें () तरीका:

अहस्ताक्षरितचार डेटा [] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, आंकड़े);

यह आईडी के साथ एक संदेश भेजता है 0x01 और का डेटा पेलोड {0x01, 0x02, 0x03, 0x04}. पहला पैरामीटर कैन आईडी है, दूसरा संदेश प्राथमिकता है, तीसरा डेटा पेलोड की लंबाई है, और चौथा डेटा पेलोड ही है।

संदेश भेजें () विधि एक मान लौटाती है जो इंगित करती है कि संदेश सफलतापूर्वक भेजा गया था या नहीं। आप इस मान को कॉल करके देख सकते हैं जांच त्रुटि () तरीका:

अगर (CAN.checkError ()) {
धारावाहिक.println("संदेश भेजने में त्रुटि।");
}

यह जाँचता है कि क्या संदेश के प्रसारण के दौरान कोई त्रुटि हुई है और यदि आवश्यक हो तो एक त्रुटि संदेश प्रिंट करता है।

कैन बस से डेटा प्राप्त करना

कैन बस पर एक संदेश प्राप्त करने के लिए, आप इसका उपयोग कर सकते हैं readMsgBuf() तरीका:

अहस्ताक्षरितचार लेन = 0;
अहस्ताक्षरितचार बफ [8];
अहस्ताक्षरितचार कैनिड = 0;

अगर (CAN.checkReceive ()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId ();
}

यह जाँचता है कि CAN बस में कोई संदेश उपलब्ध है या नहीं और फिर संदेश को इसमें पढ़ता है buf सरणी। संदेश की लंबाई में संग्रहीत है लेन चर, और संदेश की आईडी में संग्रहीत है canID चर।

एक बार आपको एक संदेश प्राप्त हो जाने के बाद, आप आवश्यकतानुसार डेटा पेलोड को प्रोसेस कर सकते हैं। उदाहरण के लिए, आप डेटा पेलोड को सीरियल मॉनिटर पर प्रिंट कर सकते हैं:

धारावाहिक.छपाई("आईडी के साथ संदेश प्राप्त हुआ");
धारावाहिक.छपाई(कैनिड, हेक्स);
धारावाहिक.छपाई("और डेटा:");

के लिए (int यहाँ मैं = 0; मैं धारावाहिक.छपाई(बफ [i], हेक्स);
धारावाहिक.छपाई(" ");
}

धारावाहिक.println();

यह प्राप्त संदेश की आईडी और डेटा पेलोड को सीरियल मॉनिटर पर प्रिंट करता है।

कैन बस ट्रांसीवर को ब्रेडबोर्ड से कैसे कनेक्ट करें

इस उदाहरण परियोजना में दो उपकरणों को जोड़ने के लिए CAN बस बनाने के लिए, आपको इसकी आवश्यकता होगी:

  • दो माइक्रोकंट्रोलर (इस उदाहरण के लिए दो Arduino नैनो बोर्ड)
  • दो MCP2515 कैन मॉड्यूल
  • एक ब्रेडबोर्ड
  • जम्पर तार
  • एक I2C 16x2 एलसीडी स्क्रीन मॉड्यूल
  • HC-SR04 अल्ट्रासोनिक सेंसर

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

अंत में, वहाँ है एमसीपी2515 पुस्तकालय MCP2515 चिप के साथ इंटरफेस करने के लिए, हमें CAN बस नेटवर्क पर आसानी से डेटा संचारित करने की अनुमति देता है।

हार्डवेयर सेटअप (HC-SR04 उदाहरण)

इस परियोजना में एक HC-SR04 सेंसर और LCD का उपयोग करते हुए, एक Arduino नैनो बोर्ड एक रिसीवर के रूप में कार्य करेगा, जबकि अन्य Arduino एक प्रेषक के रूप में कार्य करेगा। नीचे दिए गए वायरिंग आरेख के अनुसार अपने प्रेषक घटकों को कनेक्ट करें:

यहाँ रिसीवर सर्किट के लिए आरेख है:

अंत में, दो नोड्स का उपयोग करके एक साथ कनेक्ट करें CAN_H और क्या मैं यह कर सकता हूं रेखाएँ जैसा दिखाया गया है:

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

MCP2515 CAN बस मॉड्यूल की प्रोग्रामिंग

ध्यान दें कि MCP2515 मॉड्यूल की प्रोग्रामिंग करते समय, नेटवर्क पर अन्य CAN उपकरणों के साथ सफल संचार सुनिश्चित करने के लिए सही बिट दर का उपयोग करना महत्वपूर्ण है।

प्रेषक कोड:

#शामिल करना
#शामिल करना
#शामिल करना

एमसीपी2515 mcp2515(10);
कॉन्स्टबाइट ट्रिगपिन = 3;
कॉन्स्टबाइट इकोपिन = 4;
न्यूपिंग सोनार(ट्रिगपिन, इकोपिन, 200);

structcan_framecanMsg;

खालीपनस्थापित करना(){
धारावाहिक.शुरू(9600);
mcp2515.रीसेट ();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

खालीपनकुंडली(){
अहस्ताक्षरितint यहाँ दूरी = सोनार.पिंग_सेमी ();
canMsg.can_id = 0x036; // 0x036 के रूप में आईडी कर सकते हैं
canMsg.can_dlc = 8; // CAN डेटा की लंबाई 8 हो सकती है
canMsg.डेटा [0] = दूरी; // [0] में आर्द्रता मान अपडेट करें
canMsg.डेटा [1] = 0x00; // बाकी सब 0 के साथ
canMsg.डेटा [2] = 0x00;
canMsg.डेटा [3] = 0x00;
canMsg.डेटा [4] = 0x00;
canMsg.डेटा [5] = 0x00;
canMsg.डेटा [6] = 0x00;
canMsg.डेटा [7] = 0x00;

mcp2515.sendMessage(&canMsg);// CAN संदेश भेजता है
देरी(100);
}

रिसीवर कोड:

#शामिल करना
#शामिल करना
#शामिल करना

एमसीपी2515 mcp2515(10);
लिक्विड क्रिस्टल_I2C एलसीडी(0x27,16,2);
structcan_framecanMsg;

खालीपनस्थापित करना(){
धारावाहिक.शुरू(9600);

mcp2515.रीसेट ();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
एलसीडी.इनिट ();
एलसीडी पीछे की लाइट();
एलसीडी।सेट कर्सर(0, 0);
एलसीडी।छपाई("म्यूओ कैन ट्यूटोरियल");
देरी(3000);
एलसीडी।साफ़();
}

खालीपनकुंडली(){
अगर (एमसीपी2515.संदेश पढ़ना(&canMsg) == MCP2515:: ERROR_OK) // डेटा प्राप्त करने के लिए
{
int यहाँ दूरी = canMsg.data [0];
एलसीडी।सेट कर्सर(0,0);
एलसीडी।छपाई("दूरी: ");
एलसीडी।छपाई(दूरी);
एलसीडी।छपाई("सेमी ");
}
}

अपने Arduino प्रोजेक्ट्स को अगले स्तर पर ले जाएं

CAN बस और Arduino का संयोजन विभिन्न अनुप्रयोगों में उपयोग किए जाने वाले परिष्कृत संचार नेटवर्क के निर्माण या सीखने के लिए एक शक्तिशाली मंच प्रदान करता है। हालांकि यह एक कठिन सीखने की अवस्था प्रतीत हो सकती है, ब्रेडबोर्ड पर अपना स्वयं का सेटअप जटिल DIY परियोजनाओं में CAN बस नेटवर्क का उपयोग करने की रस्सियों को सीखने का एक बहुत आसान तरीका है।