در این پروژه، میخواهیم با ماژول MCP2515 که یک CAN controller است آشنا شویم و یاد بگیریم که چگونه این ماژول را به بورد آردوینو متصل کنیم. همچنین اینکه چگونه با استفاده از این ماژول و پروتکل CAN، بین دو بورد آردوینو ارتباط برقرار کنیم.
فهرست مطالبی که در این جلسه بررسی خواهیم کرد به شرح زیر میباشد.
- مقدمه
- توضیحات مختصری درمورد ماژول MCP2515
- شماتیک ماژول MCP2515
- چگونگی اتصال ماژول MCP2515 به بورد آردوینو
مقدمه
CAN خلاصهشدهی عبارت Controlled Area Network است و CAN Bus به پروتکل ارتباطی گفته میشود که در آن یک باس استاندارد، به یک میکروکنترلر و سایر تجهیزات متصل به آن، اجازه میدهد بدون نیاز به دخالت یا حضور یک دستگاه میزبان مانند یک کامپیوتر یا مرکز کنترل، خود به تبادل داده بپردازند. این پروتکل توسط فردی به نام Robert Bosch GmbH معرفی شد و توسعه پیدا کرد و یکی از کاربردهای مهم آن در سیستم خودروهاست که در آنها یک واحد کنترلر مرکزی باید با بخشهای مختلفی در ارتباط باشد. به عنوان مثال بخش کنترل موتور یکی از بخشهای مهم در یک خودرو محسوب میشود و باید به سنسورها و اکچواتورهای مختلفی مانند جریان هوا، واحد کنترل فشار، واحد کنترل دما، کنترل سوپاپها و … در ارتباط باشد. این ارتباط از طریق پروتکل CAN Bus تامین میشود.
برای اینکه بیشتر با طرز کار این پروتکل و کنترلرهایی که از آن استفاده میکنند آشنا شویم، نگاهی به ماژولهایی مانند MCP2515 میتواند بسیار راهگشا باشد.
توضیحات مختصری درباره ماژول MCP2515
این کنترلر یک ماژول ساده است که از نسخهی 2.0B پروتکل CAN پشتیبانی میکند و میتواند اطلاعات را تا نرخ تبادل 1Mbps مبادله کند.
برای اینکه بتوانیم به کمک این ماژول یک ارتباط CAN Bus برقرار کنیم، به دو عدد از آن، یکی در سمت فرستنده و دیگری در سمت گیرنده نیاز داریم.
ماژول مورد استفادهی ما در این پروژه در تصویر زیر نشان داده شده است.
این ماژول از یک آیسی MCP2515 CAN Controller و یک آیسی TJA1050 CAN Transceiver تشکیل شده است. MCP2515 خود یک CAN controller مجزاست و دارای درگاهی برای ارتباط SPI است که از طریق آن میتواند با میکروکنترلرها ارتباط برقرار کند. TJA1050 نیز به عنوان یک واسط بین MCP2515 و CAN Bus فیزیکال موجود عمل میکند.
در تصویر بعدی، اجزا تشکیل دهنده و پایههای ماژول MCP2515 را میبینیم.
شماتیک ماژول MCP2515
قبل از اینکه به سراغ شماتیک برویم، ابتدا باید چند نکته را در مورد هر دو ماژول MCP2515 و TJA1050 بیاموزیم. MCP2515 کنترلر اصلی است و از سه زیرماژول شامل بلوک SPI ،CAN ماژول و بخش Control Logic تشکیل شده است.
CAN ماژول مسئول ارسال و دریافت پیامها بر روی CAN Bus است. Control Logic مسئول راهاندازی ماژول و برقراری ارتباط میان بخشهای مختلف آن است و بلوک SPI نیز همانطور که از نام آن برمیآید، مسئولیت برقراری ارتباط SPI با این ماژول را بر عهده دارد.
- مقاله مرتبط مفید:پروتکل رابطه وسایل جانبی در آردوینو (SPI)
ماژول TJA1050 از آنجا که ماهیت واسطهای بین ماژول MCP2515 و CAN Bus را دارد؛ مسئولیت آن دریافت دادهها از Bus و تحویل آنها به ماژولMCP2515 است.
شکل زیر ماژول کلی را نشان میدهد که در آن MCP2515 و TJA1050 به هم متصل شدهاند.
چگونگی اتصال ماژول MCP2515 به بورد آردوینو
در تصویر زیر، چگونگی اتصال ماژول MCP2515 به بورد آردوینو و احیانا ارتباط CAN Bus دو بورد آردوینوی مختلف به واسطهی این ماژول را میبینیم.
در تصویر بعدی، پایههای ماژول با وضوح بیشتری قابل تشخیص هستند.
تجهیزات مورد نیاز
- دو عدد بورد Arduino UNO
- دو عدد ماژول MCP2515
- دو عدد کابل USB
- سیم رابط
مدار اتصال
همانطور که پیشتر هم اشاره کردیم، آیسی CAN کنترلر ارتباط SPI را برای میکروکنترلرها ساده میکند. بنابراین پینهای SPI این ماژول را شامل (SCK ،MOSI(SI) ،MISO(SO و CS این ماژول را متناظرا به پینهای SPI میکروکنترلر (بورد آردوینو) وصل میکنیم. درست مانند تصویر زیر.
دو مدار را در قسمت فرستنده و گیرنده به همین شکل به ماژول MCP2515 متصل میکنیم و برای برقراری ارتباط بین آنها، دو پین CANH و CANL را در هر دو ماژول متصل میکنیم.
کد پروژه
قبل از اینکه وارد بخش کدزنی بشویم، ابتدا باید کتابخانهی مربوط به ماژول MCP2515 را برای بورد آردوینو دانلود کنید. کتابخانههای مختلفی به این منظور طراحی شده و موجود هستند، اما ما در اینجا استفاده از این کتابخانه را توصیه میکنیم. آن را از مخزن گیتهاب اش دانلود کنید.
مقاله مرتبط مفید: آموزش کار با گیت هاب GitHub
آن را دانلود کنید و در فولدر کتابخانههای Arduino قرار دهید.
از آنجایی که ارتباط بین دو بورد یک ارتباط دوطرفه است و دارای دو بخش فرستنده و گیرنده، بنابراین کد نیز به دو بخش فرستنده و گیرنده تقسیم میشود.
کد بخش فرستنده
#include <SPI.h> #include <mcp_can.h> const int spiCSPin = 10; int ledHIGH = 1; int ledLOW = 0; MCP_CAN CAN(spiCSPin); void setup() { Serial.begin(115200); while (CAN_OK != CAN.begin(CAN_500KBPS)) { Serial.println("CAN BUS init Failed"); delay(100); } Serial.println("CAN BUS Shield Init OK!"); } unsigned char stmp[8] = {ledHIGH, 1, 2, 3, ledLOW, 5, 6, 7}; void loop() { Serial.println("In loop"); CAN.sendMsgBuf(0x43, 0, 8, stmp); delay(1000); }
کد بخش گیرنده
#include <SPI.h> #include "mcp_can.h" const int spiCSPin = 10; const int ledPin = 2; boolean ledON = 1; MCP_CAN CAN(spiCSPin); void setup() { Serial.begin(115200); pinMode(ledPin,OUTPUT); while (CAN_OK != CAN.begin(CAN_500KBPS)) { Serial.println("CAN BUS Init Failed"); delay(100); } Serial.println("CAN BUS Init OK!"); } void loop() { unsigned char len = 0; unsigned char buf[8]; if(CAN_MSGAVAIL == CAN.checkReceive()) { CAN.readMsgBuf(&len, buf); unsigned long canId = CAN.getCanId(); Serial.println("-----------------------------"); Serial.print("Data from ID: 0x"); Serial.println(canId, HEX); for(int i = 0; i<len; i++) { Serial.print(buf[i]); Serial.print("\t"); if(ledON && i==0) { digitalWrite(ledPin, buf[i]); ledON = 0; delay(500); } else if((!(ledON)) && i==4) { digitalWrite(ledPin, buf[i]); ledON = 1; } } Serial.println(); } }
عملکرد پروژه
راهاندازی و کار کردن این سیستم بسیار ساده است و نیاز نیست که ما کار چندان پیچیدهای انجام دهیم. چرا که عمدهی کار را کتابخانههای CAN و SPI انجام میدهند.
CAN یک پروتکل مبتنی بر پیام است و به منظور راهاندازی و استفاده از آن، باید پیامهایی بین صفر تا ۸ بایت ارسال کنیم. در اینجا ما این پیغام را توسط فرستنده بر روی CAN Bus ارسال میکنیم، 7 6 5 0 3 2 1 1. در سمت دیگر گیرنده آن را از روی CAN Bus برداشته و روی مانیتور سریال خود نمایش میدهد.
همچنین گیرنده، بیتهای صفرم و چهارم از پیغام بالا را به عنوان دستوری برای خاموش و روشن کردن LED متصل به پین شمارهی ۲ خود استفاده میکند. این بیتها به ترتیب ۱ و ۰ هستند پس LED ابتدا روشن و سپس خاموش میشود.
کاربردها
همانطور که در خلال توضیحات این جلسه اشاره کردیم، CAN یکی از پروتکلهای پرکاربرد در صنعت خودروها محسوب میشود. برخی از این کاربردها شامل این موارد هستند.
- سیستم تعویض دندهی الکترونیکی
- ارتباط بین بخشهای مختلف یک سیستم اتوماسیون صنعتی
- در تجهیزات پزشکی
- در رباتیک
- راهاندازی و متوقفسازی خودکار موتور ماشینها
منبع: ترجمه از سایت electronicshub.org
اگر آموزش «پروتکل CAN Bus در آردوینو با آیسی MCP2515» براتون مفید واقع شده ما را نیز دعا کنید و اگر خواستین میتوانید از محتوای رایگان آموزشی حمایت مالی کنید. همچنین لطفا نظرات، پیشنهادات و درخواستهای خود را در کامنتها ⇓ بنویسید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
عالی بود
بسیار سپاسگزارم. مفید بوود.
چطور میتوان فقط یک برد آردوینو را با ماژول MCP2515 به سیستمی که خود دارای ارتباطات کن باس هست متصل کرد؟
آیا هر ماژول فقط میتواند یک نقش فقط فرستنده یا فقط گیرنده داشته باشد یا آردوینو به همراه ماژول MCP2515 میتوانند همزمان گیرنده و فرستنده داده از طریق کن باس باشند؟
مثلا بعد از دریافت یک داده از کن باس آن را پردازش کنند و دوباره برای عملکرد مورد نظر به همان باس تحویل دهند.
سلام وقتتون بخیر
ممنون از مطلب خوبی که منتشر کردید من دانشجویی الکترونیک نیستم و در الکترونیک هم سر رشته ای ندارم اما نیاز دارم که در مورد پروتکل can bus اطلاعات کاملی بدست بیارم برای این مورد ایا اموزشی هست و یا منبع خاصی هست که کمکم کنه
ممنون میشم جواب بدبد
سلام و عرض ادب
بنده میخام دو بورد stm32f103c8 رو از طریق کن توی محیط آردوینو به هم وصل کنم ، ماژول tja1050 رو در هر بورد نصب کردم و آماده برنامه نویسیه ، مشکلم اینجاست که هرچی کد وجود داره در مورد MCP2515 هست و من تنها میخام توسط tja1050 ارتباط رو برقرار کنم ، چون خود stm32 کنترولر کن رو داره و تنها به انتقال دهنده نیاز داره ، ممنون میشم راهنمایی بفرمایید