آموزش برقراری ارتباط CAN بین دو برد ESP32

محتویات
- معرفی پروتکل ارتباطی CAN Bus
- توپولوژی CAN Bus
- سیگنالدهی CAN
- گره ها در CAN Bus
- یک فریم استاندارد CAN
- کنترلر CAN ESP32 (TWAI)
- نمودار بلوکی
- خطوط سیگنال
- حالتهای عملیاتی
- ویژگی های TWAI ESP32
- ترانسیور پرسرعت TJA1050
- آموزش مدار و اتصالات ارتباط CAN
- مثال 1: شبکه CAN دو گرهای ساده
- مثال 2: شبکه CAN چند گرهای
- کد برقراری ارتباط CAN با برد ESP32
اکثر افراد خانواده میکروکنترلرهای ESP را با وایفای مرتبط میدانند، که منطقی است، زیرا این میکروکنترلرها به عنوان راهحلی سریع و آسان برای آنلاین کردن پروژهها شناخته شدهاند. با این حال، اگرچه قابلیت وایفای ممکن است ستاره اصلی باشد، ESP32 همچنین به یک کنترلر CAN مجهز است. فقط این که کمتر دیده میشود از این قابلیت استفاده شود.
یادگیری نحوه خواندن و تجزیه پیامهای CAN روی ESP32 میتواند بسیار مفید باشد. به عنوان مثال، میتوانید دادههایی از ماشین خود مانند دمای خنککننده، موقعیت دریچه گاز، سرعت خودرو و دور موتور را دریافت کنید و آنها را روی یک صفحه وب میزبانیشده نمایش دهید که از طریق وایفای قابل دسترسی است. یا میتوانید شبکه CAN خود را ایجاد کنید.
در این آموزش، ما به اصول اولیه میپردازیم. شما با مبانی سیستم CAN bus آشنا خواهید شد، نحوه پیکربندی کنترلر CAN داخلی ESP32، نحوه اتصال ESP32 به ترانسیور خارجی CAN مانند TJA1050 و مهمتر از همه، نحوه برقراری ارتباط بین دو برد ESP32 از طریق CAN bus را یاد خواهید گرفت.
معرفی پروتکل ارتباطی CAN Bus
در گذشته، خودروها بیش از 2000 متر کابل داشتند که مثلاً سوئیچهای روی داشبورد را مستقیماً به چراغهای جلو و عقب متصل میکردند. با پیچیدهتر شدن خودروها، این منطق ساده دیگر کارآمد نبود.
در سال 1986، شرکت بوش سیستم CAN bus را معرفی کرد که این مشکل را حل کرد و ساخت خودرو را ارزانتر و آسانتر کرد. CAN اکنون به استاندارد صنعتی تبدیل شده و در همه چیز از خودروها و کامیونها گرفته تا اتوبوسها و تراکتورها و حتی هواپیماها و کشتیها استفاده میشود.
برای درک بهتر CAN bus، خودروی خود را مانند بدن انسان در نظر بگیرید. در این زمینه، CAN bus مانند سیستم عصبی عمل میکند.
همانطور که سیستم عصبی امکان ارتباط بین بخشهای مختلف بدن را فراهم میکند، CAN bus نیز امکان ارتباط بین گرههای مختلف CAN bus را فراهم میکند. این گرهها به عنوان واحدهای کنترل الکترونیکی (یا ECU) شناخته میشوند.
یک خودروی مدرن بیش از 70 ECU دارد که هر کدام مسئول انجام یک وظیفه خاص هستند. اگرچه این ECUها میتوانند یک وظیفه را به طور موثر انجام دهند، اما باید اطلاعات را با یکدیگر به اشتراک بگذارند. به عنوان مثال، ماژول کنترل موتور، دور موتور فعلی را به کلاستر ابزار ارسال میکند تا روی تاکومتر نمایش داده شود. به طور مشابه، کنترلر درب راننده پیامی به کنترلر درب سرنشین ارسال میکند تا پنجره را فعال کند.
توپولوژی CAN Bus
ارتباط فیزیکی از طریق کابلهای CAN bus انجام میشود که شامل دو سیم است: CAN low و CAN high. هر دو سیم به هم پیچیده شدهاند تا تداخل الکترومغناطیسی به طور یکنواخت روی هر دو سیم تأثیر بگذارد و در نتیجه خطاها به حداقل برسند.
انتهای کابلها با مقاومتهای 120 اهمی خاتمه مییابند. از آنجا که CAN bus یک باس داده پرسرعت است، اگر باس خاتمه نیابد، سیگنال منعکس شده و با سیگنال بعدی تداخل میکند که ممکن است ارتباطات را مختل کرده و باعث خرابی باس شود.
سیگنالدهی CAN
برای انتقال دادهها روی این سیمها، سطح ولتاژ آنها تغییر میکند. این تغییرات ولتاژ سپس به سطوح منطقی ترجمه میشوند که به گرههای شبکه امکان ارتباط با یکدیگر را میدهند.
- برای انتقال “سطح منطقی 1” روی CAN bus، ولتاژ روی هر دو خط به 2.5 ولت تنظیم میشود (یعنی هیچ تفاوت ولتاژی وجود ندارد). این حالت به عنوان حالت Recessive شناخته میشود و نشان میدهد که CAN bus برای استفاده توسط هر گره در دسترس است.
- در مقابل، برای انتقال “سطح منطقی 0″، خط CAN high به 3.5 ولت و خط CAN low به 1.5 ولت تنظیم میشود (یعنی تفاوت ولتاژ 2 ولت وجود دارد). این حالت باس به عنوان حالت Dominant شناخته میشود که به همه گرهها اطلاع میدهد که گره دیگری در حال انتقال است و باید منتظر بمانند تا انتقال پایان یابد.
گره ها در CAN Bus
هر گره CAN شامل یک ترانسیور CAN، یک کنترلر CAN و یک میکروکنترلر است.
ارسال کننده CAN:
- هنگام دریافت: سطح ولتاژ روی CAN bus را به سطحی تبدیل میکند که کنترلر CAN بتواند آن را درک کند.
- هنگام انتقال: جریان داده را از کنترلر CAN به سطح CAN bus تبدیل میکند.
کنترلر CAN:
- هنگام انتقال: پیام را از میکروکنترلر به صورت سریالی روی باس ارسال میکند.
- هنگام دریافت: بیتهای دریافتی از باس را ذخیره میکند تا یک پیام کامل آماده شود و سپس میکروکنترلر را مطلع میکند (معمولاً با ایجاد وقفه).
میکروکنترلر: تصمیم میگیرد که پیامهای دریافتی چه معنایی دارند و چه پیامهایی باید ارسال شوند. سنسورها، عملگرها و دستگاههای کنترل به آن متصل هستند.
یک فریم استاندارد CAN
ارتباط روی CAN bus از طریق فریمهای CAN انجام میشود. در زیر یک فریم استاندارد CAN با شناسه 11 بیتی آورده شده است. بیایید نگاهی سریع به هر یک از هشت فیلد پیام بیندازیم:
- SOF (شروع فریم): یک “0 Dominant” است که به گرههای دیگر اطلاع میدهد یک گره CAN قصد صحبت دارد.
- ID (شناسه): شناسه فریم است. برای مشخص کردن معنای پیام و ارسالکننده آن استفاده میشود. همچنین اولویت پیام را تعیین میکند: هرچه شناسه کمتر باشد، اولویت پیام بالاتر است.
- RTR (درخواست انتقال از راه دور): نشان میدهد که گره داده ارسال میکند یا از گره دیگری درخواست داده دارد.
- Control (کنترل): شامل بیت گسترش شناسه (IDE) است که برای شناسه 11 بیتی “0 Dominant” است. همچنین شامل کد طول داده (DLC) 4 بیتی است که تعداد بایتهای داده در پیام را مشخص میکند.
- Data (داده): 8 بایت داده که اطلاعات واقعی را شامل میشود.
- CRC (بررسی افزونگی چرخهای): برای تشخیص خطا استفاده میشود.
- ACK (تأیید): نشان میدهد که گره داده را دریافت و تأیید کرده است.
- EOF (پایان فریم): پایان فریم CAN را مشخص میکند.
کنترلر CAN ESP32 (TWAI)
شرکت Espressif Systems کنترلر سازگار با CAN bus خود را TWAI نامیده است که مخفف Two-Wire Automotive Interface است.
حالا ممکن است این سوال برای شما پیش بیاید که چرا این شرکت به جای استفاده از اصطلاح آشنا و رایج CAN، از TWAI استفاده کرده است. این سوالی است که بسیاری از افراد از زمانی که Espressif تصمیم به تغییر نام گرفت، پرسیدهاند.
پیش از این، Espressif از اصطلاح CAN در تمام مستندات خود برای توصیف این ویژگی استفاده میکرد. با این حال، در جدیدترین مستندات، این شرکت شروع به استفاده از اصطلاح TWAI کرده است. این تغییر ممکن است در ابتدا کمی گیجکننده به نظر برسد، اما به خاطر داشته باشید که TWAI و CAN اساساً به یک چیز اشاره دارند وقتی صحبت از ESP32 میشود.
کنترلر TWAI برای سازگاری با پروتکل CAN 2.0 طراحی شده است. این کنترلر از هر دو فرمت فریم استاندارد (شناسه 11 بیتی) و فرمت فریم گسترده (شناسه 29 بیتی) پشتیبانی میکند.
این کنترلر شامل ویژگیهایی برای تشخیص و مدیریت خطا است که ارتباطات قوی در محیطهای پرنویز را تضمین میکند. این موضوع به ویژه در کاربردهای خودرویی بسیار مهم است.
کنترلر TWAI همچنین از ارتباطات مبتنی بر وقفه پشتیبانی میکند که این امکان را فراهم میآورد تا پیامها و رویدادها روی CAN bus به طور کارآمدی مدیریت شوند بدون این که نیاز به بررسی مداوم وضعیت باشد.
نمودار بلوکی
نمودار زیر بلوکهای عملکردی اصلی کنترلر TWAI را نشان میدهد.
خطوط سیگنال
رابط کنترلر TWAI شامل چهار خط سیگنال است: TX، RX، BUS-OFF و CLKOUT. یکی از ویژگیهای خوب ESP32 این است که همه این سیگنالها میتوانند به هر پین GPIO نگاشت شوند.
- TX و RX: خطوط سیگنال TX و RX باید به یک ترانسیور خارجی متصل شوند. هر دو خط سیگنال یک بیت Dominant را به عنوان سطح منطقی پایین (0 ولت) و یک بیت Recessive را به عنوان سطح منطقی بالا (3.3 ولت) نشان میدهند یا تفسیر میکنند.
- BUS-OFF: خط سیگنال BUS-OFF همیشه لازم نیست، اما در برخی شرایط مفید است. این خط زمانی که کنترلر TWAI وارد حالت bus-off میشود (که نشاندهنده اختلال در ارتباطات است) به سطح منطقی پایین (0 ولت) تنظیم میشود. در حالت عادی، خط BUS-OFF در سطح منطقی بالا (3.3 ولت) باقی میماند.
- CLKOUT: خط سیگنال CLKOUT یک ویژگی اختیاری دیگر است. این خط یک نسخه مقیاسشده از ساعت منبع کنترلر را به عنوان خروجی ارائه میدهد.
حالتهای عملیاتی
کنترلر TWAI از حالتهای عملیاتی زیر پشتیبانی میکند:
- حالت عادی (Normal Mode): در این حالت، کنترلر TWAI میتواند در فعالیتهای باس مانند ارسال و دریافت پیامها یا فریمهای خطا شرکت کند. هنگام ارسال یک پیام، تأییدیه از گره دیگر مورد نیاز است.
- حالت بدون تأیید (No Ack Mode): این حالت شبیه به حالت عادی است، با این تفاوت که انتقالها بدون نیاز به تأییدیه موفق در نظر گرفته میشوند. این حالت به ویژه برای تست خود کنترلر TWAI مفید است، زیرا امکان ارسال و دریافت همزمان بدون نیاز به تأییدیه خارجی را فراهم میکند.
- حالت فقط گوشدهی (Listen Only Mode): در این حالت، کنترلر TWAI نقش غیرفعال دارد. این کنترلر روی باس تأثیر نمیگذارد، به این معنی که هیچ پیامی، تأییدیهای یا فریم خطایی ارسال نمیکند. کنترلر همچنان میتواند پیامها را دریافت کند اما آنها را تأیید نمیکند. این حالت برای برنامههای نظارت بر باس مناسب است.
ویژگی های TWAI ESP32
ویژگیهای اصلی کنترلر TWAI در ESP32 عبارتند از:
سازگار با پروتکل ISO 11898-1 (مشخصات CAN 2.0)
پشتیبانی از فرمت فریم استاندارد (شناسه 11 بیتی) و فرمت فریم گسترده (شناسه 29 بیتی)
نرخ بیت:
- از 25 کیلوبیت بر ثانیه تا 1 مگابیت بر ثانیه در نسخههای v0.0/v1.0/v1.1
- از 12.5 کیلوبیت بر ثانیه تا 1 مگابیت بر ثانیه در نسخههای v3.0/v3.1
چندین حالت عملیاتی
- حالت عادی
- حالت فقط گوشدهی (بدون تأثیر روی باس)
- حالت تست خودکار (انتقالها نیازی به تأییدیه ندارند)
FIFO دریافت 64 بایتی
انتقالهای ویژه:
- انتقالهای تکباره (به طور خودکار در صورت خطا دوباره ارسال نمیشوند)
- دریافت خودکار (کنترلر TWAI همزمان پیامها را ارسال و دریافت میکند)
فیلتر پذیرش (پشتیبانی از حالتهای تک فیلتر و دو فیلتر)
تشخیص و مدیریت خطا
- شمارندههای خطا
- محدوده هشدار خطای قابل تنظیم
- ثبت کد خطا
- ثبت از دست دادن داوری
ترانسیور پرسرعت TJA1050
اگرچه ESP32 دارای یک کنترلر سازگار با CAN bus است، اما یک ترانسیور CAN داخلی ندارد. بنابراین، برای اتصال به یک شبکه CAN، باید از یک ترانسیور خارجی استفاده کنیم.
نوع ترانسیور خارجی که نیاز دارید به نیازهای خاص پروژه شما بستگی دارد. به عنوان مثال، اگر نیاز به سازگاری با استاندارد ISO 11898-2 دارید، ترانسیورهای مانند TJA1050 High-Speed CAN از شرکت NXP یا SN65HVD23x از Texas Instruments گزینههای عالی هستند.
در این آموزش، ما از ماژول ترانسیور CAN bus TJA1050 استفاده خواهیم کرد.
این ماژول به عنوان رابط بین ESP32 و CAN bus فیزیکی دو سیم عمل میکند و نیاز های ما برای سرعت بالا (تا 1 مگابیت بر ثانیه)، جریان بیبار کم، سازگاری الکترومغناطیسی و مقاومت در برابر تخلیه الکترواستاتیک را برآورده میکند.
آموزش مدار و اتصالات ارتباط CAN
حالا که همه چیز را درباره کنترلر TWAI میدانیم، بیایید شبکه CAN خود را بسازیم.
مثال 1: شبکه CAN دو گرهای ساده
در این مثال، یک شبکه CAN bus ساده با دو گره ساخته میشود — یک گره پیام ارسال میکند و گره دیگر آن را دریافت میکند.
برای شروع، ماژول ترانسیور TJA1050 را بردارید و پین VCC آن را به VIN روی ESP32 متصل کنید. سپس، پین GND را به زمین متصل کنید. بعد، پین TX را به GPIO5 و پین RX را به GPIO4 روی ESP32 وصل کنید.
شما باید دو عدد از این مدارها را بسازید. هر دو از نظر اتصالات یکسان خواهند بود. یکی به عنوان فرستنده عمل میکند و پیامها را ارسال میکند، و دیگری به عنوان گیرنده عمل میکند و آن پیامها را دریافت میکند.
اتصال ماژولها ساده است: CAN L به CAN L و CAN H به CAN H متصل میشوند. سیمها در حالت ایدهآل باید به صورت جفت تابیده باشند، اما برای تستهای ساده روی برد برد یا مسیرهای کوتاه، این کار ضروری نیست.
به خاطر داشته باشید که با افزایش طول باس یا افزایش نویز الکتریکی محیطی، استفاده از سیمهای جفت تابیده و افزودن محافظ اهمیت بیشتری پیدا میکند.
شبکه را همانطور که در تصویر زیر نشان داده شده است، بسازید.
مثال 2: شبکه CAN چند گرهای
در این مثال، یک شبکه CAN بزرگتر ساخته میشود — چندین گره پیام ارسال میکنند و یک گره آنها را از طریق پورت سریال به کامپیوتر منتقل میکند.
گرههای دیگر میتوانند بین دو گره انتهایی اضافه شوند. این گرهها میتوانند به صورت درونخطی یا با استفاده از یک کابل کوتاه به باس اصلی متصل شوند، به شرطی که طول آنها کمتر از 12 اینچ باشد.
یک نکته مهم درباره ماژول ترانسیور TJA1050 این است که این ماژول با یک مقاومت خاتمهدهنده 120 اهمی از قبل لحیمشده عرضه میشود. بنابراین، برای گرههای اضافی در شبکه خود، باید این مقاومت را حذف کنید.
شبکه را همانطور که در تصویر زیر نشان داده شده است، بسازید.
کد برقراری ارتباط CAN با برد ESP32
کتابخانه CAN توسط Sandeep Mistry یک کتابخانه عالی برای کار با کنترلر TWAI است. شما باید این کتابخانه را در Arduino IDE دانلود و نصب کنید.
برای نصب کتابخانه، در نرم افزار Arduino IDE به مسیر زیر بروید:
Sketch > Include Library > Manage Libraries
صبر کنید تا Library Manager فهرست کتابخانهها را دانلود کرده و لیست کتابخانههای نصبشده را بهروزرسانی کند.
سپس، عبارت “mcp2515” را جستجو کنید و کتابخانه CAN by Sandeep Mistry را پیدا کنید. روی آن کلیک کرده و سپس Install را انتخاب کنید.
در این تست ساده، ما سعی میکنیم یک پیام “Hello World” را روی CAN bus ارسال کنیم تا ببینیم آیا میتوان آن را رمزگشایی کرد. این کار به شما کمک میکند نحوه استفاده از ماژولها را یاد بگیرید و میتواند به عنوان پایهای برای آزمایشها و پروژههای عملیتر استفاده شود.
کد کامل در فایل دانلودی انتهای مطلب قرار داده شده است. آن را روی برد های خود آپلود کنید و سپس نتیجه را تست کنید.
پس از آپلود کد، Serial Monitor را با نرخ باد 115200 باز کنید. گره فرستنده هر ثانیه یک بسته CAN استاندارد و یک بسته CAN گسترده ارسال میکند.
گره گیرنده این بستهها را دریافت کرده و از طریق پورت سریال به کامپیوتر ارسال میکند.
موارد موجود در فایل : سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
با سلام و وقت بخیر. من یه مشکلی تو اپلود این کد دارم . با اکزمپل های خود کتابخونه CAN.h هم تست کردم مشکل پابرجاست . تو این وضعیت که نت ها ملی شده محدود سایت های داخلی بالا میان . ایا راه حلی برای حل این ارور دارید؟
fatal error: esp_intr.h: No such file or directory
تشکر