
إن حافلة CAN نفسها تستخدم بالفعل كثيرًا ، فأنا مهتم باستخدامها في السيارة ، رغم أن هذه المنطقة لا يمكن أن تكون محدودة. خاصة قبل عامين ظهرت هذه الفرصة. نظرت إلى المواصفات العامة - يبدو أنه لا يوجد شيء معقد للغاية. نظرت إلى البرامج الموجودة على الإنترنت - ولم يعجبني أي منها ، كان كل منها يفتقر إلى شيء بدا لي ضروريًا في ذلك الوقت. سوف أعيد اختراع دراجتي. أنا جعل بلدي CAN الشم أكثر تحت خفض.
CAN حافلة
وصف التفاصيل الفنية للحافلة CAN بالتفصيل هو جزء من الوثائق. في هذا المقال ، يكفي أن نعرف أنه:
- لديه اتصال فعلي من سلكين
- هناك معدلات البيانات المختلفة
- تتوفر بالفعل رقائق جاهزة الصنع وألواح جاهزة مع أجزاء ملحومة
بعد التقليب عبر صفحات أحد المتاجر الشهيرة على الإنترنت من المملكة الوسطى ، طلبت العديد من الخيارات المختلفة للدروع وذهبت إلى دراسة ميزات الإشارات الكهربائية في السيارة. كانت السيارة التجريبية هي LADA Kalina Cross مع المحرك 127 ووحدة التحكم الإلكترونية ITELMA M74.5 CAN.
أقوم بتوصيل موصل التشخيص OBD (السنين 6 و 14) وإلقاء نظرة على مرسمة الذبذبات الموجودة هناك. بعد تشغيل مفتاح الإشعال ، تبدأ الحزم بسعة تصل إلى 2.5 فولت ، وأوقف مؤقتًا على مرسمة الذبذبات وألقي نظرة على الحزمة.
البتات البداية والإيقاف ملحوظة ، بعض البيانات في الحزمة. في ذلك الوقت كنت أعرف بالفعل أن معدل نقل البيانات كان من المتوقع أن يكون 500 كيلوبت / ثانية ، وهو الأكثر تكرارًا في حافلة CAN للمحرك. مدة الحزمة حوالي 230 ands وقبل الحزمة هناك وقفة كبيرة إلى حد ما في نقل البيانات. أقيس الوقت وأرى ثلاث عبوات وتوقف مؤقتًا بينهما.
إذا أضفنا مدة نقل البيانات والإيقاف المؤقت بين الحزم ، اتضح أن نقل جزء واحد من البيانات يستغرق حوالي 1 مللي ثانية.
لماذا أستنتج كل هذا؟ والسؤال عملي بحت: هل هناك ما يكفي من سرعة المنفذ التسلسلي لنقل جميع البيانات؟ وبناءً على ما رأيناه ، يمكننا أن نستنتج أن سرعة 500 كيلوبت / ثانية تتطور داخل الحزمة ، والتي تستغرق حوالي ربع وقت الإرسال. وبالتالي فإن متوسط معدل النقل يكون أقل أربع مرات. في ذلك الوقت ، ما زلت لا أمتلك أي اختبارات لسرعة واجهة Arduino التسلسلية ، ويمكنني أن أقول أنه حتى مع وجود محول Serial to USB CH340 الأكثر شيوعًا ، فإن سرعة 2 ميغابت في الثانية تعمل بثبات.
يمكن الماسح الضوئي على اردوينو
وصل الدرع الأول لاردوينو UNO الكلاسيكية. نعم ، إنها تكلف أكثر بكثير من نظيراتها الأصغر ، لكنها تحتوي على كل ما تحتاجه وحتى زرين.
لقد بدأت معه جميع التجارب معه. تم تجميع دائرة بسيطة مع هذا الدرع وشاشة بلورية سائلة ذات سطرين. كان الهدف هو عرض بعض البيانات على الشاشة على الأقل. قمت بالفرز بين المكتبات المختلفة للعمل مع حافلة CAN في Arduino (سأقول على الفور أن المكتبة الصحيحة والعمل تسمى CAN-BUS Shield بواسطة Seeed Studio مع ملف الرأس mcp_can.h) ، قمت بتغيير مرنان الكوارتز على الدرع 16 MHz (كان في الأصل 8 ميغاهيرتز) - لم يكن هناك بيانات.
يتم تثبيت حلقتين صغيرتين على الدرع: وحدة تحكم ناقل CAN MCP2515 وسائق ناقل CAN TJA1050. بعد قراءة الوثائق والمنتديات المختلفة ، قررت تغيير TJA1050 إلى برنامج تشغيل أساسي أكثر MCP2551 وظهرت البيانات. ربما كان TJA1050 معطلًا في البداية ، لأنه كان من الصعب جدًا ارتكاب خطأ في توصيله بسلكين ، بالإضافة إلى ذلك ، استخدمت موصلات OBD و DB9 للاتصال.
في غضون ساعتين ، تم كتابة ماسح ضوئي CAN بسيط ، يعرض عدد الحزمة التي تم التقاطها ومعرفها وما يصل إلى 8 بايت من البيانات لهذه الحزمة على شاشة LCD.
هذا هو المكان الذي كانت فيه الأزرار الموجودة على الدرع في متناول يدي ، والتي كنت للتبديل بين عدد الحزمة المعروضة.
حول الأزراربشكل عام ، أصبحت هذه الأزرار في متناول يدي لكثير من الأشياء. لقد بدأت معهم اختبار التحكم في بعض أجهزة السيارة.
وضعت بداية ، يجب أن ننتقل إلى تنفيذ أكثر إثارة للاهتمام.
يمكن شم على اردوينو
كانت المهمة بسيطة للغاية:
- قبول الحزمة من الحافلة CAN
- نضع البيانات الواردة في هيكلنا
- إرسال هيكل من خلال المنفذ التسلسلي
لم أر أي مشاكل مع أول مهمتين. قدمت المكتبة مقاطعة عند تلقي حزمة البيانات التالية والوظائف المناسبة لتلقي البيانات. لكنني قررت إرسال البيانات إلى الكمبيوتر عبر مكتبة CyberLib ، مما يلغي بعض النفقات العامة لمنصة Arduino بأكملها ، نظرًا لأنه يمكنك إلغاء تحميل المعالج قليلاً لمعالجة البيانات. في وقت لاحق ، تم التخلي عن هذه المكتبة.
من أجل إرسال البيانات بشكل صحيح لتتم معالجتها على جانب الكمبيوتر ، يتم إدخال بادئة من أربع بايت 0xAA55AA55 في الدفق قبل كل قطعة من البيانات التالية (لسبب ما ، تم تذكير هذه البايتات لآخر وحدتي بايت من قطاع التمهيد DOS ، كانت فقط بترتيب مختلف). المنطق هو هذا:
- يقرأ الكمبيوتر الدفق بأكمله من المنفذ التسلسلي ويعثر على تسلسل البادئة المطلوب 0xAA55AA55 فيه
- مباشرة بعد البادئة سيكون هناك 4 بايت من معرف الحزمة
- مزيد من طول البيانات من هذه الحزمة ، فإنه يتحكم في طول الحزمة بأكملها
- ما يصل إلى 8 بايت من البيانات
على هذا ، تم إكمال جزء البرنامج في Arduino ، في ذلك الوقت. في وقت لاحق تم إعادة بنائه بشكل كبير ، لكن المفهوم العام لم يتغير.
لقد كتبت أيضًا مولدًا بسيطًا من حزم البيانات لتصحيح الأخطاء في المنزل - فهو ببساطة يرسل حزمًا تحتوي على بيانات عشوائية إلى المنفذ التسلسلي ، مما يتيح لك تصحيح التطبيق على جهاز الكمبيوتر الخاص بك في ظروف مريحة.
في نفس الوقت تقريبًا ، وصلت المكونات الأصغر لدرع Arduino Nano و Mini CAN.
لقد قمت بتصميم حقيبة صغيرة ، وقمت بطباعتها ووضع جميع المكونات في الداخل.
في الخارج ، يوجد موصل OBD على جانب واحد و USB صغير على الجانب الآخر. داخل هناك التبديل للمقاوم إنهاء.
يمكن شم على جهاز الكمبيوتر باستخدام wxWidgets
لقد رسمت مخططًا بسيطًا لأحد البرامج في C # ، والذي يعرض البيانات المستلمة في الشبكة. وذهب للتحقق في السيارة. أنا لم أذهب مع الكمبيوتر المحمول ، لأن بطاريته أمرتني بالعيش لفترة طويلة واستخدمت ككمبيوتر ثابت ، لكنني أخذت نتبووك مع معالج ضعيف جدًا. ما رأيته ... لم أر شيئًا. كلا النوى محمل 100٪ ، واجهة التطبيق لا تستجيب. ولكن على جهاز الكمبيوتر الخاص بي ، والذي لا يزال أسرع بكثير من نتبووك ، مع مولد الحزمة العشوائية التطبيق يعمل بشكل جيد وعرض البيانات. من هذا ، خلصت إلى أن النظام الأساسي .NET على أجهزة الكمبيوتر الضعيفة لن يعمل من أجلي ، لأنني لم أستطع التصحيح في هذا المجال في ذلك الوقت إلا مع هذا النت بوك.
في وقت سابق ، استخدمت مكتبة wxWidgets في العديد من المشاريع ولدي تجربة ممتعة عنها فقط. إنها خفيفة الوزن ، ليست هناك حاجة لسحب العديد من المكتبات معها ، وحتى عبر الأنظمة الأساسية ، مما يعطينا الأمل في إمكانية نقل جزء الواجهة من الشفرة دون إجراء تعديلات كبيرة على الأنظمة الأساسية الأخرى. في نهاية المقال ، سيكون هناك رابط للبرنامج المترجم ، إذا لم تكن هناك رغبة في الاهتمام بكل هذا.
كيفية تثبيت وتجميع wxWidgets لبرنامج Visual Studioتركيب وتجميع1. قم بتنزيل Windows Installer
wxWidgets وتثبيت ، على سبيل المثال ، في المجلد C: \ wxWidgets
2. إنشاء متغير بيئة:
WXWIN = C: \ wxWidgets
3. قم بتشغيل موجه أوامر Visual Studio وانتقل إلى الدليل:
٪ WXWIN٪ \ build \ msw
4. اكتب اثنين من الأوامر لتجميع:
nmake / f makefile.vc BUILD = تصحيح RUNTIME_LIBS = ثابت
nmake / f makefile.vc BUILD = حرر RUNTIME_LIBS = ثابت
إعداد مشروع في Visual Studio1. في Visual Studio ، إنشاء مشروع Win32 ، مع المعلمة مشروع فارغ.
2. في خصائص المشروع لكل التكوين ، حدد المسارات في قسم دلائل VC ++:
تضمين الدلائل:
$ (WXWIN) \ include
$ (WXWIN) \ include \ msvc
دلائل المكتبة:
$ (WXWIN) \ lib \ vc_lib
3. في قسم C / C ++ - إنشاء الشفرة ، قم بتغيير:
مكتبة وقت التشغيل لـ Debug: / MTd التكوين
مكتبة وقت التشغيل لتكوين الإصدار: / MT
4. في القسم العام ، قم بتغيير:
مجموعة الأحرف: استخدم Unicode Character Set
5. لإضافة رمز إلى ملف exe ، تحتاج إلى إضافة ملف مورد بالمحتويات التالية:
# include "wx \ msw \ wx.rc"
رمز wxicon app_icon.ico
6. بالإضافة إلى ذلك ، إذا كنت بحاجة إلى استخدام UAC ، في قسم Linker - Manifest File:
مستوى تنفيذ UAC: requireAdministrator
أظهر النموذج الأولي الذي تم تنفيذه في C ++ و wxWidgets أنه حتى netbook يتواءم مع عرض البيانات في جدول ، وبدأت في تطوير ما خططت له.
معماريا ، يتكون البرنامج من دفقين: واجهة وتدفق العمل مع منفذ تسلسلي. تم تطبيق أي خوارزميات مثيرة للاهتمام بشكل لا يصدق. تم التعليق على الكود بعناية ويجب أن يكون واضحًا ومباشرًا. رابط للمصدر سيكون في نهاية المقال.
أول ما تم القيام به هو تلوين خلايا البيانات في الجدول وفقًا للحد من الحصول على هذه البيانات. في النموذج الأولي الأول ، نظرًا إلى 17 سطرًا من البيانات ذات القيم المتغيرة باستمرار ، أدركت أنه من الضروري التمييز بطريقة أو بأخرى بين البيانات الجديدة والبيانات التي لا تتغير أو نادراً ما تتغير. قام بعمل تلوين على مرحلتين:
- يتم تمييز البيانات لأول مرة في خلفية الخلية الخضراء
- يتم تمييز البيانات التي تصل مرارًا وتكرارًا بخلفية حمراء ، تتلاشى تدريجياً إلى اللون الأبيض إذا لم تتغير هذه البيانات بعد الآن
أصبح من الواضح فورًا الخلايا التي لم تستخدم على الإطلاق ، أي الخلايا تحتوي على إشارات مضادة. البحث عن القيم المتغيرة للاهتمام مبسطة إلى حد كبير. فيما يلي ، جميع الصور المتحركة. إذا لم تعمل الرسوم المتحركة في المقالة (في بعض متصفحات الجوال) - انقر فوق الصورة لفتح الإصدار الكامل للرسوم المتحركة.
ثم أردت التحقق مما إذا كان المنفذ التسلسلي يتواءم مع دفق البيانات. للقيام بذلك ، من جانب Arduino ، أضفت عدادات لعدد الحزم المستلمة وعداد البايت في الحزمة. يتم إرسال هذه العدادات إلى الكمبيوتر في حزمة ذات المعرف 0x000. عند تلقي هذه البيانات ، لا يعرضها البرنامج في جدول ، لكنه يعرضها في حقول معلومات منفصلة في الأعلى. كانت النتائج ممتعة للغاية. في المتوسط ، يتم استلام ما يصل إلى 750 حزمة / ثانية بسرعة تصل إلى 9.5 كيلو بايت / ثانية ، وهذا في المنطقة يصل إلى 80 كيلو بايت / ثانية ، وهو قادر تمامًا على منفذ تسلسلي. ولكن على الرغم من ذلك ، يتم تكوين تبادل البيانات افتراضيًا بسرعة 500 كيلوبت في الثانية ، حتى يصبح أفضل.
ظهرت إضافة القدرة على كتابة البيانات إلى السجل بعد أن قمت بتوصيل محول التشخيص ELM327 بالتوازي مع واجهة OBD وتوصيلها بالهاتف ، وحاولت قراءة البيانات المختلفة. ركضت البيانات بسرعة بحيث كان من المستحيل رؤيتها. بعد تسجيل كل هذا في مجلة ، يمكنك بعد ذلك الجلوس بهدوء ومشاهدة البيانات المرسلة. للقيام بذلك ، يمكن كتابة حتى البيانات النصية ASCII إلى السجل. يمكنك أيضًا تحديد نوع الملف وحرف المحدد وتكوين مرشح الحزمة من خلال النقر على معرف الحزمة المحدد في الجدول والنقر فوق الزر "إضافة معرف للتصفية" (بشكل افتراضي ، تتم كتابة جميع البيانات) إذا كانت جميع البيانات مكتوبة.
بعد ذلك تحقق الإدراك أن جميع تطبيقات الهاتف التي تؤدي جميع أنواع "التشخيصات" من خلال الرابط ELM327 والهاتف لا تتصل مباشرة مع حافلة CAN للسيارة. إنهم يستخدمون فقط وظيفة التشخيص OBD عبر حافلة CAN عن طريق الوصول إلى معرف CAN 0x7E0. عادة ما يكون هذا هو عنوان وحدة التحكم في المحرك (ECU) ، والإجابة منه تأتي في حزمة ذات المعرف 0x7E8. ولكن جميع حزم البيانات الأخرى هي ما يسمى Vendor Specific ولن يقوم أي مصنع بفتحها ببساطة (على الرغم من وجود مثال:
أصدرت فورد SDK لسياراتها ).
متابعة لدراسة ما يتم نقله في هذه الحزم ، توصلت إلى فكرة أخرى: عندما أقوم بالنقر فوق خلية في الجدول ، في نافذة البرنامج على اليمين ، اعرض القيمة الثنائية والعشرية لهذه البايتة ، وكذلك أخذ البايتة التالية وأضفها إلى الكلمة. بعد ذلك ، اضرب هذه الكلمة بمعامل معين واحصل على نتيجة عشرية. لا يبدو الأمر واضحًا جدًا ، ولكن فيما يتعلق بما تم القيام به: تأتي سرعة المحرك في علبة CAN ID 0x180 ، في أول وحدتي بايت. يعطي هذان البايتان كلمة معينة تتناسب مع المنعطفات. إذا تم تقسيم معنى هذه الكلمة إلى 8 ، فسيتم الحصول على الزخم الحالي. لذلك ، يشار إلى عامل 0.125 ، حيث أن المعامل المتبادل هو 8. ثم ، يتم تصور هذه الكلمة في رسم بياني مع ضبط ديناميكي في السعة. من حيث المبدأ ، يمكن البحث عن المضاعف بترتيب عكسي: لقد وجدت خلايا متشابهة جدًا مع سرعة المحرك أو أي شيء آخر وفقًا للجدول الزمني ، وبعد ذلك يتم ضبط المضاعف للحصول على قيم حقيقية.

حسنًا ، يتيح لك التمثيل الثنائي البحث عن مؤشرات البت المختلفة. على سبيل المثال ، يتم تقليل البحث عن مؤشرات مؤشر الاتجاه إلى تشغيلها ومراقبة أي خلية تبدأ في التغير ، في المثال التالي ، يمكن أن يكون معرف 0x481 بايت 2. بعد ذلك ، يعرض النقر فوق الخلية القيمة الثنائية في الحقل المقابل ، حيث يكون التبديل بين مؤشرين السفليين مرئيًا بالفعل بت (اليسار واليمين ، وإذا كان معا - إنذار).
وأخيراً ، كنت بحاجة لإرسال بعض بيانات التحكم إلى ناقل CAN ومشاهدة رد الفعل على هذه الأوامر. تمت إضافة رمز إلى برنامج Arduino الذي يستقبل البيانات من الكمبيوتر وينقلها إلى حافلة CAN. في هذه المرحلة ، تم التخلي عن CyberLib ، حيث لم يكن لديه دعم لمقاطعة استلام البيانات في المخزن المؤقت للمنفذ التسلسلي. في البرنامج على الكمبيوتر ، أضفت عدة حقول نصية يمكنك من خلالها إدخال العديد من المعلمات وجدول لعرض استجابة المشغل. يوضح المثال أدناه أن أوامر التحكم تمكن / تقوم بتعطيل السرعة الأولى لمروحة التبريد (0x0A) وتمكين / تعطيل قابض مكيف الهواء (0x0B).

يؤدي
لا يوجد مكان تقريبًا لإيجاد فك تشفير كامل لبيانات الشركات المصنعة ، وخاصة البيانات الرسمية. في أفضل الأحوال ، سيكون البحث عن شخص آخر في إطار تنفيذ بعض الوظائف الإضافية. CAN يمكن الشم مساعدتك في العثور على هذه البيانات. تمكنت من العثور على حوالي 40 معلمة مختلفة من السيارة ومن أجل التجربة ، وعلى أساس البيانات ، قمت بالتحكم في مروحة التبريد الخاصة بي.
آمل أن يكون كل هذا مفيدًا ليس لي فقط.