از این پروتکل ارتباطی سریال قوی برای اتصال دو برد آردوینو به یکدیگر و ارسال داده ها به یکدیگر استفاده کنید.
گذرگاه شبکه کنترل کننده (CAN) یک پروتکل ارتباطی قوی و قابل اعتماد است که به طور گسترده در کاربردهای مختلف صنعتی، خودرویی و هوافضا استفاده می شود. این برای انتقال داده ها بین میکروکنترلرها و دستگاه ها از طریق یک شبکه CAN باس طراحی شده است. ممکن است هنوز این را ندانید، اما این چیزی است که در پس آن مدهای دیوانه داشبورد ماشین در رسانه های اجتماعی مشاهده می کنید.
ما شما را با نحوه ساخت گذرگاه CAN با ماژول CAN MCP2515 با استفاده از آردوینو و برد برد آشنا خواهیم کرد. همچنین کتابخانه CAN Arduino را بررسی خواهیم کرد و نحوه ارسال و دریافت داده ها را از طریق گذرگاه CAN نشان خواهیم داد.
اتوبوس CAN چیست؟
گذرگاه CAN یک پروتکل ارتباطی سریال است که توسط بوش در دهه 1980 توسعه یافت. این به دلیل قابلیت اطمینان و استحکام بالا به طور گسترده در کاربردهای مختلف استفاده می شود. این اجازه می دهد تا داده ها را بین دستگاه ها با سرعت بالا با حداقل تأخیر تنها در دو خط انتقال دهید: CAN High و CAN Low.
در سال 1994، اتوبوس CAN به یک استاندارد بین المللی (ISO 11898) تبدیل شد که به طور خاص برای تبادل سریع داده های سریال بین کنترل کننده های الکترونیکی در کاربردهای خودرو طراحی شده بود. برای جزئیات بیشتر، راهنمای جامع ما را در مورد اینکه اتوبوس CAN چیست و چه نقشی در سیستمهای خودرو دارد، بررسی کنید.
یکی از دلایل محبوبیت گذرگاه CAN به دلیل ویژگی های تشخیص خطا و تصحیح آن است. این پروتکل می تواند خطاهای انتقال داده را شناسایی و تصحیح کند. این آن را برای برنامههایی ایدهآل میکند که یکپارچگی دادهها در آنها حیاتی است، مانند اتوماسیون صنعتی.
آشنایی با ماژول CAN MCP2515
ماژول MCP2515 CAN Bus Controller دستگاهی است که پشتیبانی استثنایی از پروتکل CAN نسخه 2.0B که به طور گسترده مورد استفاده قرار می گیرد، ارائه می دهد. این ماژول برای برقراری ارتباط با سرعت داده بالا تا 1Mbps ایده آل است.
آی سی MCP2515 یک کنترلر CAN مستقل با رابط SPI است که ارتباط با طیف وسیعی از میکروکنترلرها را امکان پذیر می کند. از طرف دیگر آی سی TJA1050 به عنوان رابط بین آی سی کنترلر MCP2515 CAN و گذرگاه فیزیکی CAN عمل می کند.
برای راحتی بیشتر، یک جامپر وجود دارد که به شما امکان می دهد پایانه های 120 اهم را وصل کنید و اتصال سیم های خود را به پیچ های CAN_H و CAN_L برای ارتباط با سایر ماژول های CAN آسان تر می کند.
ویژگی
مشخصات
فرستنده گیرنده
TJA1050
رابط میکروکنترلر
SPI (امکان ادغام Multi CAN bus)
نوسان ساز کریستالی
8 مگاهرتز
خاتمه دادن
120Ω
سرعت
1 مگابیت بر ثانیه
مصرف برق
عملیات آماده به کار با جریان کم
بعد، ابعاد، اندازه
40 × 28 میلی متر
ظرفیت گره
تا 112 گره را پشتیبانی می کند
در صورت نیاز به این ماژول برای پروژه های پیشرفته تر، می توانید اطلاعات بیشتری را از دیتاشیت MCP2515 دریافت کنید.
ساختار پیام CAN
ساختار پیام CAN از چندین بخش تشکیل شده است، اما مهمترین بخش برای این پروژه، شناسه و داده است. شناسه که با نام CAN ID یا شماره گروه پارامتر (PGN) نیز شناخته می شود، دستگاه های موجود در شبکه CAN را شناسایی می کند و طول شناسه بسته به نوع پروتکل CAN مورد استفاده می تواند 11 یا 29 بیت باشد.
در همین حال، داده ها نشان دهنده داده های واقعی حسگر/کنترل در حال انتقال است. داده ها می توانند از 0 تا 8 بایت باشند و کد طول داده (DLC) تعداد بایت های داده موجود را نشان می دهد.
کتابخانه CAN Bus Arduino MCP2515
این کتابخانه پروتکل CAN V2.0B را پیاده سازی می کند که می تواند تا سرعت 1Mbps کار کند. این یک رابط SPI را ارائه می دهد که می تواند با سرعت حداکثر 10 مگاهرتز کار کند در حالی که از داده های استاندارد (11 بیتی) و توسعه یافته (29 بیتی) پشتیبانی می کند. علاوه بر این، دارای دو بافر دریافت است که امکان ذخیره سازی پیام های اولویت بندی شده را فراهم می کند.
راه اندازی گذرگاه CAN
در اینجا کد راه اندازی است که برای مقداردهی اولیه گذرگاه CAN به آن نیاز دارید:
#include <SPI.h>
#include <mcp2515.h>
MCP2515 mcp2515(10); // Set CS pin
void setup() {
while (!Serial);
Serial.begin(9600);
SPI.begin(); //Begins SPI communication
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}
این MCP2515 را با نرخ بیت CAN 500 کیلوبیت بر ثانیه و فرکانس نوسانگر 8 مگاهرتز مقداردهی اولیه می کند.
حالت های عملیاتی MCP2515 CAN
سه حالت عملیاتی با کنترلر باس MCP2515 CAN استفاده می شود:
- setNormalMode(): کنترل کننده را برای ارسال و دریافت پیام تنظیم می کند.
- setLoopbackMode(): کنترل کننده را برای ارسال و دریافت پیام تنظیم می کند، اما پیام هایی که ارسال می کند نیز به خودی خود دریافت می شوند.
- setListenOnlyMode(): کنترل کننده را طوری تنظیم می کند که فقط پیام ها را دریافت کند.
اینها فراخوانی های تابعی هستند که برای تنظیم حالت عملیاتی کنترلر باس MCP2515 CAN استفاده می شوند.
mcp2515.setNormalMode();
mcp2515.setNormalMode();
mcp2515.setLoopbackMode();
mcp2515.setListenOnlyMode();
ارسال داده از طریق گذرگاه CAN
برای ارسال پیام از طریق گذرگاه CAN، از متد sendMsgBuf() استفاده کنید:
unsigned char data[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, data);
این پیامی با شناسه 0x01 و حجم داده {0x01، 0x02، 0x03، 0x04} ارسال میکند. پارامتر اول CAN ID، دوم اولویت پیام، سوم طول بار داده و چهارم خود payload داده است.
متد sendMsgBuf() مقداری را برمی گرداند که نشان می دهد پیام با موفقیت ارسال شده است یا خیر. می توانید این مقدار را با فراخوانی متد ()checkError بررسی کنید:
if (CAN.checkError()) {
Serial.println("Error sending message.");
}
این کار بررسی می کند که آیا خطایی در حین ارسال پیام رخ داده است یا خیر و در صورت لزوم پیام خطا را چاپ می کند.
دریافت داده از گذرگاه CAN
برای دریافت پیام از طریق گذرگاه CAN، می توانید از متد ()readMsgBuf استفاده کنید:
unsigned char len = 0;
unsigned char buf[8];
unsigned char canID = 0;
if (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}
این کار بررسی می کند که آیا پیامی در گذرگاه CAN موجود است یا خیر و سپس پیام را در آرایه buf می خواند. طول پیام در متغیر len و شناسه پیام در متغیر canID ذخیره می شود.
پس از دریافت پیام، می توانید محموله داده را در صورت نیاز پردازش کنید. به عنوان مثال، می توانید محموله داده را در مانیتور سریال چاپ کنید:
Serial.print("Received message with ID ");
Serial.print(canID, HEX);
Serial.print(" and data: ");
for (int i = 0; i < len; i++) {
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println();
این شناسه پیام دریافتی و محموله داده را روی نمایشگر سریال چاپ می کند.
چگونه یک فرستنده و گیرنده باس CAN را به برد برد متصل کنیم
برای ساخت یک گذرگاه CAN برای اتصال دو دستگاه در این پروژه مثال، شما نیاز دارید:
- دو میکروکنترلر (دو برد آردوینو نانو برای این مثال)
- دو ماژول MCP2515 CAN
- یک تخته نان
- سیم های جامپر
- یک ماژول صفحه نمایش LCD 16×2 I2C
- سنسور اولتراسونیک HC-SR04
برای مثال پروژه، از چهار کتابخانه در طرح آردوینو استفاده شده است. کتابخانه NewPing وجود دارد که یک رابط کاربری آسان برای حسگر اولتراسونیک و همچنین کتابخانه SPI وجود دارد که ارتباط بین برد آردوینو و کنترلر باس MCP2515 CAN را تسهیل میکند. کتابخانه LiquidCrystal_I2C برای ماژول نمایش استفاده می شود.
در نهایت، کتابخانه mcp2515 برای ارتباط با تراشه MCP2515 وجود دارد که به ما امکان میدهد به راحتی دادهها را از طریق شبکه CAN bus انتقال دهیم.
راه اندازی سخت افزار (مثال HC-SR04)
در این پروژه با استفاده از سنسور HC-SR04 و LCD، یک برد آردوینو نانو به عنوان گیرنده و آردوینو دیگر به عنوان فرستنده عمل خواهد کرد. اجزای فرستنده خود را مطابق نمودار سیم کشی زیر وصل کنید:
در اینجا نمودار مدار گیرنده آمده است:
در نهایت، مطابق شکل، دو گره را با استفاده از خطوط CAN_H و CAN_L به یکدیگر متصل کنید:
هنگام وصل کردن ماژول ها، مهم است که مطمئن شوید ولتاژ منبع تغذیه در محدوده مشخص شده است و پایه های CAN H و CAN L به درستی به باس متصل شده اند.
برنامه نویسی ماژول CAN Bus MCP2515
توجه داشته باشید که هنگام برنامه ریزی ماژول MCP2515، استفاده از نرخ بیت صحیح برای اطمینان از برقراری ارتباط موفق با سایر دستگاه های CAN در شبکه مهم است.
کد فرستنده:
#include <MCP2515.h>
#include <SPI.h>
#include <NewPing.h>
MCP2515 mcp2515(10);
const byte trigPin = 3;
const byte echoPin = 4;
NewPing sonar(trigPin, echoPin, 200);
struct can_frame canMsg;
void setup() {
Serial.begin(9600);
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}
void loop() {
unsigned int distance = sonar.ping_cm();
canMsg.can_id = 0x036; //CAN id as 0x036
canMsg.can_dlc = 8; //CAN data length as 8
canMsg.data[0] = distance; //Update humidity value in [0]
canMsg.data[1] = 0x00; //Rest all with 0
canMsg.data[2] = 0x00;
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;
mcp2515.sendMessage(&canMsg);//Sends the CAN message
delay(100);
}
کد گیرنده:
#include <mcp2515.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
MCP2515 mcp2515(10);
LiquidCrystal_I2C lcd(0x27,16,2);
struct can_frame canMsg;
void setup() {
Serial.begin(9600);
mcp2515.reset();
mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("MUO CAN TUTORIAL");
delay(3000);
lcd.clear();
}
void loop() {
if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) // To receive data
{
int distance = canMsg.data[0];
lcd.setCursor(0,0);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print("cm ");
}
}
پروژه های آردوینو خود را به سطح بعدی ببرید
ترکیب گذرگاه CAN و آردوینو یک پلتفرم قدرتمند برای ایجاد یا یادگیری شبکه های ارتباطی پیچیده مورد استفاده در برنامه های مختلف فراهم می کند. در حالی که ممکن است به نظر یک منحنی یادگیری شیب دار باشد، داشتن راه اندازی خود بر روی تخته نان یک راه بسیار مفید برای یادگیری طناب استفاده از شبکه CAN bus در پروژه های پیچیده DIY است.