جدول المحتويات:

هل البروتوكول - نعم ، نستطيع !: 24 خطوة
هل البروتوكول - نعم ، نستطيع !: 24 خطوة

فيديو: هل البروتوكول - نعم ، نستطيع !: 24 خطوة

فيديو: هل البروتوكول - نعم ، نستطيع !: 24 خطوة
فيديو: الحلقة (٣٥ ) هل الإستحمام ودخول الحمام بعد الجماع يمنع الحمل ؟ 2024, يوليو
Anonim
Image
Image
الموارد المستخدمة
الموارد المستخدمة

موضوع آخر اقترحه مؤخرًا متابعو قناتي على YouTube هو بروتوكول CAN (شبكة منطقة التحكم) ، وهو ما سنركز عليه اليوم. من المهم توضيح أن CAN هو بروتوكول اتصال تسلسلي متزامن. هذا يعني أن التزامن بين الوحدات المتصلة بالشبكة يتم تنفيذه بالنسبة لبداية كل رسالة يتم إرسالها إلى الناقل. سنبدأ بتقديم المفاهيم الأساسية لبروتوكول CAN وإجراء تجميع بسيط باستخدام جهازي ESP32.

في دائرتنا ، يمكن للمرسبات الكهروستاتيكية أن تكون بمثابة السيد والعبد. يمكن أن يكون لديك عدة متحكمات دقيقة ترسل في وقت واحد ، لأن CAN تتعامل مع تصادم كل شيء تلقائيًا. الكود المصدري لهذا المشروع بسيط للغاية. تحقق من ذلك!

الخطوة 1: الموارد المستخدمة

  • وحدتان من ESP WROOM 32 NodeMcu
  • يمكن اثنين من أجهزة الإرسال والاستقبال من WaveShare
  • صداري للوصلات
  • محلل منطقي للقبض
  • ثلاثة كبلات USB لمحلل ESPs والمحلل
  • 10 أمتار من الزوج الملتوي ليكون بمثابة حافلة

الخطوة 2: CAN (شبكة منطقة التحكم)

CAN (شبكة منطقة التحكم)
CAN (شبكة منطقة التحكم)
  • تم تطويره بواسطة Robert Bosch GmbH في الثمانينيات لخدمة صناعة السيارات.
  • لقد أصبح منتشرًا على مر السنين بسبب متانته ومرونته في التنفيذ. يتم استخدامه مع المعدات العسكرية والآلات الزراعية والأتمتة الصناعية والمباني والروبوتات والمعدات الطبية.

الخطوة 3: هل - الميزات

يمكن - الميزات
يمكن - الميزات
يمكن - الميزات
يمكن - الميزات
  • اتصال تسلسلي ثنائي الأسلاك
  • 8 بايت كحد أقصى من المعلومات المفيدة لكل إطار ، مع إمكانية التجزئة
  • العنوان الموجه إلى الرسالة وليس إلى العقدة
  • تحديد الأولوية للرسائل وترحيل الرسائل "المعلقة"
  • القدرة الفعالة على الكشف عن الأخطاء والإشارة إليها
  • القدرة متعددة الماجستير (يمكن لجميع العقد طلب الوصول إلى الناقل)
  • إمكانية الإرسال المتعدد (رسالة واحدة لأجهزة استقبال متعددة في نفس الوقت)
  • معدلات نقل تصل إلى 1 ميجابت / ثانية في حافلة طولها 40 مترًا (تقليل المعدل مع زيادة طول القضبان)
  • مرونة تكوين وإدخال عقد جديدة (حتى 120 عقدة لكل ناقل)
  • الأجهزة القياسية ، والتكلفة المنخفضة ، والتوافر الجيد
  • البروتوكول المنظم: ISO 11898

الخطوة 4: الدائرة المستخدمة

الدائرة المستخدمة
الدائرة المستخدمة

هنا ، لدي أجهزة الإرسال والاستقبال. يوجد واحد على كل جانب ، وهما متصلان بواسطة زوج من الأسلاك. أحدهما مسؤول عن الإرسال والآخر عن استقبال البيانات.

الخطوة 5: جهد خط النقل (الكشف التفاضلي)

جهد خط النقل (الكشف التفاضلي)
جهد خط النقل (الكشف التفاضلي)

في CAN ، البتة السائدة هي الصفر.

الكشف التفاضلي للخط يقلل من حساسية الضوضاء (EFI)

الخطوة 6: هل المعايير وتنسيق الإطارات

هل المعايير وتنسيق الإطارات
هل المعايير وتنسيق الإطارات

تنسيق قياسي مع معرف 11 بت

الخطوة 7: معايير CAN وتنسيق الإطارات

هل المعايير وتنسيق الإطارات
هل المعايير وتنسيق الإطارات

تنسيق موسع مع معرف 29 بت

الخطوة 8: هل المعايير وتنسيق الإطارات

من المهم ملاحظة أن البروتوكول يحسب بالفعل CRC ويرسل إشارات ACK و EOF ، وهي أشياء تم تنفيذها بالفعل بواسطة بروتوكول CAN. هذا يضمن أن الرسالة المرسلة لن تصل بالطريقة الخاطئة. هذا لأنه إذا أعطى مشكلة في CRC (الفحص الدوري الزائد أو التحقق من التكرار) ، وهو نفس رقم التحقق من المعلومات ، فسيتم تحديده بواسطة CRC.

الخطوة 9: أربعة أنواع من الإطارات (الإطارات)

أربعة أنواع من الإطارات (الإطارات)
أربعة أنواع من الإطارات (الإطارات)

من المهم ملاحظة أن البروتوكول يحسب بالفعل CRC ويرسل إشارات ACK و EOF ، وهي أشياء تم تنفيذها بالفعل بواسطة بروتوكول CAN. هذا يضمن أن الرسالة المرسلة لن تصل بالطريقة الخاطئة. هذا لأنه إذا أعطى مشكلة في CRC (الفحص الدوري الزائد أو التحقق من التكرار) ، وهو نفس رقم التحقق من المعلومات ، فسيتم تحديده بواسطة CRC.

أربعة أنواع من الإطارات (الإطارات)

يعتمد إرسال واستقبال البيانات في CAN على أربعة أنواع من الإطارات. سيتم تحديد أنواع الإطارات من خلال الاختلافات في بتات التحكم أو حتى عن طريق التغييرات في قواعد كتابة الإطار لكل حالة.

  • إطار البيانات: يحتوي على بيانات جهاز الإرسال لجهاز الاستقبال (أجهزة)
  • الإطار البعيد: هذا طلب للحصول على بيانات من إحدى العقد
  • إطار الخطأ: هو إطار يتم إرساله بواسطة أي من العقد عند تحديد خطأ في الناقل ويمكن اكتشافه بواسطة جميع العقد
  • إطار التحميل الزائد: يعمل على تأخير حركة المرور على الحافلة بسبب التحميل الزائد للبيانات أو التأخير في عقده واحده أو أكثر.

الخطوة 10: الدائرة - تفاصيل التوصيلات

الدائرة - تفاصيل التوصيلات
الدائرة - تفاصيل التوصيلات

الخطوة 11: الدائرة - التقاط البيانات

الدائرة - التقاط البيانات
الدائرة - التقاط البيانات

تم الحصول على أطوال موجية لـ CAN القياسي بمعرف 11 بت

الخطوة 12: الدائرة - التقاط البيانات

الدائرة - التقاط البيانات
الدائرة - التقاط البيانات

الأطوال الموجية التي تم الحصول عليها من أجل CAN الممتد مع معرف 29 بت

الخطوة 13: الدائرة - التقاط البيانات

الدائرة - التقاط البيانات
الدائرة - التقاط البيانات

البيانات التي حصل عليها محلل المنطق

الخطوة 14: مكتبة Arduino - CAN

مكتبة اردوينو - CAN
مكتبة اردوينو - CAN

أعرض هنا الخيارين حيث يمكنك تثبيت مكتبة CAN Driver Library

مدير مكتبة Arduino IDE

الخطوة 15: جيثب

جيثب
جيثب

github.com/sandeepmistry/arduino-CAN

الخطوة 16: كود مصدر جهاز الإرسال

كود المصدر: يشمل والإعداد ()

سنقوم بتضمين مكتبة CAN ، ونبدأ المسلسل لتصحيح الأخطاء ، ونبدأ ناقل CAN بسرعة 500 كيلوبت في الثانية.

#include // Inclui a biblioteca CAN void setup () {Serial.begin (9600)؛ // inicia a متسلسل par debug while (! Serial)؛ Serial.println ("Transmissor CAN") ؛ // Inicia o barramento Can a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN") ؛ // caso não seja posível iniciar o controlador while (1) ؛ }}

الخطوة 17: كود المصدر: Loop () ، إرسال حزمة CAN 2.0 قياسية

باستخدام معيار CAN 2.0 ، نرسل حزمة. يحدد معرف 11 بت الرسالة. يجب أن يصل حجم كتلة البيانات إلى 8 بايت. يبدأ الحزمة مع المعرف 18 بالنظام الست عشري. يحزم 5 بايت ويغلق الوظيفة.

الحلقة الفارغة () {// Usando o CAN 2.0 padrão // Envia um pacote: o id tem 11 bits e Identifica a mensagem (Prioridade، evento) // o bloco de dados deve occuir até 8 bytes Serial.println ("Enviando pacote … ") ؛ CAN.beginPacket (0x12) ، // id 18 em 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: كود المصدر: Loop () ، إرسال حزمة Extended CAN 2.0

في هذه الخطوة ، يحتوي المعرف على 29 بت. يبدأ في إرسال 24 بت من المعرف ، ومرة أخرى ، حزم 5 بايت وإنهاء.

// Usando CAN 2.0 Estendido // Envia um pacote: o id tem 29 bits e Identifica a mensagem (premidade، evento) // o bloco de dados deve impluir 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 متسلسل par debug while (! Serial)؛ Serial.println ("علبة المستقبل") ؛ // Inicia o barramento Can a 500 kbps if (! CAN.begin (500E3)) {Serial.println ("Falha ao iniciar o controlador CAN") ؛ // caso não seja posível iniciar o controlador while (1) ؛ }}

الخطوة 20: كود المصدر: Loop () ، الحصول على الحزمة والتحقق من التنسيق

حاولنا التحقق من حجم الحزمة المستلمة. توضح طريقة CAN.parsePacket () حجم هذه الحزمة. لذلك إذا كانت لدينا حزمة ، فسوف نتحقق مما إذا كانت قد تم تمديدها أم لا.

حلقة فارغة () {// Tenta verificar o tamanho do acote recebido int packetSize = CAN.parsePacket () ؛ if (packetSize) {// Se temos um pacote Serial.println ("Recebido pacote.") ؛ if (CAN.packetExtended ()) {// verifica se o pacote é estendido Serial.println ("Estendido") ؛ }

الخطوة 21: المصدر: Loop () ، يتحقق لمعرفة ما إذا كانت حزمة بعيدة

هنا ، نتحقق مما إذا كانت الحزمة المستلمة عبارة عن طلب بيانات. في هذه الحالة ، لا توجد بيانات.

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

الخطوة 22: كود المصدر: Loop () ، طول البيانات المطلوبة أو المستلمة

إذا كانت الحزمة المستلمة طلبًا ، فإننا نشير إلى الطول المطلوب. ثم نحصل على رمز طول البيانات (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 ()) ؛ // getem o DLC (رمز طول البيانات، que indica o comprimento dos dados)} else {Serial.print ("e comprimento")؛ // aqui somente indica o comprimento recebido Serial.println (packetSize) ؛

الخطوة 23: كود المصدر: Loop () ، إذا تم استلام البيانات ، فسيتم طباعتها بعد ذلك

نقوم بطباعة البيانات (على الشاشة التسلسلية) ، ولكن فقط إذا لم تكن الحزمة المستلمة طلبًا.

// 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: قم بتنزيل الملفات

بي دي إف

انا لا

موصى به: