RisalDash RisalDash

Qo‘llanma · RS-485 · Modbus

RS-485 va Modbus RTU orqali 1200 m naridagi sanoat datchiklarini o‘qing

I²C va oddiy UART bir-ikki metrdan keyin taslim bo‘ladi. Datchikka ombor, qozonxona yoki tsex orqali yetib borish kerak bo‘lganda — o‘nlab tugunlar, yuzlab metrlar, elektr shovqini — javob bu RS-485, uning ustidagi til esa odatda Modbus RTU. Bir dollarlik MAX485 moduli va ESP32 sizni maqsadga yetkazadi.

RS-485Modbus RTUMAX485ESP32ArduinoSanoat

RS-485 — yangi protokol emas, bu o‘sha UART kadr, faqat eshilgan juftlik orqali differensial darajalarda uzatiladi, xuddi CAN dagidek. Uzoq masofa va shovqinga chidamlilik ham shundan. Agar bu g‘oya yangi bo‘lsa — avval interaktiv shina tahlilining RS-232 / RS-485 bo‘limiga qarang: u yerda ossilogrammada differensial bir simli signaldan nega ustun kelishi ko‘rsatilgan.

Nega UART emas, RS-485

MAX485 ni ulash

MAX485 — bu transiver: bir tomonida UART, ikkinchi tomonida RS-485 shinasining A/B juftligi. Yagona noaniq chiqish — yo‘nalish: DE (driver enable) va RE (receiver enable) birga birlashtiriladi va bitta GPIO bilan boshqariladi — uzatish uchun HIGH, qabul qilish uchun LOW.

MAX485 moduli             ESP32
-----------              -----
RO  (qabul qiluvchi chiqishi) --> RX  (masalan GPIO16)
DI  (uzatuvchi kirishi) <- TX  (masalan GPIO17)
DE + RE (birlashtirilgan) <-- DIR (masalan GPIO4)   // HIGH = uzatish, LOW = qabul qilish
VCC                   --> 5V (modul) / 3V3-mantiq uchun variantlar bor
GND                   --> GND
A / B  -->  shinaga eshilgan juftlik (ikki uzoq uchida 120 Ω)
ESP32 MAX485 RS-485 transiveriga ulangan — RO RX ga, DI TX ga, DE va RE yoʻnalish GPIO siga bogʻlangan, A va B shina juftiga
MAX485 ulanishi: RO → RX, DI → TX, DE+RE bitta yoʻnalish GPIO siga, A/B shinaga. BoardLabda yigʻilgan.

Hammani chalg‘itadigan ikkita apparat qoidasi: shinaning ikki uzoq uchining har biriga 120 Ω terminator qo‘ying (har bir tugunga emas) va butun liniya bo‘ylab A→A, B→B ni saqlang. Uzun yoki “jim” shinalarda liniya bo‘sh turganda aniq darajada tursin uchun siljish rezistorlarini qo‘shing.

Modbus RTU bir ekranda

Modbus — eng oddiy “xo‘jayin-qul” protokoli: xo‘jayin so‘raydi, bitta qul javob beradi, har bir kadr CRC bilan tugaydi. Asosan ikkita funksiya kerak — 0x03 (holding-registrlarni o‘qish) va 0x04 (input-registrlarni o‘qish). Mana ESP32 ModbusMaster kutubxonasi bilan 1-quldan ikkita registrni o‘qiyapti, yo‘nalish pinini avtomatik almashtirib:

#include <ModbusMaster.h>
#define DIR 4                       // DE+RE yo'nalish pini
ModbusMaster node;

void preTx()  { digitalWrite(DIR, HIGH); }   // uzatishdan oldin uzatuvchini yoqish
void postTx() { digitalWrite(DIR, LOW);  }   // keyin qabul qilishga qaytish

void setup() {
  pinMode(DIR, OUTPUT); digitalWrite(DIR, LOW);
  Serial2.begin(9600, SERIAL_8N1, 16, 17);   // RS-485 uchun UART
  node.begin(1, Serial2);                     // qul manzili 1
  node.preTransmission(preTx);
  node.postTransmission(postTx);
}

void loop() {
  // 0x0000 manzilidan boshlab 2 ta holding-registrni o'qish (funksiya 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);
}

Butun namuna shu: kutubxonaga o‘z UART’ingizni ko‘rsating, unga yo‘nalish pini kolbeklarini bering va readHoldingRegisters() ni chaqiring. O‘z datchigingizning registr xaritasini uning datasheetidan qo‘ying.

Ishlamaganda — odatdagi gumondorlar

Juftlik, terminatorlar va yo‘nalish pinini to‘g‘ri qiling — va bitta ESP32 butun bino Modbus datchiklarini so‘rovlab chiqadi: energiya hisoblagichlari, harorat zondlari, PLK’lar — bitta eshilgan juftlik orqali.

Oddiy UART eplab bo‘lmaydigan joyda differensial juftlik baytni qanday olib o‘tishini ko‘ring.