- RS-485 الاتصال التسلسلي
- المكونات مطلوبة
- مخطط الرسم البياني
- برمجة STM32F103C8 & Arduino UNO للاتصال التسلسلي RS485
- اختبار اتصال RS485 بين STM32F103C8 و Arduino UNO:
تعد بروتوكولات الاتصال جزءًا لا يتجزأ من الإلكترونيات الرقمية والنظام المضمن. أينما كان هناك تفاعل بين وحدات تحكم دقيقة وأجهزة طرفية متعددة ، يجب استخدام بروتوكول الاتصال من أجل تبادل مجموعة من البيانات. هناك العديد من أنواع بروتوكول الاتصال التسلسلي المتاحة. RS485 هو أحد بروتوكولات الاتصال التسلسلي ويستخدم في المشاريع الصناعية والآليات الثقيلة.
لقد تعلمنا عن RS485 Serial Communication بين Arduino Uno و Arduino Nano في البرنامج التعليمي السابق . يدور هذا البرنامج التعليمي حول استخدام اتصال تسلسلي RS-485 في متحكم STM32F103C8. إذا كنت جديدًا على STM32 Microcontroller ، فابدأ بـ Getting Started with STM32 باستخدام Arduino IDE: Blinking LED وتحقق من جميع مشاريع STM32 هنا.
في هذا البرنامج التعليمي ، يحتوي Master STM32F103C8 على ثلاثة أزرار ضغط تُستخدم للتحكم في حالة ثلاثة مصابيح LED موجودة في Slave Arduino Uno باستخدام الاتصال التسلسلي RS-485.
لنبدأ بفهم طريقة عمل الاتصال التسلسلي RS-485.
RS-485 الاتصال التسلسلي
RS-485 هو بروتوكول اتصال تسلسلي غير متزامن لا يتطلب ساعة. يستخدم تقنية تسمى الإشارة التفاضلية لنقل البيانات الثنائية من جهاز إلى آخر.
إذن ما هي طريقة نقل الإشارة التفاضلية هذه ؟؟
تعمل طريقة الإشارة التفاضلية عن طريق إنشاء جهد تفاضلي باستخدام 5 فولت موجب وسالب. وهو يوفر نصف دوبلكس الاتصال عند استخدام اثنين من الأسلاك و كامل الازدواج الاتصالات عند استخدام أربعة أسلاك.
باستخدام هذه الطريقة:
- يدعم RS-485 معدل نقل بيانات أعلى يبلغ 30 ميجابت في الثانية كحد أقصى.
- كما يوفر أقصى مسافة لنقل البيانات مقارنة ببروتوكول RS-232. ينقل البيانات حتى 1200 متر كحد أقصى.
- الميزة الرئيسية لـ RS-485 عبر RS-232 هي العبودية المتعددة مع Master واحد بينما تدعم RS-232 العبد الفردي فقط.
- يمكن أن يكون بحد أقصى 32 جهازًا متصلًا ببروتوكول RS-485.
- ميزة أخرى لـ RS-485 هي محصنة ضد الضوضاء لأنها تستخدم طريقة الإشارة التفاضلية للنقل.
- يعتبر RS-485 أسرع مقارنة ببروتوكول I2C.
يمكن توصيل وحدة RS-485 بأي متحكم يحتوي على منفذ تسلسلي. لاستخدام وحدة RS-485 مع وحدات التحكم الدقيقة ، هناك حاجة إلى وحدة تسمى 5V MAX485 TTL إلى RS485 والتي تعتمد على Maxim MAX485 IC لأنها تسمح بالاتصال التسلسلي على مسافة طويلة تصل إلى 1200 متر وهي ثنائية الاتجاه والنصف المزدوج لديه معدل نقل بيانات 2.5 ميغابت في الثانية. تتطلب هذه الوحدة جهدًا 5 فولت.
RS-485 دبوس الوصف:
اسم الدبوس |
وصف |
VCC |
5 فولت |
أ |
إدخال جهاز استقبال غير مقلوب إخراج سائق غير مقلوب |
ب |
عكس إدخال جهاز الاستقبال عكس إخراج السائق |
GND |
GND (0 فولت) |
R0 |
خرج جهاز الاستقبال (RX pin) |
إعادة |
خرج جهاز الاستقبال (تمكين منخفض) |
DE |
خرج السائق (عالي التمكين) |
دي |
مدخلات السائق (TX pin) |
تحتوي وحدة RS485 على الميزات التالية:
- جهد التشغيل: 5 فولت
- شريحة MAX485 على متن الطائرة
- انخفاض استهلاك الطاقة لاتصالات RS485
- جهاز الإرسال والاستقبال محدود السرعة
- 5.08mm الملعب 2P محطة
- أسلاك اتصالات مريحة RS-485
- يمكن التحكم في جميع دبابيس الشريحة من خلال المتحكم الدقيق
- حجم اللوح: 44 × 14 ملم
استخدام هذه الوحدة مع STM32F103C8 و Arduino UNO سهل للغاية. يتم استخدام منافذ الأجهزة التسلسلية لوحدات التحكم الدقيقة. فيما يلي المسامير التسلسلية للأجهزة في STM32 و arduino UNO.
- في STM32F103C8: دبابيس PA9 (TX) و PA10 (RX)
- في Arduino Uno: Pin 0 (RX) & 1 (TX)
البرمجة بسيطة أيضًا ، فقط استخدم Serial.print () للكتابة إلى RS-485 و Serial. اقرأ () للقراءة من RS-485 والدبابيس DE & RE لـ RS-485 مصنوعة منخفضة لتلقي البيانات وجعلها عالية إلى كتابة البيانات إلى ناقل RS-485.
المكونات مطلوبة
- STM32F103C8
- اردوينو UNO
- وحدة محول MAX485 TTL إلى RS485 - (2)
- 10 كيلو الجهد
- زر الضغط - 3
- الصمام - 3
- المقاومات
- اللوح
- توصيل الأسلاك
مخطط الرسم البياني
في هذا البرنامج التعليمي ، يتم استخدام STM32F103C8 كـ Master مع وحدة RS-485 واحدة ويتم استخدام Arduino UNO كعبد مع وحدة RS-485 أخرى.
توصيل الدائرة بين RS-485 و STM32F103C8 (رئيسي):
RS-485 |
STM32F103C8 |
دي |
PA9 (TX1) |
DE إعادة |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5 فولت |
GND |
GND |
أ |
إلى A من Slave RS-485 |
ب |
إلى B من Slave RS-485 |
STM32F103C8 بثلاثة أزرار ضغط:
ثلاثة أزرار دفع مع ثلاثة مقاومات سحب لأسفل 10 كيلو متصلة بالمسامير PA0 ، PA1 ، PA2 من STM32F103C8.
توصيل الدائرة بين RS-485 و Arduino UNO (التابع):
RS-485 |
اردوينو UNO |
دي |
1 (تكساس) |
DE إعادة |
2 |
R0 |
0 (RX) |
VCC |
5 فولت |
GND |
GND |
أ |
إلى A من Master RS-485 |
ب |
إلى B من Master RS-485 |
يتم استخدام ثلاثة مصابيح LED حيث يتم توصيل أنودات LED بمقاوم يبلغ 330 أوم بالمسامير 4 و 7 و 8 من Arduino UNO وكاثود المصابيح المتصلة بـ GND.
برمجة STM32F103C8 & Arduino UNO للاتصال التسلسلي RS485
يستخدم Arduino IDE لتطوير وبرمجة كلا المجالين ، أي STM32 و Arduino UNO. ولكن تأكد من تحديد PORT المقابل من Tools-> Port and Board من Tools-> Board. إذا وجدت أي صعوبات أو شك ، فما عليك سوى الرجوع إلى برمجة STM32 في ARDUINO IDE. تتكون البرمجة الخاصة بهذا البرنامج التعليمي من قسمين أحدهما لـ STM32F103C8 (ماجستير) والآخر لـ Arduino UNO (Slave). سيتم شرح كل من الرموز واحدة تلو الأخرى أدناه.
STM32F103C8 كسيدفي الجانب الرئيسي ، تتم قراءة حالة زر الضغط ثم كتابتها تسلسليًا هذه القيم إلى ناقل RS-485 من خلال منافذ الأجهزة التسلسلية 1 (PA9 ، PA10) في STM32F103C8. لا توجد مكتبة خارجية مطلوبة حتى الآن. يحتوي Arduino على كل المكتبة اللازمة للاتصال التسلسلي.
ابدأ الاتصال التسلسلي باستخدام الدبابيس التسلسلية للأجهزة (PA9 ، PA10) عند معدل 9600.
Serial1.begin (9600) ؛
اقرأ حالة زر الضغط عند المسامير PA0 و PA1 و PA2 لـ STM32F103C8 وقم بتخزينها في متغير button1val و button2val و button3val. تكون القيمة مرتفعة إذا تم الضغط على الزر ومنخفضة عند عدم الضغط عليه.
int button1val = digitalRead (button1) ؛ int button2val = digitalRead (button2) ؛ int button3val = digitalRead (button3) ؛
قبل إرسال قيم الزر إلى المنفذ التسلسلي ، يجب أن تكون المسامير DE & RE الخاصة بـ RS-485 عالية المتصلة بالطرف PA3 الخاص بـ STM32F103C8 (لجعل الدبوس PA3 مرتفعًا):
digitalWrite (enablePin ، عالية) ؛
بعد ذلك ، ضع هذه القيم في المنفذ التسلسلي وإرسال القيم بناءً على زر الضغط الذي تم الضغط عليه ، استخدم عبارة if else وأرسل القيمة المقابلة عند الضغط على الزر.
إذا تم الضغط على الزر الأول ، فسيتم تطابق الشرط ويتم إرسال القيمة '1' إلى المنفذ التسلسلي حيث يتم توصيل Arduino UNO.
إذا (button1val == HIGH) { int num1 = 1 ؛ Serial1.println (num1) ؛ }
وبالمثل ، عند الضغط على الزر 2 ، يتم إرسال القيمة 2 عبر المنفذ التسلسلي وعند الضغط على الزر 3 ، يتم إرسال القيمة 3 عبر المنفذ التسلسلي.
وإلا إذا (button2val == HIGH) { int num2 = 2 ؛ Serial1.println (num2) ؛ } else if (button3val == HIGH) { int num3 = 3 ؛ Serial1.println (num3) ؛ }
وعندما لا يتم الضغط على أي زر ، يتم إرسال القيمة 0 إلى Arduino Uno.
آخر {عدد صحيح = 0 ؛ Serial1.println (num) ؛ }
ينتهي هذا من البرمجة لتكوين STM32 باعتباره Master.
اردوينو UNO كعبدفي الجانب التابع ، يتلقى Arduino UNO قيمة عدد صحيح يتم إرسالها من Master STM32F103C8 والمتوفر في منفذ Hardware Serial في Arduino UNO (P0 ، 1) حيث يتم توصيل الوحدة النمطية RS-485.
ما عليك سوى قراءة القيمة وتخزينها في متغير. اعتمادًا على القيمة المستلمة ، يتم تشغيل أو إيقاف تشغيل مؤشر LED المقابل المتصل بـ Arduino GPIO.
لتلقي القيم من Master ، فقط اجعل المسامير DE & RE لوحدة RS-485 منخفضة. لذا فإن الدبوس 2 (enablePin) من Arduino UNO مصنوع منخفض.
digitalWrite (enablePin ، منخفض) ؛
الآن فقط اقرأ بيانات الأعداد الصحيحة المتوفرة في Serial Port وقم بتخزينها في متغير.
int تلقي = Serial.parseInt () ،
اعتمادًا على القيمة مثل (0 ، 1 ، 2 ، 3) المستلمة ، يتم تشغيل أحد المصابيح الثلاثة المقابلة.
إذا (تلقي == 1) // اعتمادًا على القيمة المستلمة ، يتم تشغيل أو إيقاف تشغيل مؤشر LED المقابل { digitalWrite (ledpin1، HIGH) ؛ } else if ( Receive == 2) { digitalWrite (ledpin2، HIGH)؛ } else if ( Receive == 3) { digitalWrite (ledpin3، HIGH)؛ } else { digitalWrite (ledpin1، LOW)؛ digitalWrite (ledpin2 ، منخفض) ؛ digitalWrite (ledpin3 ، منخفض) ؛ }
هذا ينتهي من البرمجة وتكوين Arduino UNO ليكون Slave. يؤدي هذا أيضًا إلى إنهاء التكوينات الكاملة لـ Arduino UNO و STM32. يتم إرفاق فيديو العمل وجميع الرموز في نهاية هذا البرنامج التعليمي.
اختبار اتصال RS485 بين STM32F103C8 و Arduino UNO:
1. عند الضغط على زر الضغط 1 ، المتصل بـ Master STM32 ، يتم الضغط على مؤشر LED 1 يضيء المتصل بـ Slave Arduino.
2. عند الضغط على زر الضغط 2 ، المتصل بـ Master STM32 ، يتم الضغط على مؤشر LED 2 يتم تشغيله المتصل بـ Slave Arduino.
3. وبالمثل عند الضغط على زر الضغط 3 ، يتحول مؤشر LED 3 إلى الوضع "Slave Arduino".
هذا ينهي الاتصال التسلسلي RS485 بين STM32F103C8 و Arduino UNO. تستخدم لوحات Arduino UNO و STM32 على نطاق واسع للنماذج الأولية السريعة وقد قمنا بالعديد من المشاريع المفيدة على هذه اللوحات. إذا وجدت أي شكوك أو لديك أي اقتراح لنا ، فاكتب وعلق أدناه.