RS485 DE/RE 방향제어 안내
작성자 정보
- 최고관리자 작성
- 192.♡.0.1 아이피
- 작성일
컨텐츠 정보
- 628 조회
- 목록
링크
첨부
본문
# 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
등록된 댓글이 없습니다.