دليل · RS-485 · Modbus
اقرأ حساسات صناعية على بُعد 1200 م عبر RS-485 وModbus RTU
يستسلم I²C وUART العادي بعد متر أو مترين. حين تحتاج الوصول إلى حساس عبر حظيرة أو غرفة مرجل أو أرضية مصنع — عشرات العُقد ومئات الأمتار وضوضاء كهربائية — فالجواب هو RS-485، واللغة المستخدمة فوقه عادةً هي Modbus RTU. وحدة MAX485 بدولار واحد مع ESP32 توصلانك إلى هدفك.
RS-485 ليس بروتوكولاً جديداً — إنه نفس إطار UART، فقط مُرسَل عبر زوج مجدول بمستويات تفاضلية، مثل CAN. من هنا يأتي المدى ومناعة الضوضاء. إن كانت الفكرة جديدة عليك، فألقِ نظرة أولاً على قسم RS-232 / RS-485 من الشرح التفاعلي للنواقل — فهو يُظهر على راسم الذبذبات لماذا يتفوّق التفاضلي على أحادي الطرف.
لماذا RS-485 بدلاً من UART
- الزوج التفاضلي (A/B) — تصيب الضوضاء كلا السلكين بالتساوي فتُلغى. عشرات إلى مئات الأمتار بدلاً من سنتيمترات.
- متعدد النقاط — حتى 32 عُقدة (128 مع المرسلات-المستقبلات الحديثة) على زوج واحد.
- نصف مزدوج — الجميع يتشارك الزوج نفسه ويتناوبون، لذا عليك إخبار المرسل-المستقبِل متى يتكلم ومتى يستمع.
توصيل وحدة MAX485
وحدة MAX485 هي مرسل-مستقبِل: UART من جهة، وزوج A/B الخاص بـ RS-485 من الجهة الأخرى. الطرف الوحيد غير البديهي هو الاتجاه: يُوصَل DE (تمكين المرسِل) وRE (تمكين المستقبِل) معاً ويُقادان بطرف GPIO — HIGH للإرسال، LOW للاستقبال.
وحدة MAX485 ESP32
----------- -----
RO (خرج المستقبِل) --> RX (مثلاً GPIO16)
DI (دخل المرسِل) <-- TX (مثلاً GPIO17)
DE + RE (موصولان) <-- DIR (مثلاً GPIO4) // HIGH = إرسال، LOW = استقبال
VCC --> 5V (الوحدة) / توجد نسخ آمنة لمنطق 3V3
GND --> GND
A / B --> زوج مجدول إلى الناقل (120 Ω عند كل طرف بعيد)
قاعدتان عتاديّتان تُوقعان الجميع: ضع مُنهياً 120 Ω عند كل من الطرفين البعيدين للناقل (لا على كل عُقدة)، وحافظ على A→A وB→B على طول الخط بالكامل. على النواقل الطويلة أو «الهادئة» أضِف مقاومات انحياز لتستقر الخط في السكون على مستوى محدد.
Modbus RTU في شاشة واحدة
Modbus بروتوكول «سيّد/تابع» بالغ البساطة: السيّد يسأل، تابع واحد يجيب، وكل إطار ينتهي بـ CRC.
تحتاج غالباً إلى رمزي دالة فقط — 0x03 (قراءة سجلّات holding) و
0x04 (قراءة سجلّات input). إليك ESP32 يقرأ سجلّين من التابع رقم 1 باستخدام مكتبة
ModbusMaster، مع قلب طرف الاتجاه تلقائياً:
#include <ModbusMaster.h>
#define DIR 4 // طرف الاتجاه DE+RE
ModbusMaster node;
void preTx() { digitalWrite(DIR, HIGH); } // تشغيل المرسِل قبل الإرسال
void postTx() { digitalWrite(DIR, LOW); } // العودة إلى الاستماع بعده
void setup() {
pinMode(DIR, OUTPUT); digitalWrite(DIR, LOW);
Serial2.begin(9600, SERIAL_8N1, 16, 17); // UART لـ RS-485
node.begin(1, Serial2); // عنوان التابع 1
node.preTransmission(preTx);
node.postTransmission(postTx);
}
void loop() {
// قراءة سجلّين من نوع holding بدءاً من 0x0000 (رمز الدالة 0x03)
if (node.readHoldingRegisters(0x0000, 2) == node.ku8MBSuccess) {
uint16_t temp = node.getResponseBuffer(0);
uint16_t hum = node.getResponseBuffer(1);
Serial.printf("temp=%u hum=%u\n", temp, hum);
}
delay(1000);
} هذا هو النمط بالكامل: وجّه المكتبة إلى UART الخاص بك، وأعطِها استدعاءات طرف الاتجاه، ثم استدعِ
readHoldingRegisters(). استبدِل خريطة سجلّات حساسك من ورقة بياناته.
حين لا يعمل — المشتبه بهم المعتادون
- تبديل A/B — العلة رقم واحد في RS-485. عكس الزوج يعطي صمتاً أو خردة؛ فقط بدّل السلكين.
- غياب الإنهاء — 120 Ω تُوضع على طرفي المسار الفيزيائيين، لا على كل عُقدة. بدونه تُفسد الانعكاسات الأطر على الخطوط الطويلة.
- توقيت طرف الاتجاه — إن حرّرت DE مبكراً جداً قطعتَ بايتك الأخير. دَع المكتبة تتولى ذلك، أو أضِف تأخيراً ضئيلاً بعد البايت الأخير.
- عدم تطابق السرعة / التماثل — يجب أن تتفق كل العُقد:
9600 8N1مقابل8E1عطل صامت شائع. - غياب أرضية / مرجع مشترك — الخطوط الطويلة المعزولة تحتاج مع ذلك إلى مرجع أرضي بين المرسلات-المستقبلات.
اضبط الزوج والمُنهيات وطرف الاتجاه بشكل صحيح، وسيتمكّن ESP32 واحد من استطلاع مبنى كامل من حساسات Modbus — عدّادات طاقة، ومجسّات حرارة، ومتحكمات PLC — عبر زوج مجدول واحد.
شاهد كيف يحمل الزوج التفاضلي بايتاً حيث يعجز UART العادي.