코딩게시판

RS485 DE/RE 방향제어 안내

작성자 정보

  • 최고관리자 작성
  • 192.♡.0.1 아이피
  • 작성일

컨텐츠 정보


  • 링크

  • 첨부


  • 본문

    # RS485 DE/RE 방향제어 안내

    ## 1. 목적

    RS485는 하나의 A/B 버스를 송신과 수신이 공유합니다. 따라서 RS485 트랜시버는
    현재 상태가 송신인지 수신인지 방향을 전환해야 합니다.

    현재 프로젝트는 삼성 NonNASA RS485 통신에 MAX485 계열 방향제어 방식을 사용합니다.

    ## 2. DE와 RE의 의미

    | 핀 | 의미 | 활성 상태 |
    |---|---|---|
    | `DE` | Driver Enable, 송신 활성화 | HIGH |
    | `RE` | Receiver Enable, 수신 활성화 | LOW |

    일반적인 MAX485 연결에서는 `DE`와 `RE`를 함께 묶고 하나의 GPIO로 제어합니다.

    ```text
    GPIO HIGH
      -> DE 활성
      -> RE 비활성
      -> 송신 모드

    GPIO LOW
      -> DE 비활성
      -> RE 활성
      -> 수신 모드
    ```

    ## 3. 현재 프로젝트 연결

    YAML 설정:

    ```yaml
    substitutions:
      rs485_tx_di: GPIO11
      rs485_rx_ro: GPIO12
      rs485_de_re: GPIO13

    samsung_ac:
      flow_control_pin: ${rs485_de_re}
    ```

    배선:

    ```text
    ESP32 GPIO11 TX -> RS485 DI
    ESP32 GPIO12 RX <- RS485 RO
    ESP32 GPIO13    -> RS485 DE + RE
    RS485 A/B       -> 삼성 에어컨 F1/F2
    ```

    | GPIO | 역할 |
    |---|---|
    | GPIO11 | ESPHome UART 송신 |
    | GPIO12 | ESPHome UART 수신 |
    | GPIO13 | MAX485 송수신 방향 전환 |

    `flow_control_pin`은 단순 LED나 상태 입력이 아니라 RS485 버스의 송수신 방향을
    제어하는 핵심 출력입니다.

    ## 4. 송신 프로세스

    전원, 모드, 온도, 팬, 스윙 변경 시 다음 순서로 송신합니다.

    ```text
    ESPHome 제어 명령 생성
      -> NonNASA 송신 큐 등록
      -> 송신 대기시간 확인
      -> GPIO13 HIGH
      -> MAX485 송신 모드 전환
      -> UART 프레임 송신
      -> UART flush()
      -> 약 3ms 대기
      -> GPIO13 LOW
      -> MAX485 수신 모드 복귀
      -> 에어컨 응답 수신
    ```

    로그 예시:

    ```text
    switching flow_control_pin to write
    >>> 32 D0 C8 ...
    switching flow_control_pin to read
    <<< 32 C8 00 ...
    ```

    로그 의미:

    - `write`: GPIO13 HIGH, 송신 모드
    - `>>>`: ESPHome에서 에어컨으로 송신
    - `read`: GPIO13 LOW, 수신 모드
    - `<<<`: 에어컨에서 ESPHome으로 수신

    ## 5. 수신 프로세스

    수신 중에는 GPIO13이 LOW여야 합니다.

    ```text
    GPIO13 LOW
      -> MAX485 수신 활성
      -> 에어컨 Cmd20/Cmd54 수신
      -> 전원·모드·온도 상태 갱신
    ```

    GPIO13이 송신 상태인 HIGH로 계속 남아 있으면 에어컨 응답을 수신하지 못하거나
    버스 충돌이 발생할 수 있습니다.

    ## 6. 현재 코드의 보호 처리

    현재 구현에는 다음 보호 동작이 포함되어 있습니다.

    - 부팅 시 GPIO13을 LOW로 설정
    - 송신 직전에 GPIO13을 HIGH로 변경
    - UART `flush()` 후 약 3ms 대기
    - 마지막 송신 비트가 끝난 뒤 GPIO13을 LOW로 복귀
    - 송신 중 수신 충돌 방지
    - 전원 ON 초기 응답 누락 방지
    - 전원·모드 request 송신 큐 관리

    부팅 시 LOW 설정은 DE/RE 핀이 부동 상태가 되어 첫 상태 프레임을 놓치는 문제를
    줄이기 위한 처리입니다.

    ## 7. DE/RE가 없는 보드

    ### 7.1 Auto Direction RS485 보드

    보드 내부에서 TX 데이터를 감지해 송수신 방향을 자동으로 전환하는 보드라면
    GPIO13 없이 사용할 수 있습니다.

    ```yaml
    samsung_ac:
      # flow_control_pin 생략
    ```

    동작:

    ```text
    ESPHome TX
      -> RS485 보드가 자동 송신 전환
      -> 데이터 송신
      -> RS485 보드가 자동 수신 전환
    ```

    이 경우 다음 기능을 사용할 수 있습니다.

    - 전원 ON/OFF
    - 온도 조정
    - Cool/Dry/Fan/Auto/Heat 모드
    - 팬 속도
    - 스윙
    - NonNASA 등록 및 깨우기

    단, 보드에 실제 RS485 트랜시버와 A/B 단자가 있어야 합니다.

    ### 7.2 일반 MAX485 보드

    일반 MAX485 보드는 DE/RE 방향제어가 필요합니다.

    | DE/RE 상태 | 결과 |
    |---|---|
    | 수신 고정 | 수신만 가능, 송신 불가 |
    | 송신 고정 | 송신은 가능할 수 있으나 수신 불가 |
    | 부동 상태 | 송수신 불안정 |
    | GPIO 또는 RTS 제어 | 정상적인 반이중 통신 가능 |

    일반 MAX485에서 `flow_control_pin`을 생략하면 전원, 온도, 모드, 팬, 스윙 송신을
    보장할 수 없습니다.

    ## 8. TX/RX만 표시된 보드 확인

    보드에 `TX`, `RX`만 표시되어도 다음 두 경우를 구분해야 합니다.

    1. `TX/RX/A/B`가 있는 Auto Direction RS485 보드
    2. 단순 TTL UART 보드

    단순 TTL UART 보드는 에어컨 F1/F2에 직접 연결할 수 없습니다. 반드시 RS485
    트랜시버와 A/B 차동 출력이 있어야 합니다.

    ## 9. 정상 동작 확인

    정상적인 방향제어 로그는 다음 순서입니다.

    ```text
    write
    >>>
    read
    <<<
    ```

    확인 항목:

    - `write` 후 실제 `>>>` 프레임이 출력되는가
    - 송신 후 `read`로 복귀하는가
    - `read` 후 `<<<` 에어컨 응답이 수신되는가
    - Cmd20 상태가 전원·모드·온도와 함께 갱신되는가

    `>>>`만 있고 `<<<`가 없으면 다음을 확인합니다.

    - DE/RE 논리 반전
    - GPIO13 연결 누락
    - A/B 극성 반대
    - TX/RX 연결 반대
    - Auto Direction 기능이 없는 보드 사용
    - 실제 RS485 트랜시버가 아닌 TTL UART 보드 사용

    ## 10. 최종 구성

    현재 MAX485 구성의 권장 연결은 다음과 같습니다.

    ```text
    GPIO11 = TX
    GPIO12 = RX
    GPIO13 = DE/RE
    ```

    동작 순서는 항상 다음이어야 합니다.

    ```text
    수신 대기 LOW
      -> 송신 시 HIGH
      -> 송신 완료
      -> 약 3ms 대기
      -> 다시 LOW
    ```

    ## 11. A/B 교차와 UART RX `inverted`의 차이

    다음 YAML 설정은 MAX485 트랜시버의 `RO` 출력 이후 ESP32 UART 입력 논리를
    반전합니다.

    ```yaml
    rx_pin:
      number: ${rs485_rx_ro}
      mode:
        input: true
      inverted: false
    ```

    `inverted`는 UART 논리 레벨 설정이며 RS485 차동선 A/B 극성을 바꾸는 설정이
    아닙니다.

    현재 사용 중인 MAX485 보드에서는 다음 설정이 정상입니다.

    ```yaml
    rx_pin:
      number: ${rs485_rx_ro}
      mode:
        input: true
      inverted: false

    tx_pin:
      number: ${rs485_tx_di}
      inverted: false
    ```

    일반적인 MAX485의 `DI`와 `RO`는 ESPHome UART의 표준 논리와 맞으므로 RX와 TX
    모두 `inverted: false`를 사용합니다. 이 구성에서 송신과 수신, Cmd20 상태 반영이
    정상이라면 현재 보드에는 별도의 UART 반전이 필요하지 않습니다.

    이전 보드에서 `inverted: true`일 때 송신은 보이지만 수신이 되지 않았던 것은
    이전 보드의 UART TTL 회로, 트랜시버, 레벨 변환기 또는 RO/DI 라벨 극성이 현재
    MAX485 보드와 달랐기 때문일 수 있습니다. TX 파형이 관찰된다는 것만으로 UART
    프레임이 올바르거나 에어컨이 정상 수신했다는 뜻은 아닙니다. RX가 반전되면
    UART 시작 비트, 데이터, 패리티가 잘못 해석되어 프레임과 CRC가 실패할 수 있습니다.

    | 변경 | 영향을 받는 구간 |
    |---|---|
    | `inverted: true` | MAX485 `RO` 이후 UART RX 논리 |
    | A/B 케이블 교차 | RS485 차동 버스 극성 |
    | TX inverted | ESP32 UART TX 논리 |

    일반적인 권장 순서는 다음과 같습니다.

    1. A/B를 보드 표기대로 연결하고 `rx_pin.inverted: false` 사용
    2. 수신이 안 되면 A/B만 서로 교차 연결
    3. 그래도 수신 논리가 반전된 특수 보드라면 `rx_pin.inverted: true` 시험
    4. `>>>` 송신과 `<<<` 수신, CRC, Cmd20 상태를 모두 확인

    A/B를 반대로 연결했을 때 `inverted: true`로 수신이 되는 경우는 다음과 같은
    보드 특성이 있을 수 있습니다.

    - 보드의 A/B 라벨이 실제 표준 극성과 반대
    - 보드의 RS485 수신 출력 `RO`가 논리 반전되어 있음
    - TX/RX 또는 트랜시버 연결 표기가 일반 MAX485 기준과 다름
    - A/B 교차와 UART 논리 반전이 우연히 해당 보드에서 동시에 보정됨

    그러나 A/B 교차와 `inverted: true`는 서로 대체 관계가 아닙니다. A/B를 바꾸면
    송신과 수신의 차동 극성이 모두 바뀌고, RX inverted는 ESP32가 읽는 수신 논리만
    바꿉니다. 따라서 수신만 되는 조합보다 다음 전체 흐름을 기준으로 판단해야 합니다.

    ```text
    ESPHome TX
      -> RS485 A/B 송신
      -> 에어컨 수신
      -> 에어컨 응답 A/B
      -> MAX485 RO
      -> ESP32 RX
    ```

    최종 정상 기준:

    ```text
    switching flow_control_pin to write
    >>>
    switching flow_control_pin to read
    <<<
    Cmd20 received
    CRC 오류 없음
    전원·모드·온도 상태 갱신
    ```

    `inverted: true`에서 수신만 되고 TX 제어가 실패하거나 CRC 오류가 발생하면,
    해당 설정은 올바른 해결책이 아니라 보드 배선 또는 트랜시버 극성 문제를 숨기는
    상태일 수 있습니다.

    보드가 바뀌면 다음 세 항목을 독립적으로 다시 확인해야 합니다.

    1. UART TTL 논리: `rx_pin/tx_pin inverted`
    2. RS485 차동 극성: A/B 연결
    3. 반이중 방향제어: DE/RE 또는 Auto Direction

    현재 보드의 정상 기준은 `RX=false`, `TX=false`, A/B 정상 극성, GPIO13 DE/RE
    방향제어입니다.


    첨부 파일을 스킨보드에 구성 PDF보기( W:\g5\skin\board\BS4-Basic-Webzine_11q_pdf_php82\view.skin.php + view_pdf.php구성)



    관련자료

    댓글 0
    등록된 댓글이 없습니다.

    최근글


    새댓글