برای ارتباط برقرارکردن با خودرو پروتکلهای مختلفی توسعه یافته که در مطالب قبلی سیسوگ در مورد آنها میتوانید اطلاعات کسب کنید؛ اما در این پست تنها در مورد کار با یکی از این پروتکلها صحبت میکنیم و تاحدامکان از بیان مقدمات خودداری میشود. در این پروژه از ELM-327 و آیسی MC33290 استفاده کردیم که در ادامه با استفاده از آنها در مورد آنچه لازم است بدانید شرح داده میشود؛ اما قبل از آن لازم است مطالب تکمیلی درمورد ECU خدمت شما عزیزان عرض کنم.
ابتدا لازم است که بدانید امروزه تمام وظایف کنترل و مدیریت خودرو به عهده ECU نیست؛ بلکه قسمتهای مختلف خودرو توسط ماژولهای کنترلی دیگری که در کنار ECU قرار میگیرند کنترل میشوند. برای ارتباط تمام این ماژولها با هم از جانمایی (توپولوژی) ستارهای بجای دایرهای (رینگ) استفاده میشود. دانستن این امر از آنجا برای ما مهم است هر قسمت خودرو آدرس مخصوص به خود را دارد که باید برای دسترسی به اطلاعات آن قسمت از آن مطلع باشیم.
موضوع بعدی نحوه برقراری ارتباط با ECU است که دو بخش سختافزاری و نرمافزاری دارد. در بخش سختافزاری شما میتوانید با استفاده از دو ترانزیستور یا آیسی K-Line ارتباط را برقرار کنید که بهوسیله اتصال آنها به ECU با کانکتور استاندارد که در زیر مشاهده میکنید صورت میگیرد.
دقت کنید که پایه EN باید به ولتاژ ۵ ولت متصل شود تا آیسی فعال شود. همینطور شما میتوانید از ترانزیستور برای برقراری ارتباط استفاده کنید؛ به این صورت که لاین ارتباطی همیشه ۱۲ ولت است و هرگاه پیام ارسال کردید تغییر میکند. در دستگاه دیباگر ELM-327 هم از روش ترانزیستوری استفاده شده است.
برای مقایسه ورودی و خروجی آیسی در تصویر زیر سیگنال خروجی آیسی MC33290 (زردرنگ) را در مقایسه با سیگنال UART (سبزرنگ) در بادریت ۳۰۰ مشاهده میکنید.
همانطور که مشاهده میکنید سیگنال خروجی کاملاً صاف نیست که این زاویه با وجود خازن در خروجی بیشتر هم میشود؛ اما مهمتر از وجود یا عدم وجود خازن سرعت انتقال داده است که تأثیر زیادی روی افزایش زاویه این سیگنال دارد و به همین دلیل از سرعت کم برای نمایش سیگنال استفاده شده است. البته این سیگنال حتی با وجود صاف نبودن برای ECU در سرعت ۱۰۴۰۰ قابل خواندن است و ازاینجهت مشکلی وجود ندارد.
مسئله بعدی نحوه ارسال پیام به ECU است. برای ارسال پیام ابتدا باید به مدت ۲۵ میلیثانیه خروجی را صفر و در ۲۵ میلیثانیه بعد آن را یک کنید و بلافاصله پیام خود را ارسال کنید. پیامی که برای اولینبار ارسال میکنید باید به این شکل باشد (0xC1 ,0x33 ,0xF1 ,0x81 ,0x66). بهعنوان نمونه در تصویر پایین شروع ارتباط ELM 327 را مشاهده میکنید.
همانطور که مشاهد میکنید بین هر بایت از پیام، ۵ میلیثانیه اختلاف وجود دارد که الزامی نیست و ECU میتواند پیام شما را بدون وجود اختلاف زمانی هم بخواند. در اینجا لازم است به این نکته اشاره کنم که ECU ای که تحت تست بود از قابلیت شروع کند پشتیبانی نمیکرد لذا شاید نتوان گفت تمام ECUها دارای این قابلیت هستند. قسمت سختافزار که تا اینجا با آن آشنا شدید لایه فیزیکی پروتکل است. در تصویر زیر میتوانید نمایش پروتکل ارتباطی با استفاده از مدل هفتلایه را مشاهده کنید.
برای شروع قسمت نرمافزاری لازم به ذکر است که در اینجا ما از پروتکلISO 14230-4 KWP استفاده میکنیم. پکت این پروتکل به شکل زیر است:
CRC | پیام | پیام | آدرس فرستنده | آدرس گیرنده | هدر |
هدر این پکت بهصورت زیر تعریف میشود.
آدرس دیباگر بهصورت هگز F1 و ثابت است؛ اما آدرس گیرنده متفاوت خواهد بود. برای ایجاد پیام صحیح باید از قبل سؤال و آدرس درست را بدانید وگرنه پاسخی دریافت نخواهید کرد. مثلاً درخواست و پاسخ خواندن اطلاعات سنسور دمای موتور را در جدول زیر مشاهده میکنید.
پیام ارسالی | 0xC2 0x33 0xF1 0x01 0x05 0xEC |
پیام دریافتی | 0x83 0xF1 0x11 0x41 0x05 0x6F 0x3A |
71 درجه سانتی گراد | 6F |
هدر این پیام به این صورت تحلیل میشود که نشاندهنده وجود سه بایت دیتا بهعنوان پیام است.
1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
پیام ما به شکل زیر است:
0x41 0x05 0x6F
که بایت اول نشاندهنده پاسخ ECU به پیام ۰۵ ۰۱ و بایت آخر دمای سنسور است که ۷۱ درجه را نشان میدهد که با کسرکردن عدد ۴۰ از آن به دست میآید. دقت کنید که بیشتر اطلاعاتی که ECU برای شما ارسال میکند نیاز به تفسیر دارد و بهصورت خام قابلاستفاده نیست.
در آخر برای تحلیل CRC نیاز است که تمام بایتها را با هم جمع بزنیم و فقط یک بایت از آن را نگهداریم. بهعنوانمثال در پیام بالا داریم:
0X83+0XF1+0X11+0X41+0X05+0X6F=0X23A
که مقدار 0X3A برابر با CRC محاسبه شده است.
امیدوارم از این مطلب استفاده کرده باشید.
با تشکر
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.
با سلام خیلی ممنون از مطالب مفیدتون و زحمتهای ارزشمندتون بنده میخوام با استفاده از ماژول CAN to SPI مبتنی بر MCP2515 که لینکشو در ادامه میذارم از طریق ESP32 ارتباط بگیرم، خب مسئله بنده اینجاست که چه اطلاعاتی رو باید از فایل هایی که در ecu.sisoog.com برای خودروی پراید (https://ecu.sisoog.com/images/3/3f/SAI_PRI_VAL_S2000.json) قرارداده شده رو به ecu ارسال کنم تا جواب برگرده چون راهنمایی در این خصوص قرار داده نشده یا من ندیدم، مثلا برای دریافت دور موتور باید "21 81" به صورت 0x21 0x81 ارسال بشه؟ و header هم به صورت 0x61 0x81؟ ممنون میشم در این خصوص بنده رو راهنمایی کنید، با تشکر.لینک ماژول CAN به SPI: https://eshop.eca.ir/%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%85%D8%A8%D8%AF%D9%84-%D9%88-%D9%88%D8%A7%D8%B3%D8%B7/17650-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%85%D8%A8%D8%AF%D9%84-can-%D8%A8%D9%87-spi-%D8%A8%D8%A7-%D8%AA%D8%B1%D8%A7%D8%B4%D9%87-mcp2515.html
راستی فراموش کردم بگم که این آموزش برپایه UART هست و K-Line
درود بر شما جناب اکبرزاده عزیز. ممنونم بابت اشتراک گذاری دیدگاهتون. برای ارتباط با ECU ابتدا باید خروجی را ۲۵ میلیثانیه صفر و ۲۵ میلیثانیه یک کنید و سپس پیام 0xC1 ,0x33 ,0xF1 ,0x81 ,0x66 را ارسال کنید و پس از دریافت پاسخ از ECU باید قسمت cmdtext را ارسال کنید. در اینجا به این صورت است 0xC2 0x33 0xF1 0x21 0x81 0x88 من تستی روی پراید انجام ندادم ولی اگر اصول را رعایت کنید باید کار کند. چنانچه کار نکرد همینجا یا در ask.sisoog سوال خودتون رو بپرسید. :) ضمنا دیتای شما پس از چیزی که در cheader میبینید شروع میشود که در اینجا "RBB[61 81]" است و CRC به این صورت محاسبه میشود c2+33+f1+21+81. چنانچه موفق شدید خوشحال میشوم نتایج را با من هم اشتراک بگذارید. موفق باشید :)
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.