ESP32

Inexpensive RS485 module with ESP32 (hardware serial)

기하 2021. 8. 23. 21:41

 이전 기사 에서,

나는 ESP8266에 아주 싼 RS485 모듈을 연결하는 방법을 검토했다. 

일반적으로 낙뢰 등의 트러블에 대한 보호 기능이 없는 MAX485 칩으로

가격은 약 0.3$ 5개 단위로 도매 구매하는 것이 좋다 . 

매우 저렴한 RS485 인터페이스 보드

 

이전에 검토한 XY-485 또는 XY-017와 같은 보호기능이 있는 조금 비싼 모듈을 사용하는 것이 좋습니다 

일부 산업 문제로부터 더 보호되고 자동 흐름 제어 기능이 있습니다.

 

ESP32 DevKit V1이 있는 RS485 연결 개략도

 ESP32 DevKit V1보드 에는 U0UXD, U1UXD, U2UXD로 명명된 세 개의 UART 포트가 있습니다.

  • U0UXD : ESP32DevKit V1 의 USB 변환기가 사용.
  • U1UXD : 자체 프로젝트에 사용할 수 있고, 일부 보드에서는 SPI 플래시가 차지하는 핀입니다. 
    U1UXD를 다른 핀으로 옮기지 않으면 오류가 발생할 수 있습니다.
  • U2UXD는 자체 프로젝트에 사용할 수 있습니다.

따라서 대부분의 개발자 보드에서는 ESP32 U0UXD를 기반으로 USB 변환기를 사용합니다. 

2개의 무료 UART 포트만 사용할 수 있습니다.

ESP32 LuaNode32를 저렴한 RS485 모듈에 연결하는 방법은 다음과 같습니다.

 

저렴한 RS485 모듈에 ESP32 연결

 

 예시RS485 보드는 LuaNode32 보드의 3,3V 핀에서 공급되는 전원입니다. 이것의일하고있는방법. RS485 보드에 별도의 전원 공급 장치를 사용하려면 다음과 같아야 합니다.

 

RS485 보드용 전원 공급 장치는 3,3V여야 합니다 

그렇지 않으면 GPIO ESP32를 태울 수 있습니다!!! 
또는  TTL 레벨 변환기를 사용하십시오 . 

ESP32 루아노드32 RS485(MAX485 칩셋) 
     RX (PIN RX2, GPIO16)      RO (Receive Output)
     TX (PIN TX2, GPIO17)      DI (Driver Input)
     DE_RE (GPIO4, D4)      DE (Driver Enable)
     RE (Receive enable)
     3,3V      VCC (3,3V)
    GND      GND

RO (Receive Output) – 송신기 디지털 입력;
DI (Driver Input)      – 수신기 디지털 출력;
DE (Driver Enable))   – 송신기가 작동하도록 합니다.
RE (Receive enable)  – 수신기가 작동하도록 합니다.

핀 DE와 RE가 연결되어야합니다..

DE/RE 핀이 있는 RS485 보드와 함께 작동하는 ESP32 프로그램

#include "ModbusMaster.h" //https://github.com/4-20ma/ModbusMaster

/*!
  We're using a MAX485-compatible RS485 Transceiver.
  Rx/Tx is hooked up to the hardware serial port at 'Serial'.
  The Data Enable (DE) and Receiver Enable (RE) pins are hooked up as follows:
*/

#define MAX485_RE_NEG  4 //D4 RS485 has a enable/disable pin to transmit or receive data. Arduino Digital Pin 2 = Rx/Tx 'Enable'; High to Transmit, Low to Receive
#define Slave_ID       1
#define RX_PIN      16 //RX2 
#define TX_PIN      17  //TX2 

// instantiate ModbusMaster object
ModbusMaster modbus;

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, HIGH); //Switch to transmit data
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, LOW); //Switch to receive data
}

void setup()
{
  pinMode(MAX485_RE_NEG, OUTPUT);

  // Init in receive mode
  digitalWrite(MAX485_RE_NEG, LOW);

  // Modbus communication runs at 9600 baud
  Serial.begin(9600, SERIAL_8N1);

  Serial2.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);
  modbus.begin(Slave_ID, Serial2);

  // Callbacks allow us to configure the RS485 transceiver correctly
  modbus.preTransmission(preTransmission);
  modbus.postTransmission(postTransmission);
}

long lastMillis = 0;
void loop() 
{
  long currentMillis = millis();
  if (currentMillis - lastMillis > 1000) 
  {
    uint8_t result = modbus.readInputRegisters(0x01, 2);
    
    if (getResultMsg(&modbus, result)) 
    {
      Serial.println();

      double res_dbl = modbus.getResponseBuffer(0) / 10;
      String res = "Temperature: " + String(res_dbl) + " C\r\n";
      res_dbl = modbus.getResponseBuffer(1) / 10;
      res += "Humidity: " + String(res_dbl) + " %";
      Serial.println(res);
    }
    lastMillis = currentMillis;
  }
}

bool getResultMsg(ModbusMaster *node, uint8_t result) 
{
  String tmpstr2 = "\r\n";

  switch (result) 
  {
  case node->ku8MBSuccess:
    return true;
    break;
  case node->ku8MBIllegalFunction:
    tmpstr2 += "Illegal Function";
    break;
  case node->ku8MBIllegalDataAddress:
    tmpstr2 += "Illegal Data Address";
    break;
  case node->ku8MBIllegalDataValue:
    tmpstr2 += "Illegal Data Value";
    break;
  case node->ku8MBSlaveDeviceFailure:
    tmpstr2 += "Slave Device Failure";
    break;
  case node->ku8MBInvalidSlaveID:
    tmpstr2 += "Invalid Slave ID";
    break;
  case node->ku8MBInvalidFunction:
    tmpstr2 += "Invalid Function";
    break;
  case node->ku8MBResponseTimedOut:
    tmpstr2 += "Response Timed Out";
    break;
  case node->ku8MBInvalidCRC:
    tmpstr2 += "Invalid CRC";
    break;
  default:
    tmpstr2 += "Unknown error: " + String(result);
    break;
  }
  Serial.println(tmpstr2);
  return false;
}

 

ESP32 및 RS485용 Fritzing 부품

MH-ET LIVE ESP32 DEVKIT 38핀 프리칭 부품 *.fzpz

 

  1. ESP32 DevKit V1 Fritzing 부품
  2. RS485 모듈에 대한 내 fritzing 부품 .

RS485 모듈 MAX485 fritzing 부분 *.fzpz.