- مقدمة إلى CAN
- مقارنة CAN عبر SPI و I2C
- تطبيقات بروتوكول CAN
- كيفية استخدام بروتوكول CAN في Arduino
- المكونات مطلوبة
- مخطط الرسم البياني
- الاتصال بين وحدتي MCP2515 CAN
- برمجة Arduino لاتصالات CAN
- شرح الكود الجانبي لجهاز الإرسال (اردوينو نانو)
- شرح الكود الجانبي لجهاز الاستقبال (Arduino UNO)
- عمل اتصالات CAN في اردوينو
تتكون أي سيارة متوسطة اليوم من حوالي 60 إلى 100 وحدة استشعار فيها لاستشعار وتبادل المعلومات. نظرًا لأن مصنعي السيارات يجعلون سياراتهم أكثر ذكاءً باستمرار مع ميزات مثل القيادة الذاتية ونظام الوسادة الهوائية ومراقبة ضغط الإطارات ونظام التحكم في السرعة وما إلى ذلك ، فمن المتوقع أن يرتفع هذا الرقم فقط. على عكس أجهزة الاستشعار الأخرى ، تعالج هذه المستشعرات المعلومات الهامة ، وبالتالي يجب توصيل البيانات من هذه المستشعرات باستخدام بروتوكولات الاتصال القياسية للسيارات. على سبيل المثال ، تعد بيانات نظام التحكم في التطواف مثل السرعة وموضع الخانق وما إلى ذلك قيمًا حيوية يتم إرسالها إلى وحدة التحكم الإلكترونية (ECU)لتحديد مستوى تسارع السيارة ، قد يؤدي سوء الاتصال أو فقدان البيانات هنا إلى إخفاقات فادحة. وبالتالي ، على عكس بروتوكولات الاتصال القياسية مثل UART أو SPI أو I2C ، يستخدم المصممون بروتوكولات اتصالات سيارات موثوقة للغاية مثل LIN و CAN و FlexRay وما إلى ذلك.
من بين جميع البروتوكولات المتاحة CAN أكثر استخدامًا وشعبية. لقد ناقشنا بالفعل ما هو CAN وكيف يعمل. لذلك ، في هذه المقالة سوف ننظر في الأساسيات مرة أخرى ، ثم في النهاية سنقوم أيضًا بتبادل البيانات بين جهازي Arduinos باستخدام اتصال CAN. تبدو مثيرة للاهتمام حق! اذا هيا بنا نبدأ.
مقدمة إلى CAN
CAN aka Controller Area Network عبارة عن ناقل اتصالات تسلسلي مصمم للتطبيقات الصناعية والسيارات. إنه بروتوكول قائم على الرسائل يستخدم للاتصال بين أجهزة متعددة. عندما يتم توصيل العديد من أجهزة CAN معًا كما هو موضح أدناه ، فإن الاتصال يشكل شبكة تعمل مثل نظامنا العصبي المركزي مما يسمح لأي جهاز بالتحدث مع أي جهاز آخر في العقدة.
A شبكة CAN سوف تتكون من اثنين فقط من الأسلاك CAN عالية، ويمكن منخفضة لنقل البيانات ثنائية الاتجاه كما هو مبين أعلاه. عادةً ما تتراوح سرعة الاتصال لشبكة CAN من 50 كيلوبت في الثانية إلى 1 ميغابت في الثانية ويمكن أن تتراوح المسافة من 40 مترًا بسرعة 1 ميغابت في الثانية إلى 1000 متر بسرعة 50 كيلوبت في الثانية.
تنسيق رسالة CAN:
في اتصال CAN ، يتم نقل البيانات في الشبكة كتنسيق رسالة معين. يحتوي تنسيق الرسالة هذا على العديد من المقاطع ، لكن قسمين رئيسيين هما المعرف والبيانات التي تساعد في إرسال الرسائل والرد عليها في ناقل CAN.
المعرف أو معرف CAN: يُعرف المعرف أيضًا باسم معرف CAN أو يُعرف أيضًا باسم PGN (رقم مجموعة المعلمات). يتم استخدامه لتحديد أجهزة CAN الموجودة في شبكة CAN. طول المعرّف هو إما 11 أو 29 بتة بناءً على نوع بروتوكول CAN المستخدم.
علبة قياسية: 0-2047 (11 بت)
تمديد CAN: 0-2 29 -1 (29 بت)
البيانات: هذه هي بيانات المستشعر / التحكم الفعلية التي يجب إرسالها من جهاز إلى آخر. يمكن أن يتراوح طول بيانات الحجم من 0 إلى 8 بايت.
رمز طول البيانات (DLC): من 0 إلى 8 لعدد بايتات البيانات الموجودة.
الأسلاك المستخدمة في CAN:
يتكون بروتوكول CAN من سلكين هما CAN_H و CAN_L لإرسال واستقبال المعلومات. يعمل كلا السلكين كخط تفاضلي ، مما يعني أن إشارة CAN (0 أو 1) يتم تمثيلها بفرق الجهد بين CAN_L و CAN_H. إذا كان الفرق موجبًا وأكبر من حد أدنى معين للجهد ، فسيكون 1 وإذا كان الفرق سالبًا يكون 0.
عادةً ما يتم استخدام كبل زوج مجدول للاتصال CAN. يستخدم المقاوم 120 أوم بشكل عام عند طرفي شبكة CAN كما هو موضح في الصورة ، وذلك لأن الخط يحتاج إلى أن يكون متوازنًا ومرتبطًا بنفس الإمكانات.
مقارنة CAN عبر SPI و I2C
نظرًا لأننا تعلمنا بالفعل كيفية استخدام SPI مع Arduino و IIC مع Arduino ، فلنقارن ميزات SPI و I2C مع CAN
معامل | SPI | I2C | يستطيع |
سرعة | 3 ميجابت في الثانية إلى 10 ميجابت في الثانية | المعيار: 100 كيلوبت في الثانية | 10 كيلو بايت في الثانية إلى 1 ميجا بايت في الثانية يعتمد أيضًا على طول السلك المستخدم |
سريع: 400 كيلوبت في الثانية | |||
سرعة عالية: 3.4 ميجابت في الثانية | |||
نوع | متزامن | متزامن | غير متزامن |
عدد الأسلاك | 3+ (MISO، MOSI، SCK، SS1، SS2… SS (n)) | 2 أسلاك (SDA ، SCL) | 2 أسلاك (CAN_H ، CAN_L) |
دوبلكس | الازدواج الكامل | نصف المزدوجة | نصف المزدوجة |
تطبيقات بروتوكول CAN
- نظرًا لقوة وموثوقية بروتوكول CAN ، يتم استخدامها في صناعات مثل السيارات والآلات الصناعية والزراعة والمعدات الطبية وما إلى ذلك.
- نظرًا لتقليل تعقيد الأسلاك في CAN ، يتم استخدامها بشكل أساسي في تطبيقات السيارات مثل السيارة.
- التكلفة المنخفضة للتنفيذ وأيضًا سعر مكونات الأجهزة أقل أيضًا.
- من السهل إضافة وإزالة أجهزة ناقل CAN.
كيفية استخدام بروتوكول CAN في Arduino
نظرًا لأن Arduino لا يحتوي على أي منفذ CAN يحمل في ثناياه عوامل ، يتم استخدام وحدة CAN تسمى MCP2515. يتم ربط وحدة CAN هذه مع Arduino باستخدام اتصال SPI. دعونا نرى المزيد حول MCP2515 بالتفصيل وكيف يتم ربطه مع Arduino.
وحدة MCP2515 CAN:
تحتوي الوحدة النمطية MCP2515 على وحدة تحكم CAN MCP2515 وهي جهاز إرسال واستقبال عالي السرعة. يتم الاتصال بين MCP2515 و MCU من خلال SPI. لذلك ، من السهل التفاعل مع أي متحكم يحتوي على واجهة SPI.
بالنسبة للمبتدئين الذين يرغبون في تعلم CAN Bus ، ستكون هذه الوحدة بمثابة بداية جيدة. تعتبر لوحة CAN SPI هذه مثالية للأتمتة الصناعية والأتمتة المنزلية وغيرها من مشاريع السيارات المدمجة.
ميزات ومواصفات MCP2515:
- يستخدم جهاز الإرسال والاستقبال CAN عالي السرعة TJA1050
- الأبعاد: 40 × 28 مم
- التحكم SPI لتوسيع واجهة ناقل Multi CAN
- 8 ميجا هرتز الكريستال مذبذب
- 120Ω مقاومة طرفية
- لديه مفتاح مستقل ، مؤشر LED ، مؤشر طاقة
- يدعم تشغيل 1 ميجا بايت / ثانية
- عملية الاستعداد الحالية المنخفضة
- يمكن توصيل ما يصل إلى 112 عقدة
Pinout من وحدة MCP2515 CAN:
اسم الدبوس |
استعمال |
VCC |
5V إدخال الطاقة دبوس |
GND |
دبوس الأرض |
CS |
دبوس تحديد SPI SLAVE (نشط منخفض) |
وبالتالي |
SPI سيد الإدخال الرقيق يؤدي الإخراج |
SI |
SPI سيد الناتج الرقيق يؤدي الإدخال |
SCLK |
دبوس ساعة SPI |
INT |
MCP2515 المقاطعة دبوس |
في هذا البرنامج التعليمي ، دعونا نرى كيفية إرسال بيانات مستشعر الرطوبة ودرجة الحرارة (DHT11) من Arduino Nano إلى Arduino Uno عبر وحدة ناقل CAN MCP2515.
المكونات مطلوبة
- اردوينو UNO
- اردوينو نانو
- دهت 11
- شاشة LCD مقاس 16 × 2
- وحدة MCP2515 CAN -2
- 10 كيلو الجهد
- اللوح
- توصيل الأسلاك
مخطط الرسم البياني
الاتصال على جانب جهاز الإرسال CAN:
مكون - دبوس |
اردوينو نانو |
MPC2515 - VCC |
+ 5 فولت |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - سو |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
د 2 |
DHT11 - VCC |
+ 5 فولت |
DHT11 - GND |
GND |
DHT11 - خارج |
أ 0 |
اتصالات الدائرة في جانب جهاز الاستقبال CAN:
مكون - دبوس |
اردوينو UNO |
MPC2515 - VCC |
+ 5 فولت |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - سو |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
شاشات الكريستال السائل - VSS |
GND |
شاشات الكريستال السائل - VDD |
+ 5 فولت |
شاشات الكريستال السائل - V0.0 |
إلى 10K Potentiometer Center PIN |
ال سي دي - RS |
3 |
LCD - RW |
GND |
شاشات الكريستال السائل - E. |
4 |
شاشة LCD - D4 |
5 |
شاشة LCD - D5 |
6 |
شاشة LCD - D6 |
7 |
شاشة LCD - D7 |
8 |
LCD - أ |
+ 5 فولت |
LCD - ك |
GND |
الاتصال بين وحدتي MCP2515 CAN
H - يمكن عالية
لام - يمكن منخفضة
MCP2515 (اردوينو نانو) |
MCP2515 (اردوينو UNO) |
ح |
ح |
إل |
إل |
بمجرد إجراء جميع الاتصالات ، بدا أجهزتي كما يلي
برمجة Arduino لاتصالات CAN
أولاً ، يتعين علينا تثبيت مكتبة لـ CAN في Arduino IDE. يصبح التفاعل بين وحدة MCP2515 CAN مع Arduino أسهل باستخدام المكتبة التالية.
- قم بتنزيل ملف ZIP الخاص بمكتبة Arduino CAN MCP2515.
- من Arduino IDE: Sketch -> Include Library -> Add.ZIP Library
في هذا البرنامج التعليمي ، يتم تقسيم الترميز إلى جزأين أحدهما كرمز جهاز إرسال CAN (Arduino Nano) والآخر كرمز CAN Receiver (Arduino UNO) ، وكلاهما يمكن العثور عليهما في أسفل هذه الصفحة. تفسير ذلك على النحو التالي.
قبل كتابة برنامج لإرسال البيانات واستلامها ، تأكد من تثبيت المكتبة باتباع الخطوات المذكورة أعلاه ويتم تهيئة وحدة CAN MCP2515 في برنامجك على النحو التالي.
تهيئة وحدة MCP2515 CAN:
لإنشاء اتصال بـ MCP2515 ، اتبع الخطوات:
1. قم بتعيين رقم التعريف الشخصي حيث يتم توصيل SPI CS (10 افتراضيًا)
MCP2515 mcp2515 (10) ؛
2. ضبط معدل الباود وتردد المذبذب
mcp2515.setBitrate (CAN_125KBPS ، MCP_8MHZ) ؛
أسعار الباود المتاحة:
CAN_5KBPS ، CAN_10KBPS ، CAN_20KBPS ، CAN_31K25BPS ، CAN_33KBPS ، CAN_40KBPS ، CAN_50KBPS ، CAN_80KBPS ، CAN_83K3BPS ، CAN_95KBPS ، CAN_100KBPS ، CAN_125KB_2.
السرعات المتوفرة على مدار الساعة:
MCP_20MHZ ، MCP_16MHZ ، MCP_8MHZ
3. ضبط الأوضاع.
mcp2515.setNormalMode () ، mcp2515.setLoopbackMode () ، mcp2515.setListenOnlyMode () ،
شرح الكود الجانبي لجهاز الإرسال (اردوينو نانو)
في قسم جهاز الإرسال ، واجه Arduino Nano وحدة MCP2515 CAN من خلال دبابيس SPI ويرسل DHT11 بيانات درجة الحرارة والرطوبة إلى ناقل CAN.
أولاً ، يتم تضمين المكتبات المطلوبة ، مكتبة SPI لاستخدام SPI Communication و MCP2515 Library لاستخدام CAN Communication ومكتبة DHT لاستخدام مستشعر DHT مع Arduino . لقد قمنا سابقًا بتوصيل DHT11 مع Arduino.
#تضمن
الآن تم تحديد اسم دبوس DHT11 (OUT pin) المتصل بـ A0 من Arduino Nano
#define DHTPIN A0
وأيضًا ، يتم تعريف DHTTYPE على أنه DHT11.
#define DHTTYPE DHT11
A canMsg بنية نوع البيانات لتخزين شكل رسالة CAN.
هيكل can_frame canMsg ؛
قم بتعيين رقم التعريف الشخصي حيث يتم توصيل SPI CS (10 افتراضيًا)
MCP2515 mcp2515 (10) ؛
وأيضًا ، يتم تهيئة كائن dht لفئة DHT مع دبوس DHT مع Arduino Nano ونوع DHT حيث يتم تهيئة DHT11.
DHT dht (DHTPIN ، DHTTYPE) ؛
التالي في الإعداد الباطل ():
ابدأ اتصال SPI باستخدام العبارة التالية
SPI.begin () ،
ثم استخدم العبارة أدناه لبدء تلقي قيم درجة الحرارة والرطوبة من مستشعر DHT11.
dht.begin () ،
بعد ذلك ، يتم إعادة تعيين MCP2515 باستخدام الأمر التالي
mcp2515.reset () ،
الآن تم ضبط سرعة MCP2515 على 500 كيلو بايت في الثانية و 8 ميجا هرتز على مدار الساعة
mcp2515.setBitrate (CAN_500KBPS ، MCP_8MHZ) ؛
ويتم تعيين MCP2525 في الوضع العادي
mcp2515.setNormalMode () ،
في الحلقة الفارغة ():
تحصل العبارة التالية على قيمة الرطوبة ودرجة الحرارة وتخزن في عدد صحيح متغير h و t.
int h = dht.readHumidity () ؛ int t = dht.readTemperature () ؛
التالي يعطى ID CAN كما 0x036 (حسب الاختيار) وDLC إلى 8 ونعطي بيانات ح و ر إلى البيانات و البيانات وراحة جميع البيانات مع 0.
canMsg.can_id = 0x036 ؛ canMsg.can_dlc = 8 ، canMsg.data = ح ؛ // تحديث قيمة الرطوبة في canMsg.data = t ؛ // تحديث قيمة درجة الحرارة في canMsg.data = 0x00 ؛ // استرح الكل مع 0 canMsg.data = 0x00 ؛ canMsg.data = 0x00 ؛ canMsg.data = 0x00 ؛ canMsg.data = 0x00 ؛ canMsg.data = 0x00 ؛
بعد كل شيء ، لإرسال الرسالة إلى CAN BUS ، نستخدم العبارة التالية.
mcp2515.sendMessage (& canMsg) ؛
حتى الآن يتم إرسال بيانات درجة الحرارة والرطوبة كرسالة إلى ناقل CAN.
شرح الكود الجانبي لجهاز الاستقبال (Arduino UNO)
في قسم جهاز الاستقبال ، تم توصيل Arduino UNO بشاشة MCP2515 و 16x2 LCD. هنا يستقبل Arduino UNO درجة الحرارة والرطوبة من ناقل CAN ويعرض البيانات الواردة على شاشة LCD.
أولاً ، يتم تضمين المكتبات المطلوبة ، مكتبة SPI لاستخدام SPI Communication و MCP2515 Library لاستخدام CAN Communication و LiquidCrsytal Library لاستخدام شاشة LCD مقاس 16 × 2 مع Arduino .
#تضمن
بعد ذلك ، يتم تحديد دبابيس LCD المستخدمة في الاتصال بـ Arduino UNO.
const int rs = 3 ، en = 4 ، d4 = 5 ، d5 = 6 ، d6 = 7 ، d7 = 8 ؛ LiquidCrystal LCD (rs، en، d4، d5، d6، d7) ؛
A البنية يعلن نوع البيانات لتخزين شكل رسالة CAN.
هيكل can_frame canMsg ؛
قم بتعيين رقم التعريف الشخصي حيث يتم توصيل SPI CS (10 افتراضيًا)
MCP2515 mcp2515 (10) ؛
في الإعداد باطل ():
أولاً ، يتم ضبط شاشة LCD على وضع 16x2 ويتم عرض رسالة ترحيب.
lcd.begin (16.2) ؛ lcd.setCursor (0،0) ؛ lcd.print ("CIRCUIT DIGEST") ؛ lcd.setCursor (0،1) ؛ lcd.print ("CAN ARDUINO") ؛ تأخير (3000) ؛ lcd.clear () ؛
ابدأ اتصال SPI باستخدام العبارة التالية.
SPI.begin () ،
بعد ذلك ، يتم إعادة تعيين MCP2515 باستخدام الأمر التالي.
mcp2515.reset () ،
الآن تم ضبط سرعة MCP2515 على 500 كيلو بايت في الثانية و 8 ميجا هرتز على مدار الساعة.
mcp2515.setBitrate (CAN_500KBPS ، MCP_8MHZ) ؛
ويتم تعيين MCP2525 في الوضع العادي.
mcp2515.setNormalMode () ،
التالي في الحلقة الفارغة ():
يتم استخدام العبارة التالية لتلقي الرسالة من ناقل CAN. إذا تم استلام الرسالة فإنها تدخل في حالة if .
إذا (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
في حالة إذا تم استلام البيانات وتخزينها في c anMsg ، وهي البيانات التي تحتوي على قيمة الرطوبة والبيانات التي لها قيمة درجة الحرارة. يتم تخزين كلا القيمتين في عدد صحيح x و y.
int x = canMsg.data ؛ int y = canMsg.data ؛
بعد استلام القيم ، يتم عرض قيم درجة الحرارة والرطوبة على شاشة عرض LCD مقاس 16 × 2 باستخدام العبارة التالية.
lcd.setCursor (0،0) ؛ lcd.print ("الرطوبة:") ؛ lcd.print (x) ؛ lcd.setCursor (0،1) ؛ lcd.print ("درجة الحرارة:") ؛ lcd.print (ص) ؛ تأخير (1000) ؛ lcd.clear () ؛
عمل اتصالات CAN في اردوينو
بمجرد أن يصبح الجهاز جاهزًا ، قم بتحميل البرنامج لجهاز إرسال CAN وجهاز استقبال CAN (البرامج الكاملة موضحة أدناه) في لوحات Arduino المعنية. عند التشغيل ، يجب أن تلاحظ أن قيمة درجة الحرارة التي تمت قراءتها بواسطة DHT11 سيتم إرسالها إلى Arduino آخر من خلال اتصال CAN وسيتم عرضها على شاشة LCD الخاصة بـ Arduino الثاني كما ترون في الصورة أدناه. لقد استخدمت أيضًا جهاز التحكم عن بُعد الخاص بالتيار المتردد للتحقق مما إذا كانت درجة الحرارة المعروضة على شاشة LCD قريبة من درجة حرارة الغرفة الفعلية.
يمكن العثور على العمل الكامل في الفيديو المرتبط أدناه. إذا كانت لديك أي أسئلة ، فاتركها في قسم التعليقات أو استخدم منتدياتنا لأسئلة فنية أخرى.