로그인회원가입

[카테고리:] 스마트홈

홈 오토메이션 관련 DIY

  • ESP32-C3로 12V 모터 제어하기: PC817 포토커플러와 IRLZ44N을 활용한 완벽 절연 회로 설계

    ESP32-C3로 12V 모터 제어하기: PC817 포토커플러와 IRLZ44N을 활용한 완벽 절연 회로 설계

    DIY 프로젝트를 진행할 때 ESP32나 아두이노 같은 MCU에 12V 이상의 유도성 부하(모터, Solenoid 등)를 직접 연결하면, 역기전력(Back-EMF) 스파이크나 돌입 전류로 인해 MCU가 리셋되거나 파손되는 문제가 자주 발생합니다.

    이 문제를 근본적으로 해결하기 위해 PC817 포토커플러를 사용해 제어부(3.3V)와 구동부(12V)의 GND까지 완전히 분리(Galvanic Isolation)하는 안전한 모터 제어 회로를 구성해 보았습니다.

    1. 부품 구성 및 핵심 역할

    • ESP32-C3: 3.3V 로직 제어기 (PWM 제어 신호 출력)
    • PC817 포토커플러: MCU와 12V 회로 사이를 빛(Opto)으로 전달하여 전기적으로 완벽히 격리
    • IRLZ44N N-Ch MOSFET: 12V 2A급 모터 전류를 스위칭하는 Power FET
    • 1N5822 (쇼트키 다이오드): 모터 OFF 시 발생하는 고전압 역기전력을 흡수하는 플라이백(Flyback) 다이오드
    • 저항: 220Ω (LED 전류 제한), 1kΩ (포토커플러 수광부 풀업), 10kΩ (게이트 풀다운)

    2. 왜 포토커플러(PC817)를 추가해야 할까?

    IRLZ44N은 Logic-Level MOSFET이라 ESP32의 3.3V GPIO로도 직결 구동은 가능합니다. 하지만 다음 두 가지 이유로 포토커플러 추가를 강력히 권장합니다.

    1. 전기적 격리 (MCU 보호): 모터 동작 시 발생하는 스파이크 노이즈가 ESP32의 GND로 흘러 들어가지 않아 MCU 튕김 현상을 100% 방지합니다.
    2. 게이트 전압 확보 (VGS​=12V): ESP32의 3.3V 대신 12V 전원을 직접 MOSFET 게이트에 인가할 수 있어, MOSFET이 완전 턴온(Turn-On) 상태가 됩니다. 결과적으로 온저항(RDS(on)​)이 최소화되어 발열이 획기적으로 줄어듭니다.

    3. 전체 회로도 (Schematic)

    아래 회로도처럼 MCU 영역(3.3V GND)과 모터 영역(12V GND)을 절대 서로 묶지 않고 독립적으로 유지하는 것이 핵심입니다.

    4. 핀 연결 가이드 (Pin-to-Pin)

    • PC817 1번 핀 (Anode): ESP32 GPIO 8 → 220Ω 저항 거쳐서 연결
    • PC817 2번 핀 (Cathode): ESP32 GND에 연결
    • PC817 3번 핀 (Emitter): 12V GND에 연결
    • PC817 4번 핀 (Collector): +12V에서 1kΩ 저항을 거친 후 연결 + IRLZ44N 1번 핀 (Gate)으로 연결
    • IRLZ44N Gate (1번 핀): 12V GND 사이에 10kΩ 풀다운 저항 병렬 연결
    • IRLZ44N Drain (2번 핀): 모터 (-) 단자 및 1N5822 다이오드 애노드(A) 연결
    • IRLZ44N Source (3번 핀): 12V GND에 연결
    • 모터 (+) 단자: +12V 및 1N5822 다이오드 캐소드(K, 띠 있는 쪽) 연결

    5. 소프트웨어 설정 시 주의사항

    PC817과 같은 광학 포토커플러는 턴온/턴오프 응답 속도에 한계가 있습니다. 따라서 ESP32-C3에서 PWM 제어를 적용할 때 주파수를 1kHz ~ 2kHz 수준으로 설정해야 합니다. PWM 주파수가 10kHz 이상으로 너무 높으면 포토커플러가 신호를 제대로 정형화하지 못해 MOSFET 발열이 심해질 수 있습니다.


    PC817 포토커플러와 IRLZ44N MOSFET을 활용한 ESP32-C3 기반 12V 2A 안마기 모터 제어 회로의 상세 배선도 및 핀 번호 가이드입니다.

    이 회로는 3.3V 제어 전원(ESP32)과 12V 구동 전원(모터)의 GND까지 완벽하게 분리(절연)하여 모터 역기전력 및 스파이크 노이즈가 ESP32-C3로 넘어오는 것을 근본적으로 차단합니다.

    1. 주요 부품 및 핀 맵 (Pin-out)

    • PC817 (4핀 딥 타입):
      • 1번 핀 (Anode): 내부 LED (+)
      • 2번 핀 (Cathode): 내부 LED (-)
      • 3번 핀 (Emitter): 내부 트랜지스터 에미터 (Output GND)
      • 4번 핀 (Collector): 내부 트랜지스터 컬렉터 (Output Signal)
    • IRLZ44N (TO-220 패키지, 글자가 보이는 전면 기준):
      • 1번 핀 (Gate): 제어 신호 입력
      • 2번 핀 (Drain): 모터 (-) 연결
      • 3번 핀 (Source): 12V 전원 GND 연결
    • 쇼트키 다이오드 (1N5822 / SS34 등):
      • 띠가 있는 쪽 (K, Cathode): +12V 전원
      • 띠가 없는 쪽 (A, Anode): MOSFET Drain (모터 – 핀)

    2. 상세 핀-투-핀 배선 표 (Pin-to-Pin Wiring)

    [절연 영역 A: ESP32-C3 제어부 (3.3V 전원)]

    출발지연결 대상사용 저항 / 비고
    ESP32-C3 GPIO 핀 (예: GPIO 8)PC817 1번 핀 (Anode)220Ω 직렬 저항 거쳐서 연결
    ESP32-C3 GND 핀PC817 2번 핀 (Cathode)직접 연결 (3.3V GND)

    [절연 영역 B: 모터 및 MOSFET 구동부 (12V 전원)]

    출발지연결 대상사용 저항 / 비고
    +12V 파워 Supply (+)PC817 4번 핀 (Collector)1kΩ 직렬 저항 거쳐서 연결
    +12V 파워 Supply (+)안마기 모터 (+) 단자직접 연결
    +12V 파워 Supply (+)다이오드 Cathode (띠 있는 쪽)역기전력 방지용 다이오드
    PC817 4번 핀 (Collector)IRLZ44N 1번 핀 (Gate)1kΩ 저항 뒷단에서 MOSFET Gate로 직접 연결
    IRLZ44N 1번 핀 (Gate)12V 파워 GND (-)10kΩ 풀다운 저항 연결
    PC817 3번 핀 (Emitter)12V 파워 GND (-)직접 연결 (12V GND)
    IRLZ44N 3번 핀 (Source)12V 파워 GND (-)직접 연결
    안마기 모터 (-) 단자IRLZ44N 2번 핀 (Drain)직접 연결
    안마기 모터 (-) 단자다이오드 Anode (띠 없는 쪽)MOSFET Drain과 함께 연결

    ★ 가장 중요한 핵심: ESP32-C3의 GND와 12V 전원의 GND는 절대로 서로 묶지 않고 완전히 분리해 두어야 포토커플러 절연 효과를 얻을 수 있습니다.

    3. ESP32-C3 소프트웨어(PWM) 설정 가이드

    PC817 포토커플러는 반응 속도(Rise/Fall Time) 제한이 있으므로, ESP32-C3에서 PWM 제어 시 주파수 설정을 너무 높게 잡지 않아야 합니다.

    • 권장 PWM 주파수:1kHz ~ 2kHz (1,000Hz ~ 2,000Hz)
      • 주파수가 10kHz 이상으로 너무 높으면 포토커플러가 신호를 제때 끄고 켜지 못해 MOSFET이 중간 온(Linear Area) 상태에 머물면서 발열이 급격히 증가합니다.
    • 로직 반전 주의: 위 구성은 포토커플러 특성상 GPIO가 HIGH일 때 MOSFET 게이트에 12V가 인가되어 모터가 ON되는 정방향 동작 회로이므로, 일반적인 Duty Cycle 값을 그대로 적용하시면 됩니다. (0% = 정지, 100% = 최대 속도)

  • [Embedded/하드웨어] 유용한 N-Channel MOSFET 두개 부품 비교: IRLZ44 vs Si2302 (스펙, 패키지 및 용도)

    [Embedded/하드웨어] 유용한 N-Channel MOSFET 두개 부품 비교: IRLZ44 vs Si2302 (스펙, 패키지 및 용도)

    마이크로컨트롤러(ESP32, 아두이노, STM32 등)의 GPIO 핀은 전압과 전류 출력이 제한되어 있습니다. 따라서 DC 모터, 릴레이, 히터, 고전력 LED 등의 부하를 제어할 때는 MOSFET이나 트랜지스터를 사용한 스위칭 회로가 필수적입니다.

    특히 MCU의 3.3V/5V 로직 전압으로 직접 게이트를 칠 수 있는 Logic Level N-Channel MOSFET 중에서 자주 쓰이는 IRLZ44와 Si2302를 비교해 보겠습니다.

    1. 개요 및 패키지 비교

    두 부품 모두 3.3V~5V 로직 신호로 구동 가능하다는 공통점이 있지만, 외형 패키지와 전력 수용량에서 결정적인 차이가 있습니다.

    • IRLZ44 (TO-220): 스루홀(Through-hole) 타입으로 빵판(Breadboard) 실험이나 대전류/고전력용 방열판 장착에 유리합니다.
    • Si2302 (SOT-23): 아주 작은 표면실장(SMD) 타입으로, PCB 공간을 극도로 줄여야 하는 소형 IoT 기기에 적합합니다.

    2. 주요 스펙 비교 표

    핵심 사양IRLZ44Si2302
    패키지 (Package)TO-220 (스루홀)SOT-23 (SMD)
    드레인-소스 전압 (VDS​)60V (또는 55V)20V
    연속 드레인 전류 (ID​)약 40~50A (방열판 필요)약 2.5~3A
    온저항 (RDS(on)​ @ VGS​=4.5V)~28 mΩ (0.028Ω)~55 mΩ (0.055Ω)
    문턱 전압 (VGS(th)​)1.0V ~ 2.0V0.65V ~ 1.2V
    최대 허용 전력 (PD​)150W0.4W (400mW)

    3. 핵심 특징 및 차이점

    1) IRLZ44 : 고전력 / 대전류 스위칭의 정석

    • 구동 특징: 제품명의 ‘L’이 의미하듯 Logic-Level 지원 MOSFET입니다. 일반적인 IRFZ44N 등은 10V 게이트 전압이 필요하지만, IRLZ44는 MCU의 3.3V/5V GPIO로도 켜집니다.
    • 낮은 온저항 (RDS(on)​): 온저항이 매우 낮아 높은 전류가 흐를 때 발생하는 열이 상대적으로 적습니다.
    • 주요 용도: DC 모터 Speed 제어(PWM), 고전력 LED 스트립, 히터 제어, 고용량 릴레이 스위칭 등.

    2) Si2302 : 초소형 / 저전력 PCB 설계용

    • 낮은 Gate Threshold: 문턱 전압(VGS(th)​)이 매우 낮아 (0.65∼1.2V) Li-ion 배터리 전압이 낮아진 상태나 2.5V/3.3V 저전력 로직에서도 안정적으로 도통(ON)됩니다.
    • 공간 효율성: SOT-23 패키지로 PCB 아트워크 시 공간을 거의 차지하지 않습니다.
    • 주요 용도: 소형 쿨링팬 구동, 신호 레벨 스위칭, 소형 릴레이 제어, 모듈 전원 차단(Power Gate) 회로 등.

    4. 부품 선택 가이드

    1. IRLZ44를 선택해야 하는 경우
      • 제어하려는 부하의 전류가 3A 이상이거나 전압이 12V~24V 이상인 경우
      • 브레드보드나 시제품 상태에서 테스트 중인 경우
      • 모터, 히터 등 방열 처리가 필수적인 대전류 부하 제어 시
    2. Si2302를 선택해야 하는 경우
      • 제어하려는 부하의 전류가 2A 미만이고 전압이 12V 이하인 경우
      • 커스텀 PCB를 설계 중이며 회로 면적을 최소화해야 하는 경우
      • 3.3V MCU 기반 초소형 센서 모듈이나 저전력 기기를 만들 때

  • [전자회로] SI2302 MOSFET으로 ESP32-CAM 전원 제어하기 (허용 소비전력 vs 제어 전력의 차이)

    [전자회로] SI2302 MOSFET으로 ESP32-CAM 전원 제어하기 (허용 소비전력 vs 제어 전력의 차이)

    ESP32-CAM처럼 순간 피크 전류가 높거나 LED 사용 시 전력 소비가 커지는 모듈을 제어할 때, 소형 SOT-23 패키지의 SI2302 MOSFET을 전원 스위치로 사용할 수 있는지, 발열 문제는 없는지 정리해 봅니다.

    1. SI2302 주요 제원 요약

    SI2302는 3.3V Logic 전압으로도 충분히 Turn-On 시킬 수 있는 대표적인 N-Channel MOSFET입니다.

    • 드레인-소스 내압 (VDS​): Max 20V
    • 연속 드레인 전류 (ID​): 2.8A ~ 3.6A
    • 도통 저항 (RDS(on)​): 약 65mΩ (0.065Ω) @ VGS​=4.5V
    • 자체 허용 소비전력 (PD​): 0.35W∼1.25W (패키지 및 방열 조건 기준)

    2. ESP32-CAM 전원 스위칭 적합성

    ESP32-CAM은 동작 상태에 따라 전류 소비 변동이 큽니다.

    • 평상시 (Wi-Fi 스트리밍): 약 160mA∼220mA (0.8W∼1.1W)
    • 플래시 LED 최대 켜짐: 약 310mA∼400mA (1.5W∼2.0W)
    • 최대 순간 피크 전류: 약 0.7A (3.5W)

    SI2302의 연속 허용 전류는 최소 2.8A 이상이므로, 0.7A 수준의 피크 전류는 스펙 대비 4배 이상의 여유가 있어 전원 스위칭용(Low-side Switch)으로 충분히 사용 가능합니다.

    3. 가장 흔히 혼동하는 개념: “허용 소비전력” vs “제어 스위칭 전력”

    “LED를 켜면 2W가 소모되는데, SI2302의 허용 소비전력이 0.85W~1.25W라면 탄 것 아닌가요?”

    회로 설계 시 가장 자주 발생하는 착각 중 하나입니다. 데이터시트에 명시된 MOSFET의 허용 소비전력(PD​)은 부하 전체가 쓰는 전력이 아니라, MOSFET 내부 저항으로 인해 열로 사라지는 손실 전력을 의미합니다.

    실제 MOSFET 내부 손실 전력 계산

    ESP32-CAM + LED가 5V에서 $2\text{W}$를 소비할 때 회로에 흐르는 전류 I는:

    이 때 SI2302 내부 도통 저항(RDS(on)​≈0.065Ω)에 의해 MOSFET 자체에서 발열로 소모되는 전력(PMOSFET​)은:

    • 부하 전체 사용 전력: 2W (ESP32 및 LED가 소모)
    • SI2302 자체 손실 전력: 0.0104W
    • SI2302 최대 허용 전력: 0.85W∼1.25W

    즉, MOSFET이 버텨야 하는 손실 전력(0.0104W)은 허용치(0.85W)의 약 1.2%에 불과하므로, 발열 걱정 없이 안정적으로 동작합니다.

    4. SI2302가 제어할 수 있는 실제 최대 부하 전력

    SI2302가 스위칭할 수 있는 부하의 최대 전력은 내압(VDS​) × 전류(ID​)로 결정됩니다.

    • 이론상 최대 스위칭 전력: 20V×2.8A=56W
    • 실제 안전 권장 스위칭 전력 (70~80% 마진 적용):
    공급 전압 (VDS​)안전 권장 전류실제 제어 가능 부하 전력주요 용도
    3.3V약 2.5A8.25WESP32, Raspberry Pi Pico
    5V약 2.5A12.5WESP32-CAM, 아두이노, 5V LED
    12V약 2.5A30.0W12V DC 팬, 솔레노이드, 12V LED

    5. 회로 설계 시 체크리스트

    1. Low-side 스위칭 구성: N-Channel MOSFET이므로 ESP32-CAM의 GND 라인을 제어하도록 배치합니다.
    2. 게이트 풀다운 저항: MCU 초기화 시 핀 플로팅으로 인한 의도치 않은 ON 동작을 방지하기 위해 Gate와 GND 사이에 10kΩ 풀다운 저항을 연결합니다.
    3. 전원 단 바이패스 콘덴서: Wi-Fi 송신 시 순간 전압 강하(Brownout) 방지를 위해 MOSFET 출력 단(ESP32-CAM VCC-GND 사이)에 100μF∼470μF 콘덴서를 배치합니다.

    요약

    SI2302는 단 0.01W 수준의 미세한 전력만 자체 소모하면서, 외부의 최대 30~50W급 부하를 손쉽게 ON/OFF 제어할 수 있는 가성비 뛰어난 SOT-23 N-Channel MOSFET입니다.

  • [MicroPython] 라이브러리 없이 IR 수신기(적외선 센서) 제어하기 – 원리부터 실전까지

    [MicroPython] 라이브러리 없이 IR 수신기(적외선 센서) 제어하기 – 원리부터 실전까지

    안녕하세요, Mana’s Lab입니다!

    오늘은 ESP32-C3나 ESP32-S3 같은 보드에서 흔히 사용하는 IR 수신기(적외선 센서)를 다뤄보려고 합니다. 보통은 만들어져 있는 라이브러리를 가져다 쓰지만, 외부 라이브러리 의존성을 줄이고 싶거나 통신 프로토콜의 원리를 직접 파악하고 싶을 때가 있습니다.

    오늘은 라이브러리 없이 마이크로파이썬(MicroPython)의 기본 기능만으로 리모컨 신호를 읽어오는 방법을 알아보겠습니다.

    1. IR 수신기의 하드웨어 연결

    가장 흔하게 사용되는 IR 수신 모듈(예: VS1838B)은 3개의 핀으로 구성되어 있습니다.

    연결 방법은 매우 간단합니다:

    • VCC: 보드의 3.3V (또는 5V)
    • GND: 보드의 GND
    • OUT (또는 S): ESP32의 GPIO 핀 (이번 예제에서는 GPIO 4를 사용합니다)

    주의: IR 수신기의 OUT 핀은 평소(대기 상태)에 **HIGH(1)**를 유지하다가, 적외선 신호가 들어오면 **LOW(0)**로 떨어지는 ‘Active Low’ 방식을 사용합니다.

    2. NEC 프로토콜의 이해

    우리가 집에서 흔히 쓰는 TV나 셋톱박스 리모컨의 90% 이상은 NEC 프로토콜을 사용합니다. 리모컨 버튼을 누르면 적외선이 특정 시간 간격으로 깜빡이며 데이터를 전송하는데, 그 규칙은 다음과 같습니다.

    1. Lead Code (시작 신호): 9ms 동안 LOW, 이후 4.5ms 동안 HIGH를 유지하며 “이제 데이터 보낸다!”라고 알립니다.
    2. Data (32비트): 총 32개의 0과 1을 보냅니다.
      • 숫자 ‘0’: 560µs LOW + 560µs HIGH
      • 숫자 ‘1’: 560µs LOW + 1.69ms HIGH (HIGH 구간이 훨씬 깁니다)
    3. End (종료 신호): 짧은 펄스로 통신을 마칩니다.

    라이브러리 없이 이 신호를 해독하려면, OUT 핀의 상태가 변할 때마다 시간차(펄스의 길이)를 마이크로초(µs) 단위로 정밀하게 측정하기만 하면 됩니다.

    3. 마이크로파이썬 코드 (라이브러리 없이 구현)

    인터럽트(IRQ)를 사용하면 메인 루프를 방해하지 않고 핀의 상태 변화(RISING/FALLING)가 일어난 정확한 시간을 배열에 기록할 수 있습니다.

    아래 코드를 ESP32-C3 등에 업로드하고 리모컨을 눌러보세요.

    Python

    코드 리뷰 및 활용 포인트

    이 방식의 핵심은 time.ticks_us()와 time.ticks_diff()를 이용해 상태가 변한 시점 간의 마이크로초 단위 시간차를 구하는 것입니다.

    출력된 durations 배열을 확인해보면, 대략 9000, 4500, 560, 1690, 560, 560... 과 같은 숫자들의 나열을 볼 수 있습니다. 이 숫자들을 if/else 문으로 0과 1로 치환한 뒤 비트 연산을 해주면, 라이브러리 없이도 완벽한 나만의 IR 디코더를 만들 수 있습니다.

    단순한 제어가 필요할 때 무거운 라이브러리를 통째로 올리는 대신, 이처럼 펄스 폭을 직접 측정하는 방식을 사용해보시면 임베디드 하드웨어의 통신 원리를 이해하는 데 큰 도움이 될 것입니다.

    • 응용 예제 코드: 리모콘으로 LED 램프를 토글식으로 켜고 타이머로 30초만 켜짐. 자동 모드로 랜덤으로 깜빡이는 촛불 모드로 5초 켜기

  • [ESP32 라인업 총정리] 나에게 딱 맞는 ESP32 칩셋 선택 가이드 (Original부터 C6, P4까지)

    [ESP32 라인업 총정리] 나에게 딱 맞는 ESP32 칩셋 선택 가이드 (Original부터 C6, P4까지)

    IoT 개발부터 메이커 프로젝트까지, 이제 ESP32는 전 세계 개발자들에게 없어서는 안 될 대표 마이크로컨트롤러(MCU)가 되었습니다.

    하지만 Espressif에서 매년 새로운 라인업을 내놓으면서 ESP32 Original, S2, S3, C3, C6, H2, P4 등 이름만 봐서는 무엇을 골라야 할지 헷갈리는 경우가 많습니다.

    이번 글에서는 지금까지 출시된 ESP32의 주요 라인업별 특징, 목적, 성능을 깔끔하게 비교해 드립니다.

    1. ESP32 주요 라인업 계보 한눈에 보기

    Espressif의 칩 라인업은 CPU 아키텍처와 핵심 목적에 따라 크게 Classic, S 시리즈(성능/멀티미디어), C 시리즈(RISC-V/저전력), H 시리즈(스마트홈 전용), P 시리즈(고성능 계산)로 나뉩니다.

    2. 칩셋별 핵심 특징 & 목적 비교

    ① Original ESP32 (Classic) — [원조 최고존엄 & 레거시]

    • CPU: Xtensa Dual-Core 32-bit (최대 240MHz)
    • 무선 통신: Wi-Fi 4 (2.4GHz) + Bluetooth Classic (BR/EDR) + BLE 4.2
    • 주요 목적: 일반적인 IoT 개발, 오디오 스트리밍, 기존 Bluetooth 레거시 장비 연동
    • 특징: ESP32 라인업 중 유일하게 블루투스 클래식을 지원합니다. 오디오 스피커나 레거시 블루투스 장비와 통신해야 한다면 여전히 대체 불가한 선택지입니다.

    ② ESP32-S3 — [플래그십 성능 & AI·멀티미디어]

    • CPU: Xtensa Dual-Core 32-bit (최대 240MHz)
    • 무선 통신: Wi-Fi 4 + BLE 5.0
    • 주요 목적: 카메라(ESP32-CAM 계열), LCD 디스플레이 UI, 음성 인식, TinyML (온디바이스 AI)
    • 특징: MCU급 프로젝트의 올라운더 최강자입니다. Native USB-OTG를 지원하며, AI 가속을 위한 vector 명령 집합(PIE)을 내장하고 있어 간단한 이미지 분류나 음성 키워드 감지가 가능합니다.

    ③ ESP32-C3 — [갓성비 센서 노드 & RISC-V 표준]

    • CPU: RISC-V Single-Core (160MHz)
    • 무선 통신: Wi-Fi 4 + BLE 5.0
    • 주요 목적: 스마트 스위치, 센서 데이터 수집, ESP8266 대체용
    • 특징: ESP8266의 자리를 대체하기 위해 나온 저전력·저비용 칩셋입니다. 하드웨어 기반 Secure Boot와 암호화 엔진이 탑재되어 보안성이 뛰어나며, 가격이 매우 저렴합니다.

    ④ ESP32-C6 — [차세대 스마트홈 & Matter / Wi-Fi 6]

    • CPU: RISC-V Single-Core (160MHz)
    • 무선 통신: Wi-Fi 6 (2.4GHz) + BLE 5.3 + IEEE 802.15.4 (Zigbee / Thread)
    • 주요 목적: Matter 규격 지원 스마트홈 기기, Zigbee/Thread 허브 및 센서
    • 특징: 스마트홈 단말 제작의 필수 칩셋입니다. Wi-Fi 6의 Target Wake Time(TWT) 기능으로 배터리 효율이 크게 좋아졌으며, Thread와 Zigbee를 지원하여 최신 Smart Home 규격인 Matter 디바이스 제작에 최적화되어 있습니다.

    ⑤ ESP32-H2 — [Wi-Fi 없는 저전력 Mesh 전용]

    • CPU: RISC-V Single-Core (96MHz)
    • 무선 통신: IEEE 802.15.4 (Zigbee / Thread) + BLE 5.3 (Wi-Fi 없음)
    • 주요 목적: 코인 배터리 기반 온·습도 센서, 문열림 감지기, Zigbee 엔드디바이스
    • 특징: Wi-Fi 라디오를 아예 제거하고 초저전력 Mesh 통신(Thread/Zigbee)과 BLE에만 집중한 모델입니다. 배터리 하나로 수개월~수년을 버텨야 하는 스마트홈 센서 노드에 적합합니다.

    ⑥ ESP32-P4 — [무선 통신 탈피, 연산 성능 극대화]

    • CPU: RISC-V Dual-Core (최대 400MHz) + HP/LP 코어
    • 무선 통신: 없음 (On-Chip Wireless 없음)
    • 주요 목적: 고해상도 Touch HMI 디스플레이, H.264 비디오 코덱, 복잡한 Edge AI 연산
    • 특징: 기존 ESP32의 틀을 깬 고성능 컴퓨팅 전용 칩셋입니다. 무선 기능 대신 MIPI-CSI/DSI, H.264 인코더, JPEG 코덱, 고속 Ethernet 등을 내장하여 고성능 그래픽 UI 및 영상 처리에 집중했습니다.

    3. 한눈에 보는 핵심 사양 비교표

    모델명코어 아키텍처동작 클럭주요 무선 통신USB 지원추천 사용 분야
    ESP32Xtensa Dual240MHzWi-Fi 4 / BT Classic / BLE 4.2X블루투스 오디오, 레거시 프로젝트
    ESP32-S3Xtensa Dual240MHzWi-Fi 4 / BLE 5.0Native디스플레이, AI 비전, 카메라, USB HID
    ESP32-C3RISC-V Single160MHzWi-Fi 4 / BLE 5.0CDC/JTAG가성비 IoT 센서, 소형 자동화 기기
    ESP32-C6RISC-V Single160MHzWi-Fi 6 / BLE 5.3 / Thread / ZigbeeCDC/JTAGMatter 스마트홈, 차세대 IoT 센서
    ESP32-H2RISC-V Single96MHzBLE 5.3 / Thread / ZigbeeCDC/JTAG초저전력 배터리 센서 (Zigbee)
    ESP32-P4RISC-V Dual400MHz없음 (유선 Ethernet 등 지원)Native고급 Touch GUI, 비디오 처리, MPU 대용

    4. 내 프로젝트엔 어떤 ESP32를 골라야 할까?

    • “일반적인 센서 제어, 디스플레이 연동, 다양한 용도로 쓰고 싶다” 👉 ESP32-S3를 추천합니다 (가장 생태계가 넓고 성능이 여유롭습니다).
    • “스마트홈(Home Assistant, Matter) 센서를 만들고 싶다” 👉 ESP32-C6을 추천합니다 (Wi-Fi 6 + Zigbee/Thread 내장).
    • “크기가 작고 전력을 적게 먹는 가성비 센서 노드가 필요하다” 👉 ESP32-C3가 단연 최적의 선택입니다.
    • “블루투스 스피커나 레거시 BT 기기를 통제하고 싶다” 👉 여전히 Original ESP32를 써야 합니다.

  • [ESP32-C3] TF 카드(MicroSD) 용량 한계와 추천 포맷 완전 정리 (64GB 인식법 포함)

    [ESP32-C3] TF 카드(MicroSD) 용량 한계와 추천 포맷 완전 정리 (64GB 인식법 포함)

    안녕하세요!

    ESP32-C3 Mini 모듈을 활용해 데이터 로깅, 센서 값 저장, 파일 서버 구축 등 다양한 프로젝트를 진행하다 보면 외부 저장 장치로 TF 카드(MicroSD 카드)를 자주 연결하게 됩니다.

    이때 “TF 카드는 몇 GB까지 꽂아도 될까?”, “포맷은 무조건 FAT32로 해야 하나?” 궁금하셨던 분들을 위해 ESP32-C3 환경에서의 TF 카드 용량 한계, 지원 포맷 규격, 그리고 64GB 이상 대용량 카드 인식법까지 깔끔하게 정리해 드립니다.

    1. TF 카드(MicroSD) 용량, 몇 GB까지 쓸 수 있을까?

    결론부터 말씀드리면, 가장 안정적인 실사용 권장 용량은 32GB 이하(SDHC)입니다.

    규격용량 범위기본 출하 포맷ESP32-C3 호환성
    TF (SD)~2GBFAT16완벽 지원
    TF (SDHC) ⭐4GB ~ 32GBFAT32완벽 지원 (가장 추천)
    TF (SDXC)64GB ~ 2TBexFAT기본 인식 불가 (강제 FAT32 포맷 필요)

    왜 32GB 이하를 권장할까?

    ESP32의 기본 라이브러리(SD.h, FS.h)는 FAT32 파일 시스템을 기준으로 동작합니다. TF 카드 규격상 32GB 이하 제품(SDHC)은 공장 출하 시 FAT32로 포맷되어 나오기 때문에, 꽂자마자 오류 없이 즉시 인식됩니다.

    2. 파일 시스템 포맷 지원 현황

    파일 시스템지원 여부상세 설명
    FAT16 / FAT32완벽 지원아두이노 IDE, MicroPython 기본 라이브러리 완벽 호환
    exFAT조건부 지원기본 라이브러리 미지원. 외부 전용 라이브러리(SdFat 등) 사용 시 가능하나 RAM 메모리 소모가 큼
    NTFS / ext4지원 불가PC/리눅스 전용 포맷으로 마이크로컨트롤러 환경 지원 불가

    3. 집에 남아도는 64GB 이상 TF 카드를 쓰려면?

    64GB 이상의 TF 카드(SDXC)를 ESP32-C3에 꽂으면 기본적으로 Card Mount Failed 에러가 발생합니다. 카드가 exFAT 상태로 포맷되어 출시되기 때문입니다.

    이 경우 PC 전용 강제 포맷 프로그램을 이용해 카드를 FAT32로 변경하면 정상 사용할 수 있습니다.

    강제 FAT32 포맷 방법

    1. 윈도우 기본 포맷 기능은 32GB 초과 용량에서 FAT32 옵션을 제공하지 않습니다.
    2. 무설치 포맷 프로그램인 GUIFormat (fat32format)을 다운로드합니다.
    3. 대상 드라이브를 선택하고, Allocation unit size(할당 크기)를 32768 (32KB)로 지정한 뒤 포맷합니다.

    ⚠️ 주의사항: ESP32-C3의 내부 SRAM 용량 한계로 인해, 64GB 이상 대용량 카드를 FAT32로 포맷해 쓰면 파일 탐색/읽기 속도가 느려지거나 간헐적인 읽기 에러가 발생할 수 있습니다. 가급적 8GB ~ 32GB 카드를 사용하는 것을 권장합니다.

    4. ESP32-C3 TF 카드 사용 실전 팁

    1. 포맷 할당 크기 최적화
      • PC에서 FAT32 포맷을 진행할 때 ‘할당 단위 크기(Cluster Size)’를 32KB로 설정하면 ESP32-C3가 데이터를 읽고 쓰는 속도 효율이 가장 좋아집니다.
    2. SPI Pinout 구성 주의
      • ESP32-C3 Mini는 사용 가능한 GPIO 핀 수가 적기 때문에, TF 카드 모듈 연결 시 기본 SPI 핀(SCK, MISO, MOSI, CS)을 올바르게 할당해야 합니다.
      • SPI 통신 클럭 속도는 10MHz ~ 20MHz 이하로 안정화해서 사용하는 것을 권장합니다.

    💡 3줄 요약

    • 가장 추천하는 TF 카드: 32GB 이하 (FAT32 포맷)
    • 64GB 이상 카드를 쓰려면: PC에서 GUIFormat 등으로 FAT32 강제 포맷 후 사용
    • 추천 포맷 옵션: FAT32 / 할당 크기(Cluster Size) 32KB

    ** 클러스터 관련

    일반적인 PC 환경에서는 4KB가 유리하지만, ESP32-C3 같은 마이크로컨트롤러(MCU) 환경에서는 32KB가 훨씬 유리합니다.

    이유를 정리해 드릴 테니 블로그 글에 ‘보너스 팁: 클러스터 크기(4KB vs 32KB) 선택 기준’ 섹션으로 활용해 보세요.

    1. 용량 절약 관점 (4KB의 장점)

    • 4KB 세팅: 파일 하나당 최소 4KB 공간을 차지합니다. 100바이트짜리 작은 센서 로그 파일 1,000개를 저장할 때 불필요하게 버려지는 낭비 공간(Internal Fragmentation)이 최소화됩니다.
    • 텍스트 위주의 매우 작은 로그 파일만 수만 개 만드는 프로젝트라면 4KB가 저장 공간 효율 면에서 유리합니다.

    2. 성능 및 RAM 소모 관점 (32KB가 권장되는 이유)

    ESP32-C3는 메모리(SRAM)가 약 400KB 정도로 매우 제한적인 임베디드 시스템입니다. 이 환경에서는 4KB보다 32KB 클러스터가 갖는 이점이 훨씬 큽니다.

    1. FAT 테이블 메모리 관리 (SRAM 절약)
      • 클러스터 단위가 작아지면(4KB), 동일한 용량의 SD 카드를 관리하기 위해 필요한 FAT(File Allocation Table) 관리 항목 수가 8배로 증가합니다.
      • ESP32-C3가 파일 위치를 찾거나 읽을 때 RAM에 올려야 하는 인덱스 정보가 커져 메모리 부족(OOM)이나 파일 인덱싱 지연이 생길 수 있습니다.
    2. 읽기/쓰기 속도 및 I/O 오버헤드 감소
      • SD 카드의 물리적 최소 기록 단위(페이지/블록)는 보통 512B~4KB 이상이며, Flash 메모리 내부 삭제 단위(Block)는 훨씬 큽니다.
      • 32KB 세팅: 한 번에 데이터 덩어리를 큼직하게 읽고 쓰기 때문에 SPI 통신 횟수(오버헤드)가 대폭 줄어들어 전반적인 파일 읽기/쓰기 속도가 크게 향상됩니다.
    3. SD 카드 수명 보호 (Wear Leveling)
      • 작은 단위로 자주 고쳐 쓰는 것보다 큰 단위로 뭉쳐서 쓰기를 수행할 때 SD 카드 내부 컨트롤러의 플래시 메모리 마모 분산(Wear Leveling) 알고리즘이 훨씬 효율적으로 동작합니다.

    💡 블로그용 한 줄 요약 정리

    “소형 텍스트 파일 다수를 저장해 용량 낭비를 줄이는 게 최우선이라면 4KB, ESP32-C3의 처리 속도 향상과 시스템 안정성이 목적이라면 32KB를 추천합니다.”

  • MicroPython 멀티태스킹: 비동기(asyncio)와 멀티스레드, 언제 뭘 써야 할까?

    MicroPython 멀티태스킹: 비동기(asyncio)와 멀티스레드, 언제 뭘 써야 할까?

    ** 비동기와 멀티 스레드 차이

    🥊 한눈에 보는 핵심 차이점

    구분비동기 (uasyncio)멀티스레드 (_thread)
    작업 방식협력적 (Cooperative)
    내가 await으로 쉴 때 다른 일 함
    선점형 (Preemptive)
    OS/CPU가 강제로 작업 전환함
    메모리(RAM) 사용매우 적음 (메모리 절약)많이 듦 (스택 메모리 각각 할당)
    자원 공유/충돌안전함 (내가 쉴 때만 전환되므로)위험함 (변수/하드웨어 동시 접근 충돌)
    동시 작업 수수십~수백 개 가능보드에 따라 보통 2개(코어 수 제한)

    💡 주요 차이점 상세 설명

    1. 작업 switching(전환) 제어권: 내가 넘기느냐 vs 강제로 빼앗기느냐

    • 비동기 (uasyncio):
      • 작업이 진행되다가 await을 만나는 순간 “나 지금 대기 중이니까 다른 일 해~” 하고 스스로 제어권을 넘깁니다.
      • 코드 예측이 쉽고, 내가 원하는 순간에만 작업 전환이 일어나므로 데이터가 꼬일 일이 적습니다.
    • 멀티스레드 (_thread):
      • CPU가 일정 시간(몇 밀리초)마다 코드를 실행 중인 중간에 강제로 멈추고 다른 스레드로 넘겨버립니다.
      • 만약 스레드 A가 센서 값을 읽어서 전역 변수에 쓰는 중에, 스레드 B가 그 변수를 읽으려고 접근하면 데이터가 깨지거나 보드가 다운(Crash)될 수 있습니다. (이를 막으려면 Lock, Mutex 같은 복잡한 장치가 필요함)

    2. 메모리(RAM) 소비량 (마이크로파이썬에서 가장 중요한 이유!)

    마이크로컨트롤러는 PC와 달리 RAM이 수백 KB 정도로 매우 적습니다.

    • 멀티스레드:
      • 스레드를 하나 생성할 때마다 독립적인 메모리 공간(Stack)을 최소 수 KB씩 크게 떼어서 할당해줘야 합니다.
      • 스레드를 3~4개만 띄워도 메모리 부족(MemoryError)이 발생하기 쉽습니다.
    • 비동기:
      • 하나의 스레드(Single Thread) 안에서 “스케줄표”만 가지고 번갈아 돌기 때문에 메모리를 거의 먹지 않습니다. 수십 개의 비동기 루틴을 돌려도 메모리가 여유롭습니다.

    3. 멀티코어 활용 유무

    • 멀티스레드:
      • ESP32나 RP2040 같은 듀얼코어 보드에서 진짜 물리적인 2개의 코어를 동시에 각각 돌리고 싶을 때 유용합니다. (예: 코어 0은 모터 제어, 코어 1은 화면 출력)
    • 비동기:
      • 기본적으로 1개의 코어 안에서 효율적으로 시간을 쪼개 쓰는 방식입니다.

    🎯 결론: 언제 뭘 써야 할까?

    ✅ 이럴 땐 uasyncio (비동기)를 쓰세요!

    • 센서 값 주기적 읽기, LED 깜빡이기, 버튼 입력을 받으면서 네트워크(Wi-Fi/Web) 통신 처리하기 등 “대기 시간(Delay/Sleep/네트워크 응답)”이 많은 대부분의 IoT 작업
    • 메모리가 아슬아슬하거나 여러 개의 단순 루틴을 동시에 돌려야 할 때

    ✅ 이럴 땐 _thread (멀티스레드)를 쓰세요!

    • 지연 시간 없이 CPU를 100% 써서 연산만 주구장창 하는 두 작업을 물리적으로 분리하고 싶을 때
    • 타임 크리티컬해서 한쪽 코어가 멈추지 않고 오직 하드웨어/모터 제어만 전담해야 할 때 (예: 듀얼 코어의 코어 1개를 전용 엔진으로 쓸 때)

    한 줄 요약:

    간단한 대기 작업이 많다면 **메모리가 적게 들고 안전한 uasyncio**가 정석이고, 물리적 듀얼코어를 써서 하드웨어를 극한으로 굴려야 할 때만 제한적으로 **_thread**를 씁니다.

  • 마이크로파이썬으로 Wi-Fi 신호 강도(RSSI) 측정하는 방법 (ESP32 / ESP8266)

    마이크로파이썬으로 Wi-Fi 신호 강도(RSSI) 측정하는 방법 (ESP32 / ESP8266)

    마이크로파이썬(MicroPython)에서는 network 모듈을 사용하면 현재 연결된 Wi-Fi의 RSSI(신호 강도)를 아주 쉽게 측정할 수 있습니다.

    보통 ESP32나 ESP8266 보드에서 많이 사용하는 코드 패턴을 정리해 드릴게요.

    1. 이미 Wi-Fi에 연결된 상태에서 RSSI 측정하기

    현재 Wi-Fi에 연결되어 있는 상태라면 wlan.status('rssi') 메서드를 사용해 실시간 신호 강도를 숫자로 받아올 수 있습니다.

    Python

            
    import network
    import time
    
    # Wi-Fi 스테이션 모드 활성화
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    
    # Wi-Fi가 연결될 때까지 대기 (실제 코드에서는 공유기 접속 코드가 필요합니다)
    while not wlan.isconnected():
        print("연결 대기 중...")
        time.sleep(1)
    
    print("연결 완료!")
    
    # 1초마다 RSSI(신호 강도) 측정하기
    while True:
        if wlan.isconnected():
            # RSSI 값 가져오기 (단위: dBm)
            rssi = wlan.status('rssi')
            print(f"현재 Wi-Fi 신호 강도 (RSSI): {rssi} dBm")
        else:
            print("Wi-Fi 연결이 끊어졌습니다.")
        
        time.sleep(1)
    
    

    2. 주변 Wi-Fi를 스캔하면서 RSSI 측정하기

    공유기에 접속하지 않고, 주변에 있는 모든 Wi-Fi 채널을 검색(Scan)하여 각각의 RSSI를 확인하고 싶을 때는 wlan.scan()을 사용합니다.

    Python

            
    import network
    
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    
    print("주변 Wi-Fi 스캔 중...")
    # 주변 AP 검색
    access_points = wlan.scan()
    
    print(f"{'SSID (이름)':<20} | {'BSSID (Mac)':<18} | {'채널':<5} | {'RSSI':<5}")
    print("-" * 60)
    
    for ap in access_points:
        # scan() 결과 구조: (ssid, bssid, channel, rssi, security, hidden)
        ssid = ap[0].decode('utf-8', 'ignore')
        bssid = ':'.join('%02x' % b for b in ap[1])
        channel = ap[2]
        rssi = ap[3]
        
        print(f"{ssid:<20} | {bssid:<18} | {channel:<5} | {rssi:<5} dBm")
    
    

    💡 RSSI 값 읽는 팁 (참고용)

    RSSI는 음수(dBm)로 표시되며, 0에 가까울수록 신호가 강한 것입니다.

    • -30 ~ -50 dBm: 아주 훌륭함 (공유기 바로 옆)
    • -60 ~ -67 dBm: 양호함 (유튜브 스트리밍, 웹서핑 문제 없음)
    • -70 ~ -80 dBm: 신호가 약함 (연결이 불안정하거나 속도가 느려질 수 있음)
    • -90 dBm 이하: 연결 불가 수준

  • PID 제어의 시대는 끝났다? 차세대 제어 알고리즘 ADRC

    PID 제어의 시대는 끝났다? 차세대 제어 알고리즘 ADRC

    제어 공학에서 오랜 기간 왕좌를 지켜온 PID(Proportional-Integral-Derivative) 제어와 차세대 제어 알고리즘으로 주목받는 ADRC(Active Disturbance Rejection Control, 능동 장해 거부 제어)는 각각의 뚜렷한 철학과 장단점을 가지고 있습니다.

    두 제어 방식의 핵심 개념, 성능 비교, 그리고 앞으로의 제어 트렌드를 상세히 정리해 드립니다.

    1. PID vs ADRC 핵심 개념 이해

    PID 제어: “과거와 현재의 오차만 보고 달린다”

    PID는 시스템의 수학적 모델 없이도, 제어 대상의 ‘출력 값’과 ‘목표 값’의 오차(Error)만을 바탕으로 제어 입력을 생성합니다.

    • P (비례): 현재 오차에 비례해 제어 (속도 결정)
    • I (적분): 누적된 과거 오차를 제거 (정상상태 오차 제거)
    • D (미분): 오차의 변화 추세를 보고 미래를 예측 (오버슈트 억제)

    💡 한계: 시스템 내부에 급격한 외란(Disturbance)이 발생하거나, 모터의 부하가 갑자기 바뀌는 등 ‘동적 특성 변화’가 생기면 PID는 이에 즉각 대응하지 못하고 오차가 커진 후에야 사후 약방문식으로 제어를 시작합니다. 또한 미분(D) 성분은 센서 노이즈를 증폭시키는 고질적인 문제가 있습니다.

    ADRC 제어: “외란을 실시간으로 감시하고 즉시 상쇄한다”

    중국과학원 한징칭(Han Jingqing) 교수가 제안한 ADRC는 “모델의 불확실성과 외부 외란을 실시간으로 추정하여 제어 신호에서 빼버리면, 시스템은 단순한 적분기 형태로 변한다”는 철학에서 출발합니다. 핵심은 ESO(Extended State Observer, 확장 상태 관측기)입니다.

    • 확장 상태 관측기 (ESO): 시스템의 내부 상태뿐만 아니라, ‘수학적 모델의 오류’와 ‘외부 외란’을 하나의 ‘총체적 외란(Total Disturbance)’이라는 새로운 상태 변수로 정의하고 실시간 추정합니다.
    • 외란 상쇄: ESO가 외란을 알아내는 즉시, 제어 입력에서 그만큼을 상쇄(Feedforward 방식)시켜 버립니다.
    • 선형 피드백: 외란이 사라진 깨끗한 시스템에 단순한 에러 피드백을 적용합니다.

    2. 두 제어 방식의 정밀 비교 (어떤 게 우세한가?)

    결론부터 말씀드리면 “제어 성능과 강인성(Robustness) 측면에서는 ADRC가 압도적으로 우세하지만, 구현의 단순함과 범용성 측면에서는 여전히 PID가 우세하다”고 볼 수 있습니다.

    비교 항목PID 제어ADRC 제어우세 승자
    외란 대응 능력오차가 발생한 후 제어 (느림)ESO를 통해 외란을 실시간 상쇄 (매우 빠름)ADRC
    모델 의존도없음 (완전 블랙박스 가능)대략적인 시스템 차수만 알면 됨무승부
    매개변수 튜닝3개 (Kp​,Ki​,Kd​) / 직관적임ESO 대역폭, 제어기 대역폭 등 2~3개 (대역폭 기반 튜닝으로 발전하여 생각보다 쉬움)무승부 (최신 LADRC 기준)
    센서 노이즈 영향미분(D) 항이 노이즈를 증폭시킴ESO가 필터 역할을 하여 노이즈에 강함ADRC
    연산 복잡도매우 낮음 (MCU 자원 거의 안 먹음)관측기(ESO) 상태 방정식을 풀어야 하므로 연산량 많음PID
    산업계 범용성전 세계 산업계의 90% 이상 사용고성능 임베디드 장비를 중심으로 급격히 확산 중PID

    왜 ADRC가 우세한가? (예시)

    모터 제어를 예로 들면, 로봇 팔이 물건을 집어서 갑자기 무게(부하)가 늘어나는 상황이 발생했을 때:

    • PID: 속도가 떨어지고 나서야 Ki​ 항이 서서히 차올라 모터 출력을 높입니다. (응답 지연, 오버슈트 발생 가능)
    • ADRC: 부하가 걸리는 순간 ESO가 이를 ‘외란’으로 즉시 감지하여 한두 스텝 만에 모터 전류를 올려버립니다. 속도 저하가 거의 발생하지 않습니다.

    3. 앞으로의 제어 방식은 어디로 가는가?

    앞으로의 제어 패러다임은 “PID의 점진적 세대교체”와 “지능형 제어의 융합”으로 요약할 수 있습니다.

    ① 하드웨어 성능 향상으로 ADRC의 급부상

    과거에는 ADRC의 복잡한 행렬 연산과 관측기 루프를 저가형 MCU(마이크로컨트롤러)에서 돌리기 부담스러웠습니다. 하지만 최근 하드웨어(Cortex-M 시리즈, ESP32, RP2040 등)의 성능이 비약적으로 상승하면서 ADRC를 탑재하기 매우 유리해졌습니다.

    • 텍사스 인스트루먼트(TI) 사의 모터 제어 칩셋에는 이미 InstaSPIN-MOTION이라는 이름으로 ADRC 기술이 내장되어 상용화되었습니다.
    • 드론(Betaflight 등 프레임워크), 정밀 CNC, 서보 드라이브, 스마트 가전(인버터 컴프레서) 등 외란이 많고 정밀 제어가 필요한 영역에서 PID를 빠르게 대체하고 있습니다.

    ② 데이터 기반 및 AI와의 융합

    전통적인 제어 이론에 딥러닝이나 강화학습(Reinforcement Learning)을 융합하는 시도가 활발합니다.

    • AI 기반 자동 튜닝: PID나 ADRC의 파라미터를 사람이 맞추는 것이 아니라, AI가 시스템의 거동을 보고 실시간으로 최적의 파라미터(Gain)를 찾아주는 방식입니다.
    • 신경망 외란 관측기: ADRC의 핵심인 ESO 자리에 딥러닝 모델을 넣어 복잡한 비선형 외란을 예측하는 연구가 진행 중입니다.

    ③ 현실적인 공존: PID는 죽지 않는다

    ADRC가 아무리 좋아도 밸브 제어, 단순 온조기, 유량 제어처럼 빠른 응답이 필요 없고 정밀도가 적당해도 되는 수많은 산업 현장에서는 여전히 PID가 굳건히 자리를 지킬 것입니다. 싸고, 직관적이며, 유지보수가 편하기 때문입니다.

    요약

    • 현재: 단순하고 범용적인 제어는 여전히 PID가 지배하고 있지만, 고성능·강인 제어가 필요한 곳에서는 한계에 부딪히고 있습니다.
    • 미래: 시스템의 성능을 극대화해야 하는 정밀 제어 분야(로봇, 드론, 전기차 모터 등)에서는 외란 저항성이 압도적인 ADRC가 사실상의 표준(Standard)으로 자리 잡아가고 있습니다.

    💡 여기서 잠깐! 실무 엔지니어링 팁

    앞서 PID와 ADRC의 이론적인 개념을 비교해 보았는데요. 이번에는 실제 임베디드 현업이나 DIY 프로젝트에 적용할 때 꼭 알아야 할 현실적인 실무 포인트 4가지를 짚고 넘어가겠습니다.

    1. ADRC는 쓰기 어렵다? 편견을 깨버린 ‘LADRC’의 등장

    “관측기(ESO)에 행렬식에… 수식이 너무 복잡해서 현업에서 못 쓰겠다” 하시는 분들이 많습니다. 실제로 한징칭 교수가 처음 제안한 초창기 ADRC는 비선형 수식이 많아 튜닝해야 할 파라미터가 10개가 넘어 다들 고개를 저었죠.

    하지만 가오(Gao) 교수가 이를 선형화한 LADRC(Linear ADRC)를 발표하면서 판도가 완전히 바뀌었습니다.

    • 복잡한 파라미터를 단 2개로 압축: 최신 LADRC는 관측기 대역폭(ωo​)과 제어기 대역폭(ωc​)이라는 딱 두 가지만 조절하면 튜닝이 끝납니다.
    • 직관적인 튜닝: 시스템의 주파수 대역폭만 슥슥 조절하면 되기 때문에, 어설프게 Kp​,Ki​,Kd​ 세 개를 붙잡고 수십 번 밤새워 튜닝하는 PID보다 오히려 셋팅이 훨씬 직관적이고 빠릅니다.

    2. 하드웨어 리소스, 내 칩(MCU)에서 돌아갈까?

    제어 알고리즘을 고를 때 가장 중요한 건 결국 “내가 가진 하드웨어 성능으로 커버가 되느냐”입니다.

    • PID 제어: 코드 몇 줄이면 끝납니다. 이산화(Discretization) 과정도 매우 간단해서 아주 저렴한 8비트 아두이노(AVR 계열) 칩에서도 넘치도록 가볍게 돌아갑니다.
    • ADRC 제어: 매 루프마다 내부 상태 방정식 오차를 계산하고 예측하는 연산(오일러 적분 등)이 포함되기 때문에 소수점(Floating Point) 연산이 끊임없이 일어납니다.

    🛠️ 실무 팁: 따라서 연산 성능이 떨어지는 8비트 MCU보다는, 하드웨어 **FPU(부동소수점 연산 장치)**가 탑재된 32비트 MCU(예: Cortex-M4 시리즈, ESP32, RP2040 등) 환경에서 구현하는 것을 적극 권장합니다. 최근에는 워낙 고성능 MCU가 저렴하게 잘 나와서 하드웨어 제약은 거의 사라진 편입니다.

    3. 직관적인 비유로 이해하는 두 방식의 차이

    이해를 돕기 위해 우리가 매일 타는 ‘자동차 운전’으로 두 제어 방식을 비유해 보겠습니다.

    • PID 제어는 ‘운전면허 시험장 코스’를 도는 것과 같습니다. 바람도 안 불고 노면도 고른 완벽한 통제 환경이라면, 엑셀과 브레이크만 적당히 밟아도 자율주행 차가 선을 넘지 않고 완벽하게 목적지까지 달립니다.
    • ADRC 제어는 ‘돌풍이 몰아치는 대관령 고갯길’을 달리는 것과 같습니다. 차가 코너를 돌 때 갑자기 측면에서 강한 돌풍이 불면, 차가 차선 밖으로 밀려나기 전에 운전자가 본능적으로 핸들을 반대 방향으로 확 꺾어 버리죠(외란 상쇄). 외란이 발생해도 차체는 거의 흔들리지 않고 중심을 유지하며 안정적으로 주행하게 됩니다.

    4. 이미 구축된 오픈소스 생태계와 상용화 트렌드

    “이 좋은 걸 나 혼자 맨땅에 헤딩하며 코딩해야 하나?” 걱정하실 필요 없습니다.

    이미 GitHub 등에 Alternative PID, Arduino ADRC, LADRC C++ 같은 키워드로 검색해 보면 잘 짜여진 오픈소스 라이브러리를 쉽게 찾을 수 있습니다. 또한, 오픈소스 드론 플라이트 콘트롤러(PX4, Betaflight)나 로봇 운영체제(ROS) 진영에서도 이미 외란에 강한 ADRC 알고리즘이 메인 제어기로 녹아들고 있는 추세입니다.

    칩 제조사들도 발 빠르게 움직이고 있습니다. 모터 제어 칩의 명가인 텍사스 인스트루먼트(TI) 사의 모터 제어 IC 라인업에는 이미 InstaSPIN-MOTION이라는 이름으로 ADRC 기술이 칩 내부에 하드웨어적으로 탑재되어 상용화되어 있습니다.

    🏁 결론: 나의 프로젝트에는 무엇을 골라야 할까?

    과거에는 연산량 부담 때문에 그림의 떡이었던 ADRC였지만, 이제는 32비트 고성능 MCU를 누구나 수천 원에 구하는 시대가 되었습니다.

    내가 만드는 자동화 장비나 IoT 기기가 ‘갑작스러운 부하 변동이 많고, 외부 노이즈나 바람 같은 환경 변수에 민감한 영역(드론, 정밀 서보 모터, 로봇 팔 등)’에 속한다면, 이제 익숙했던 PID를 잠시 내려놓고 차세대 표준으로 자리 잡고 있는 ADRC(LADRC)를 적용해 보시는 건 어떨까요? 여러분의 장비가 한 차원 더 스마트해지는 것을 경험하실 수 있을 것입니다.

  • 신형 센서가 무조건 좋다? AHT20, BMP280 쓰다가 아차한 ‘통신 거리’의 비밀 (vs DHT11/DHT22)

    신형 센서가 무조건 좋다? AHT20, BMP280 쓰다가 아차한 ‘통신 거리’의 비밀 (vs DHT11/DHT22)

    안녕하세요! 디바이스를 설계하고 IoT 프로젝트를 진행하다 보면 누구나 한 번쯤 “더 정확하고, 더 최신인 센서”를 찾게 마련입니다.

    저 역시 최근 프로젝트를 진행하면서 기존에 흔히 쓰던 DHT11이나 DHT22 대신, 비교적 최신 칩셋이면서 정밀도가 높은 AHT20이나 기압까지 측정되는 BMP280을 적극적으로 도입했습니다. 당연히 스펙이 더 좋으니 결과물도 완벽할 줄 알았죠.

    하지만 실전 배치 단계에서 예상치 못한 복병을 만났습니다. 바로 ‘전선 연장 거리(통신 거리)’ 문제였습니다.

    오늘은 실전에서 직접 삽질하며 깨달은 AHT20/BMP280(I2C 방식)과 DHT11/DHT22(1-Wire 방식)의 통신 거리 제약과 그 이유에 대해 생생하게 공유해 보려고 합니다.

    1. 발목을 잡은 주범, I2C 통신 (AHT20, BMP280)

    AHT20과 BMP280은 성능이 정말 뛰어납니다. 반응도 빠르고 소수점 아래 단위까지 기가 막히게 잡아내죠. 하지만 이 녀석들은 I2C(아이스퀘어드씨) 통신 방식을 사용합니다.

    I2C는 원래 하나의 회로 기판(PCB) 위에서 아주 가까이 있는 칩들끼리 데이터를 주고받으라고 만든 규격입니다. 즉, ‘태생적으로 장거리용이 아니다’라는 뜻입니다.

    • 실전 한계 거리: 별도 조치 없이 일반 전선(점퍼선)으로 연결할 때 안정적인 거리는 30cm ~ 50cm 내외입니다.
    • 1m 넘게 늘리면 어떻게 될까? 선 길이가 1~2m를 넘어가는 순간, 전선 자체의 정전용량(Capacitance)과 주변 노이즈 때문에 데이터가 심하게 왜곡됩니다. 센서 값이 멈춰버리거나 통신 에러가 나면서 MCU가 먹통이 되는 현상을 목격하게 됩니다.

    💡 I2C 센서로 거리를 늘려야만 한다면? 꼭 이 센서들을 멀리 떨어뜨려야 한다면, 통신 속도(Clock Speed)를 기본 400kHz에서 100kHz 이하로 대폭 낮추고, 풀업 저항(2.2kΩ~4.7kΩ)을 보강해야 합니다. 5미터 이상이라면 P82B715 같은 전용 I2C 버스 확장 IC를 추가하는 번거로운 하드웨어 작업이 수반됩니다.

    2. 느리지만 멀리 간다! 1-Wire 통신 (DHT11, DHT22)

    반면, 초보자용으로 분류되거나 구형 취급을 받기도 하는 DHT11과 DHT22는 어떨까요? 이 녀석들은 독자적인 1선(Single-Bus) 디지털 통신 방식을 씁니다.

    데이터 선 딱 하나로 통신을 주고받는데, 데이터 갱신 속도는 1~2초 주기로 다소 느리지만 거리 면에서는 엄청난 깡패입니다.

    • 실전 한계 거리: 기본적으로 5m ~ 10m는 선을 그냥 늘려도 아무 문제 없이 짱짱하게 돌아갑니다.
    • 조건만 맞추면 20m~30m도 거뜬: 전원을 3.3V 대신 5V로 인가해 전압 강하를 막아주고, 데이터 선에 달리는 풀업 저항 값을 4.7kΩ 수준으로 낮춰주면 랜선(UTP)이나 실드선을 타고 수십 미터 밖에서도 온습도 데이터를 안정적으로 쏘아 보내줍니다.

    📊 한눈에 보는 센서별 통신 거리 사양

    센서 명통신 방식정밀도 체감기본 권장 거리한계 극복 방법
    AHT20 / BMP280I2C훌륭함 (0.1∘C 단위)50cm 이내통신 속도 다운, 풀업 저항 매칭, 확장 IC 필수
    DHT111-Wire아쉬움 (1∘C 단위)5m 이내5V 전원 사용, 풀업 저항 조절
    DHT221-Wire준수함 (0.1∘C 단위)5m ~ 10m5V 전원 사용, 풀업 저항 조절, 실드선 활용

    💡 실전에서 얻은 결론: 맹신은 금물, 환경이 우선이다

    부화기 내부나 스마트팜 챔버처럼 제어 장치(MCU)와 센서의 거리가 수 미터 이상 떨어져야 하는 환경이라면, 아무리 최신형 AHT20이나 BMP280이 정밀하다고 해도 배선 작업과 회로 보완 때문에 배보다 배꼽이 더 커질 수 있습니다.

    반면 DHT22는 적당한 정밀도(±0.5∘C)를 보장하면서도, 풀업 저항 하나만 손보면 긴 선을 빼서 원거리 환경을 제어하기에 압도적으로 편리합니다.

    • MCU와 센서가 같은 케이스나 기판에 붙어있다? ➡️ 무조건 AHT20, BMP280 추천 (고정밀, 고속)
    • 수 미터 밖의 먼 곳의 온습도를 끌어와야 한다? ➡️ 뒤도 돌아보지 말고 DHT22 추천 (원거리 안정성)

    기술 스펙 시트에 적힌 정밀도 수치에만 현혹되지 말고, 내가 만들 장치의 ‘물리적 거리와 배선 환경’을 먼저 고려하는 것이 실패 없는 메이킹의 지름길이라는 것을 이번에 배웠네요.

    구형이라고 안 쓰고 중고로 팔까 하다가 아차했습니다.