فهرست مطالب:

پروتکل CAN - بله ، ما می توانیم!: 24 مرحله
پروتکل CAN - بله ، ما می توانیم!: 24 مرحله

تصویری: پروتکل CAN - بله ، ما می توانیم!: 24 مرحله

تصویری: پروتکل CAN - بله ، ما می توانیم!: 24 مرحله
تصویری: ترکید😱😭 2024, نوامبر
Anonim
Image
Image
منابع مورد استفاده
منابع مورد استفاده

یکی دیگر از موضوعاتی که اخیراً توسط دنبال کنندگان کانال YouTube من پیشنهاد شده بود پروتکل CAN (Controller Area Network) بود ، چیزی که ما امروز روی آن تمرکز می کنیم. توضیح این نکته ضروری است که CAN یک پروتکل ارتباط سریال همزمان است. این بدان معناست که همگام سازی بین ماژول های متصل به شبکه در رابطه با شروع هر پیام ارسال شده به گذرگاه انجام می شود. ما ابتدا مفاهیم اولیه پروتکل CAN را معرفی کرده و یک مونتاژ ساده را با دو ESP32 انجام می دهیم.

در مدار ما ، ESP ها می توانند به عنوان Master و Slave عمل کنند. شما می توانید چندین میکروکنترلر را همزمان ارسال کنید ، زیرا CAN به طور خودکار با برخورد همه چیز برخورد می کند. کد منبع این پروژه فوق العاده ساده است. آن را بررسی کنید!

مرحله 1: منابع مورد استفاده

  • دو ماژول ESP WROOM 32 NodeMcu
  • دو فرستنده گیرنده CAN از WaveShare
  • جامپر برای اتصالات
  • تجزیه و تحلیل منطقی برای ضبط
  • سه کابل USB برای ESP و آنالیز
  • 10 متر جفت پیچ خورده برای خدمت به عنوان اتوبوس

مرحله 2: CAN (شبکه کنترل منطقه)

CAN (شبکه کنترل منطقه)
CAN (شبکه کنترل منطقه)
  • این دستگاه توسط Robert Bosch GmbH در دهه 1980 برای خدمت به صنعت خودرو توسعه داده شد.
  • در طول سالها به دلیل استحکام و انعطاف پذیری اجرای آن ، رواج یافته است. این دستگاه با تجهیزات نظامی ، ماشین آلات کشاورزی ، اتوماسیون صنعتی و ساختمان ، روباتیک و تجهیزات پزشکی مورد استفاده قرار می گیرد.

مرحله 3: CAN - ویژگی ها

CAN - ویژگی ها
CAN - ویژگی ها
CAN - ویژگی ها
CAN - ویژگی ها
  • ارتباط سریال دو سیمه
  • حداکثر 8 بایت اطلاعات مفید در هر فریم ، با امکان تکه تکه شدن
  • آدرس به پیام و نه به گره هدایت می شود
  • اختصاص اولویت به پیام ها و انتقال پیام های "در حالت انتظار"
  • توانایی م toثر در تشخیص و علامت گذاری خطاها
  • قابلیت چند کارشناسی ارشد (همه گره ها می توانند دسترسی به گذرگاه را درخواست کنند)
  • قابلیت Multicast (یک پیام برای چندین گیرنده به طور همزمان)
  • نرخ انتقال تا 1 مگابیت بر ثانیه در اتوبوس 40 متری (کاهش نرخ با افزایش طول شینه)
  • انعطاف پذیری پیکربندی و معرفی گره های جدید (حداکثر 120 گره در هر گذرگاه)
  • سخت افزار استاندارد ، هزینه کم و در دسترس بودن خوب
  • پروتکل تنظیم شده: ISO 11898

مرحله 4: مدار مورد استفاده

مدار استفاده می شود
مدار استفاده می شود

در اینجا ، من گیرنده گیرنده را دارم. در هر طرف یک عدد وجود دارد و آنها توسط یک جفت سیم به یکدیگر متصل می شوند. یکی مسئول ارسال و دیگری دریافت اطلاعات است.

مرحله 5: ولتاژهای خط انتقال (تشخیص افتراقی)

ولتاژهای خط انتقال (تشخیص افتراقی)
ولتاژهای خط انتقال (تشخیص افتراقی)

در CAN ، بیت غالب صفر است.

تشخیص دیفرانسیل خط حساسیت نویز (EFI) را کاهش می دهد

مرحله 6: قالب استاندارد و فریم CAN

قالب استاندارد و فریم CAN
قالب استاندارد و فریم CAN

فرمت استاندارد با شناسه 11 بیتی

مرحله 7: قالب استاندارد و فریم CAN

قالب استاندارد و فریم CAN
قالب استاندارد و فریم CAN

فرمت گسترده با شناسه 29 بیتی

مرحله 8: قالب استاندارد و فریم CAN

توجه به این نکته ضروری است که یک پروتکل قبلاً CRC را محاسبه کرده و سیگنال های ACK و EOF را ارسال می کند ، که این موارد قبلاً توسط پروتکل CAN انجام شده است. این تضمین می کند که پیام ارسال شده به روش اشتباهی نخواهد رسید. این امر به این دلیل است که اگر در CRC (چک حلقه ای اضافی یا چک افزونگی) ، که همان رقم بررسی اطلاعات است ، مشکلی ایجاد کند ، توسط CRC مشخص می شود.

مرحله 9: چهار نوع قاب (فریم)

چهار نوع قاب (فریم)
چهار نوع قاب (فریم)

توجه به این نکته ضروری است که یک پروتکل قبلاً CRC را محاسبه کرده و سیگنال های ACK و EOF را ارسال می کند ، که این موارد قبلاً توسط پروتکل CAN انجام شده است. این تضمین می کند که پیام ارسال شده به روش اشتباهی نخواهد رسید. این امر به این دلیل است که اگر در CRC (چک حلقه ای اضافی یا چک افزونگی) ، که همان رقم بررسی اطلاعات است ، مشکلی ایجاد کند ، توسط CRC مشخص می شود.

چهار نوع قاب (فریم)

انتقال و دریافت داده ها در CAN بر اساس چهار نوع فریم است. انواع فریم با تغییرات در بیت های کنترل یا حتی تغییر در قوانین نوشتن قاب برای هر مورد مشخص می شود.

  • قاب داده: شامل داده های فرستنده گیرنده (ها) است
  • قاب از راه دور: این درخواست برای داده های یکی از گره ها است
  • Error Frame: فریمی است که توسط هر یک از گره ها هنگام شناسایی خطا در گذر ارسال می شود و توسط همه گره ها قابل تشخیص است.
  • Overload Frame: به منظور تأخیر در ترافیک در گذرگاه به دلیل اضافه بار داده یا تأخیر در یک یا چند گره عمل می کند.

مرحله 10: مدار - جزئیات اتصالات

مدار - جزئیات اتصالات
مدار - جزئیات اتصالات

مرحله 11: مدار - ضبط داده ها

مدار - ضبط داده
مدار - ضبط داده

طول موج برای استاندارد CAN با شناسه 11 بیتی به دست آمده است

مرحله 12: مدار - ضبط داده

مدار - ضبط داده
مدار - ضبط داده

طول موج برای CAN گسترده با شناسه 29 بیتی به دست آمده است

مرحله 13: مدار - ضبط داده

مدار - ضبط داده
مدار - ضبط داده

داده های بدست آمده توسط تحلیل گر منطقی

مرحله 14: کتابخانه آردوینو - CAN

کتابخانه آردوینو - CAN
کتابخانه آردوینو - CAN

من در اینجا دو گزینه را نشان می دهم که می توانید کتابخانه CAN Driver را نصب کنید

مدیر کتابخانه Arduino IDE

مرحله 15: Github

Github
Github

github.com/sandeepmistry/arduino-CAN

مرحله 16: کد منبع فرستنده

کد منبع: شامل و راه اندازی ()

ما کتابخانه CAN را وارد می کنیم ، سریال اشکال زدایی را شروع می کنیم و گذرگاه CAN را با سرعت 500 کیلوبیت بر ثانیه راه اندازی می کنیم.

#include // inclui a biblioteca CAN void setup () {Serial.begin (9600)؛ // inicia a serial para debug while (! Serial)؛ Serial.println ("انتقال دهنده می تواند") ؛ // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN")؛ // در صورت کنترل (1)؛ }}

مرحله 17: کد منبع: حلقه () ، ارسال یک بسته استاندارد CAN 2.0

با استفاده از استاندارد CAN 2.0 ، ما یک بسته ارسال می کنیم. شناسه 11 بیتی پیام را مشخص می کند. بلوک داده باید حداکثر 8 بایت داشته باشد. بسته را با شناسه 18 به صورت هگزادسیمال شروع می کند. 5 بایت را بسته بندی می کند و عملکرد را می بندد.

void loop () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bit and identifica a mensagem (prioridade، evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote … ")؛ CAN.beginPacket (0x12) ؛ // id 18 em hexadecimal CAN.write ('h')؛ // 1º بایت CAN.write ('e')؛ // 2º بایت CAN.write ('l')؛ // 3º بایت CAN.write ('l')؛ // 4º بایت CAN.write ('o')؛ // 5º بایت CAN.endPacket ()؛ // encerra o pacote para envio Serial.println ("Enviado.")؛ تاخیر (1000) ؛

مرحله 18: کد منبع: حلقه () ، ارسال بسته گسترده CAN 2.0

در این مرحله ، شناسه 29 بیت دارد. شروع به ارسال 24 بیت شناسه می کند و بار دیگر 5 بایت را بسته بندی می کند و خارج می شود.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bit and identifica a mensagem (prioridade، evento) // o bloco de dados deve possuir até 8 bytes Serial.println ("Enviando pacote estendido …")؛ CAN.beginExtendedPacket (0xabcdef) ؛ // id 11259375 اعشاری (abcdef em hexa) = 24 بیت preenchidos até aqui CAN.write ('w') ؛ // 1º بایت CAN.write ('o') ؛ // 2º بایت CAN.write ('r')؛ // 3º بایت CAN.write ('l')؛ // 4º بایت CAN.write ('d') ؛ // 5º بایت CAN.endPacket ()؛ // encerra o pacote para envio Serial.println ("Enviado.")؛ تاخیر (1000) ؛ }

مرحله 19: کد منبع گیرنده

کد منبع: شامل و راه اندازی ()

دوباره ، ما کتابخانه CAN را وارد می کنیم ، سریال را برای اشکال زدایی شروع می کنیم و گذرگاه CAN را با سرعت 500 کیلوبیت بر ثانیه شروع می کنیم. در صورت بروز خطا ، این خطا چاپ می شود.

#include // inclui a biblioteca CAN void setup () {Serial.begin (9600)؛ // inicia a serial para debug while (! Serial)؛ Serial.println ("گیرنده می تواند") ؛ // Inicia o barramento CAN a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN")؛ // در صورت کنترل (1)؛ }}

مرحله 20: کد منبع: حلقه () ، دریافت بسته و بررسی فرمت

ما سعی کردیم اندازه بسته دریافتی را بررسی کنیم. متد CAN.parsePacket () اندازه این بسته را به من نشان می دهد. بنابراین اگر بسته ای داریم ، بررسی می کنیم که آیا بسته آن تمدید شده است یا خیر.

void loop () {// Tenta verificar o tamanho do acote recebido int packetSize = CAN.parsePacket ()؛ if (packetSize) {// Se temos um pacote Serial.println ("کاسه گیر Recebido.")؛ if (CAN.packetExtended ()) {// verifica se o pacote é estendido Serial.println ("Estendido")؛ }

مرحله 21: منبع: حلقه () ، بررسی می کند که آیا بسته از راه دور است

در اینجا ، بررسی می کنیم که بسته دریافتی درخواست داده باشد. در این مورد ، هیچ داده ای وجود ندارد.

if (CAN.packetRtr ()) {// Verifica se o pacote é um pacote remoto (Requisição de dados) ، neste caso não há dados Serial.print ("RTR") ؛ }

مرحله 22: کد منبع: حلقه () ، طول داده درخواست شده یا دریافت شده

اگر بسته دریافتی یک درخواست باشد ، طول درخواست شده را نشان می دهیم. سپس کد طول داده (DLC) را بدست می آوریم ، که طول داده ها را نشان می دهد. در نهایت ، طول دریافتی را نشان می دهیم.

Serial.print ("Pacote com id 0x")؛ Serial.print (CAN.packetId () ، HEX) ؛ if (CAN.packetRtr ()) {// se o pacote recebido é de requisição، indicamos o comprimento solicitado Serial.print ("e requsitou o comprimento")؛ Serial.println (CAN.packetDlc ()) ؛ // obtem o DLC (Data Length Code، que indica o comprimento dos dados)} else {Serial.print ("e comprimento")؛ // aqui somente indica o comprimento recebido Serial.println (packetSize) ؛

مرحله 23: کد منبع: حلقه () ، در صورت دریافت داده ، سپس چاپ می شود

ما داده ها را (روی مانیتور سریال) چاپ می کنیم ، اما تنها در صورتی که بسته دریافتی یک درخواست نباشد.

// Imprime os dados somente se o pacote Recebido não foi de requisição while (CAN.available ()) {Serial.print ((char) CAN.read ())؛ } Serial.println ()؛ } Serial.println ()؛ }}

مرحله 24: فایل ها را بارگیری کنید

PDF

من نه

توصیه شده: