ESP32 마이크로파이썬 MOSFET 모듈
이 튜토리얼에서는 ESP32와 MicroPython으로 MOSFET 모듈을 전원 스위치로 사용하는 방법을 알아봅니다. 자세히 배울 내용은 다음과 같습니다:
- MOSFET 모듈, 12V 전원 공급 장치, 12V LED 스트립(또는 12V DC 모터/팬)을 ESP32에 연결하는 방법
- ESP32용 MicroPython 코드를 작성하여 12V 부하를 켜고 끄고, PWM으로 밝기나 속도를 바꾸는 방법
- AOD4184, LR7843, FR120N 모듈 중에서 고르는 방법

준비물
| 1 | × | 38-pin ESP32 ESP-WROOM-32 Dev Module - Narrow | 쿠팡 | 아마존 | |
| 1 | × | (또는) 38-pin ESP32 ESP-WROOM-32 Dev Module - Wide | 쿠팡 | 아마존 | |
| 1 | × | (또는) 30-pin ESP32 ESP-WROOM-32 Dev Module - Wide | 아마존 | |
| 1 | × | (또는) ESP32 Uno-form board | 아마존 | |
| 1 | × | (또는) ESP32 S3 Uno-form board | 아마존 | |
| 1 | × | USB 케이블 타입-A to 타입-C (USB-A PC용) | 쿠팡 | 아마존 | |
| 1 | × | USB 케이블 타입-C to 타입-C (USB-C PC용) | 아마존 | |
| 1 | × | MOSFET Module (AOD4184, LR7843 or FR120N) | 아마존 | |
| 1 | × | 12V LED 스트립 | 아마존 | |
| 1 | × | (또는) 12V DC 선풍기 | 아마존 | |
| 1 | × | 12V 전원 어댑터 | 아마존 | |
| 1 | × | DC 커넥터 전원 연결 잭 플러그 소켓 | 쿠팡 | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) Breakout Expansion Board for ESP32 | 쿠팡 | 아마존 | |
| 1 | × | (추천) ESP32용 전원 분배기 | 쿠팡 | 아마존 |
MOSFET 모듈에 대하여
MOSFET 모듈은 전류를 여닫는 수도꼭지라고 생각하면 됩니다. ESP32가 3.3V의 작은 신호로 수도꼭지를 돌리면, 별도의 12V 전원에서 훨씬 큰 전류가 기기로 흘러갑니다. 대표적인 기기로는 LED 스트립, DC 모터, 팬, 펌프, 솔레노이드 밸브, 작은 히터가 있습니다.
초보자는 이런 일에 먼저 릴레이를 써 보는 경우가 많습니다. MOSFET 모듈은 릴레이보다 분명한 장점이 있습니다:
- 딸깍 소리가 나지 않고 움직이는 부품이 없어서 수명이 훨씬 깁니다.
- 매우 빠르게 스위칭하므로 PWM을 쓸 수 있습니다. 즉, 조명을 어둡게 하거나 모터를 느리게 만들 수 있습니다. 릴레이는 완전히 켜거나 완전히 끄는 것만 가능합니다.
한 가지 제한이 있습니다. DC 전원만 다룰 수 있습니다. AC 교류 전원에는 절대 쓰면 안 됩니다. AC 기기를 스위칭해야 한다면 ESP32 마이크로파이썬 - 릴레이을 사용하세요.
이 보드는 세 가지 MOSFET 칩으로 살 수 있습니다: AOD4184(D4184로도 판매), LR7843, FR120N. 칩만 다르고 나머지는 같은 보드입니다. 크기, 핀 순서, 배선, 아래의 MicroPython 코드가 모두 같으므로 이 가이드 하나로 세 가지를 모두 다룹니다.
| AOD4184 | LR7843 | FR120N | |
|---|---|---|---|
| MOSFET | AOD4184A (N채널) | IRLR7843 (N채널) | IRFR120N (N채널) |
| 최대 부하 전압(MOSFET 정격) | 40V DC | 30V DC | 100V DC |
| 최대 전류(MOSFET 정격) | 50A | 161A | 9.4A |
| 온 저항 RDS(on) | 약 7 mΩ | 약 3.3 mΩ | 약 210 mΩ |
| 방열판 없이 실제 사용 가능한 전류 | 약 10–15A | 약 15A | 약 2A |
| 제어 신호 | 3.3V / 5V 로직, 액티브 HIGH | 3.3V / 5V 로직, 액티브 HIGH | 3.3V / 5V 로직, 액티브 HIGH |
| 절연 | PC817 포토커플러 | PC817 포토커플러 | PC817 포토커플러 |
| PWM | 가능, ~1 kHz 이하로 유지 | 가능, ~1 kHz 이하로 유지 | 가능, ~1 kHz 이하로 유지 |
| 부하 종류 | DC 전용 | DC 전용 | DC 전용 |
어느 것을 사야 할까요? 간단한 안내입니다:
- 12V나 24V에서 큰 전류가 필요한 경우(예: 길고 밝은 LED 스트립이나 큰 모터): LR7843을 고르세요. 저항이 가장 낮아서 발열이 가장 적습니다. 최대 전압은 30V입니다.
- 12V, 24V, 36V에서 일반적인 용도: AOD4184를 고르세요. 강한 전류와 최대 40V를 지원하는 균형 잡힌 선택입니다.
- 전압은 높지만 전류가 작은 경우(예: 24V나 48V 기기): FR120N을 고르세요. 최대 100V까지 받을 수 있지만 저항이 높아서 방열판 없이는 약 2A까지만 생각해야 합니다.
표의 큰 숫자에 대해 주의할 점이 있습니다. 50A와 161A는 칩 자체의 한계입니다. 작은 보드는 그전에 이미 뜨거워집니다. 진짜 한계는 열입니다. 기기를 한동안 작동시킨 뒤 조심스럽게 칩을 만져 보세요. 손가락을 댈 수 없을 만큼 뜨겁다면 방열판을 달거나 부하를 줄이세요.
핀 배치

모듈에는 ESP32와 연결하는 저전력 쪽과 부하와 연결하는 고전력 쪽이 있습니다.
저전력 쪽(2.54mm 간격의 2핀 헤더라서 브레드보드에 꽂을 수 있습니다):
- PWM 핀: ESP32의 GPIO 핀에 연결합니다. 이 튜토리얼에서는 GPIO18을 사용합니다.
- GND 핀: ESP32의 GND(0V)에 연결합니다.
고전력 쪽(나사 단자 3개):
- + 핀: 부하용 전원 공급 장치의 양극 출력(이 튜토리얼에서는 12V)에 연결합니다. 부하의 양극 선도 이 단자에 함께 들어갑니다. 두 선을 먼저 합친 다음 넣어도 됩니다.
- LOAD 핀: 부하의 음극 선에 연결합니다. MOSFET이 이 선을 켜고 끕니다.
- − 핀: 부하용 전원 공급 장치의 음극 출력(0V)에 연결합니다.
보드에 인쇄된 글자는 제조 묶음에 따라 조금 다를 수 있습니다. 나사를 조이기 전에 가지고 있는 모듈의 표기를 확인하세요.
내부에서 일어나는 일
보드 안에서 GPIO18의 신호는 PWM 핀으로 들어가 작은 저항을 지나 PC817 포토커플러 안의 LED에 도달합니다. 이 LED의 빛이 PC817 안에 있는 포토트랜지스터를 켭니다. 포토트랜지스터는 MOSFET의 게이트를 구동하고, 포토커플러가 꺼져 있는 동안에는 저항이 게이트를 0V로 끌어내립니다. MOSFET은 LOAD 단자와 − 단자 사이에 놓여 있어서, 양극 선이 아니라 부하의 음극 선을 끊습니다. 부하는 + 와 LOAD 사이에 연결됩니다.
이제 GPIO18의 신호 종류별로 어떤 일이 일어나는지 따라가 봅시다.
GPIO18이 0V(LOW)일 때
pwm.duty_u16(0)으로 만들 수 있으며, 듀티 사이클 0%입니다.
- 핀이 0V를 출력하므로 포토커플러 안의 LED로 전류가 흐르지 않습니다. LED는 꺼져 있습니다.
- 빛이 없으면 포토트랜지스터는 꺼진 상태를 유지합니다. 풀다운 저항이 MOSFET 게이트를 0V로 유지합니다.
- MOSFET은 OFF입니다. LOAD와 − 사이에서 열린 스위치처럼 동작합니다.
- 부하의 음극 선이 그라운드에 연결되지 않으므로 전류가 흐를 수 없습니다. 부하는 0V를 받고 OFF 상태가 됩니다.
GPIO18이 3.3V(HIGH)일 때
pwm.duty_u16(65535)로 만들 수 있으며, 듀티 사이클 100%입니다.
- 3.3V 핀이 포토커플러 안의 LED로 몇 mA를 보내면 LED가 켜집니다. 칩 안에 밀봉되어 있어서 눈으로는 볼 수 없습니다.
- 이 빛이 포토트랜지스터를 켭니다. 이제 MOSFET 게이트는 부하 전원의 약 절반을 받습니다. 12V 어댑터를 쓰면 약 6V입니다.
- MOSFET이 완전히 ON이 됩니다. 매우 작은 저항을 가진 닫힌 스위치처럼 동작합니다. AOD4184와 LR7843은 몇 mΩ뿐이고, FR120N은 약 0.2Ω입니다.
- 전류가 회로를 따라 흐릅니다: 어댑터 + → + 단자 → 부하 → LOAD 단자 → MOSFET → − 단자 → 어댑터 −.
- 부하는 거의 12V 전체를 받아 최대 출력으로 작동합니다.
LED에는 작은 전류만 있으면 됩니다. 그래서 3.3V ESP32 핀만으로 추가 부품 없이 모듈을 구동할 수 있습니다. 5V 보드에서도 작동합니다.
GPIO18이 PWM 신호를 보낼 때
pwm.duty_u16()에 0에서 65535 사이의 값을 넣으면 만들 수 있습니다. 듀티 사이클은 그 값을 65535로 나눈 값입니다.
- 핀이 0V와 3.3V 사이를 매우 빠르게 오갑니다. 여기의 코드는 500 Hz를 쓰며, 1초에 500번이라는 뜻입니다.
- MOSFET은 모든 변화를 따라갑니다. HIGH 구간에는 ON이고 LOW 구간에는 OFF입니다.
- 부하는 12V 펄스를 받습니다. 듀티 사이클은 신호가 HIGH로 유지되는 시간의 비율입니다.
- 평균 전압과 평균 전력은 듀티 사이클에 최대 값을 곱한 값입니다.
12V 전원일 때의 세 가지 예:
- duty_u16(6553), 듀티 10%: 시간의 10분의 1 동안 ON입니다. 평균은 약 1.2V이고, 전력은 약 10분의 1입니다.
- duty_u16(32767), 듀티 50%: 시간의 절반 동안 ON입니다. 평균은 약 6V이고, 전력은 약 절반입니다.
- duty_u16(58981), 듀티 90%: 시간의 10분의 9 동안 ON입니다. 평균은 약 10.8V로 거의 최대 출력입니다.
부하에서 느끼는 변화:
- LED 스트립은 더 어둡게 보입니다. 실제로는 깜빡이지만 눈으로 보기에는 너무 빠릅니다.
- 모터, 팬, 펌프는 더 느리게 돕니다. 회전하는 무게가 펄스를 부드럽게 만들어 줍니다.
주파수를 낮게(약 500 Hz에서 1 kHz) 유지해야 하는 이유: PC817은 느린 부품입니다. PWM이 너무 빠르면 MOSFET이 완전히 ON, 완전히 OFF가 되지 못합니다. 부하가 깨끗한 펄스를 받지 못하고 MOSFET이 뜨거워집니다.
아래 스크립트는 이 단계를 사용합니다: 10%에서 100%까지 10% 단위로 올라갑니다.
기억해 둘 점
- 최소 6V 이상의 전원 공급 장치: 게이트 전압은 부하 전원에서 만들어지므로 5V 부하 전원은 너무 약합니다. 약 6V 이상을 사용하고, 부하가 몇 A 이상 흐르면 9V 이상을 사용하세요.
- 서로 분리된 두 그라운드: 포토커플러 때문에 ESP32 그라운드와 부하 그라운드는 보드에서 연결되어 있지 않습니다. 분리된 상태로 두세요.
- 보드에 플라이백 다이오드가 없음: 모터, 팬, 펌프, 솔레노이드, 릴레이에는 직접 추가해야 합니다. 아래 배선 예시를 참고하세요.
선연결
ESP32는 제어 핀 두 개에만 연결됩니다. 12V 어댑터는 나사 단자에만 연결합니다. 12V를 ESP32의 어떤 핀과도 멀리 떨어뜨리세요. 그렇지 않으면 보드가 망가질 수 있습니다.
12V LED 스트립 배선
LED 스트립은 시작하기에 가장 간단한 부하입니다. 추가 부품이 필요 없습니다.

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
| MOSFET 모듈 핀 | 연결 대상 |
|---|---|
| PWM | ESP32 GPIO18 |
| GND | ESP32 GND |
| + | 12V 어댑터 +(DC 전원 잭 경유) 및 LED 스트립 + 선 |
| LOAD | LED 스트립 − 선 |
| − | 12V 어댑터 −(DC 전원 잭 경유) |
다른 12V 기기 연결하기
LED 스트립은 하나의 예일 뿐입니다. 같은 모듈로 모터, 팬, 펌프, 솔레노이드도 구동할 수 있습니다. ESP32 배선은 그대로입니다(GPIO18은 PWM에, GND는 GND에). 나사 단자에 연결하는 기기만 바뀌며, 항상 다음 패턴을 따릅니다:
- 어댑터 +는 +에, 어댑터 −는 −에 연결합니다.
- 기기의 + 선도 +에, 기기의 − 선은 LOAD에 연결합니다.
어댑터 전압은 기기와 맞아야 합니다. 12V 기기에는 12V 어댑터가 필요하며, 전원은 6V보다 낮으면 안 됩니다. 기기가 얼마나 많은 전류를 쓰는지도 확인하세요. FR120N은 방열판 없이 약 2A 정도의 작은 부하에만 적합합니다. 더 큰 부하에는 AOD4184나 LR7843을 사용하세요.
이런 기기 대부분은 안에 코일이 있습니다. MOSFET이 전원을 끊을 때마다 코일이 짧은 고전압 스파이크를 내보냅니다. 시간이 지나면 이 스파이크가 MOSFET을 망가뜨릴 수 있습니다. 플라이백 다이오드(예: 1N5819 또는 1N4007)는 스파이크가 안전하게 흐를 길을 만들어 줍니다. 기기의 두 선 사이에 연결하세요:
- 다이오드 캐소드(줄무늬가 있는 쪽): 기기 + 선(+ 쪽)에 연결
- 다이오드 애노드: 기기 − 선(LOAD 쪽)에 연결
다이오드를 거꾸로 달면 MOSFET이 켜질 때 전원이 단락됩니다. 줄무늬를 두 번 확인하세요.
아래 어떤 기기든 MicroPython 스크립트를 바꿀 필요는 없습니다. 한 가지 예외는 솔레노이드입니다: set_load(100)과 set_load(0)만 호출하고 페이드는 빼세요.
예시: 12V DC 모터

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
- 모터 + 선은 +에, 모터 − 선은 LOAD에 연결합니다.
- 여기서는 플라이백 다이오드가 꼭 필요합니다.
- PWM 듀티가 모터 속도를 정합니다.
이 모듈은 모터를 한 방향으로만 돌릴 수 있습니다. 양방향으로 돌리려면 L298N 같은 모터 드라이버가 필요합니다. 자세한 내용은 ESP32 마이크로파이썬 - DC 모터를 참고하세요.
예시: 12V 쿨링 팬

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
팬에는 빨간 선(+)과 검은 선(−)이 있습니다. 일부 팬에는 속도 신호용 노란 선도 있습니다. 그 선은 연결하지 마세요.
- 빨간 선은 +에, 검은 선은 LOAD에 연결합니다.
- 플라이백 다이오드도 추가하세요. 저렴하고 해가 되지 않습니다.
- 듀티가 속도를 정합니다. 일부 팬은 듀티가 매우 낮으면 시작하지 않으므로 약 30% 이상에서 시작하세요.
팬에 대한 더 많은 아이디어는 ESP32 마이크로파이썬 - 팬 제어를 참고하세요.
예시: 12V 솔레노이드 밸브(평상시 닫힘)

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
- 밸브 + 선은 +에, 밸브 − 선은 LOAD에 연결합니다.
- 코일이 있으므로 다이오드를 달아야 합니다.
- 완전히 ON이면 밸브가 열리고 OFF이면 닫힙니다. PWM이 아니라 ON과 OFF만 사용하세요.
예시: 12V 워터 펌프

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
- 펌프 + 선은 +에, 펌프 − 선은 LOAD에 연결합니다.
- 여기에도 다이오드가 필요합니다.
- 듀티가 물이 흐르는 양을 정합니다.
- 물 없이 펌프를 작동시키지 마세요.
예시: 12V 솔레노이드 도어락

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
- 락 + 선은 +에, 락 − 선은 LOAD에 연결합니다.
- 다른 코일 기기와 마찬가지로 다이오드를 추가하세요.
- 100% 또는 0%만 사용하세요. 어둡게 하지 마세요.
- 잠금을 풀 만큼만 짧게 ON으로 하세요. 오래 ON 상태로 두면 뜨거워집니다.
예시: 12V LED 스트립, 전원 쪽 자세히 보기

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
- 스트립 + 선(보통 12V로 표시됨)은 +에, 스트립 − 선은 LOAD에 연결합니다.
- 스트립에는 코일이 없으므로 다이오드가 필요 없습니다.
- 듀티가 밝기를 정합니다. 스트립이 길수록 전류를 더 많이 쓰므로 모듈을 고르기 전에 전류를 확인하세요.
- 단색 스트립에서만 작동합니다. RGB 스트립과 주소 지정형 스트립은 방식이 다릅니다.
ESP32 마이크로파이썬 코드 - MOSFET 모듈
추가 라이브러리는 필요 없습니다. 스크립트는 MicroPython에 내장된 machine.PWM을 사용합니다. GPIO18에 500 Hz PWM 출력을 만듭니다. set_load() 함수는 0에서 100 사이의 퍼센트 값을 받아 0에서 65535 사이의 duty_u16() 값으로 바꾸고, 그 레벨을 Shell에 출력합니다.
각 루프에서 부하는 2초 동안 완전히 켜지고 2초 동안 완전히 꺼집니다. 그다음 전력이 10%에서 100%까지 10% 단위로, 단계마다 0.5초씩 올라갑니다. 이어서 같은 방식으로 0%까지 내려옵니다. 1초 쉬고 루프가 다시 시작됩니다.
빠른 단계
Thonny IDE를 사용하여 ESP32에서 MicroPython 코드를 설정하고 실행하는 방법은 다음과 같습니다:
- 컴퓨터에 Thonny IDE가 설치되어 있는지 확인하세요.
- ESP32 보드에 MicroPython 펌웨어가 설치되어 있는지 확인하세요.
- ESP32에서 MicroPython이 처음이라면 ESP32 마이크로파이썬 - 시작하기 가이드부터 시작하세요.
- 제공된 다이어그램에 따라 MOSFET 모듈, LED 스트립(또는 팬), DC 전원 잭을 ESP32 보드에 연결하세요. 12V 어댑터는 아직 꽂지 마세요.
- USB 케이블로 ESP32 보드를 컴퓨터에 연결하세요.
- 컴퓨터에서 Thonny IDE를 여세요.
- Thonny에서 도구 옵션으로 이동하여 인터프리터 탭을 열고 드롭다운에서 MicroPython (ESP32)를 선택하세요.
- 제공된 MicroPython 코드를 복사하여 Thonny 편집기에 붙여넣으세요.
- 코드를 ESP32에 저장하려면:
- 저장 버튼을 클릭하거나 Ctrl+S를 누르세요.
- 저장 대화 상자에서 MicroPython 장치를 선택하세요.
- 파일 이름을 main.py로 입력하세요.
- 12V 어댑터를 DC 전원 잭에 꽂으세요.
- 초록색 실행 버튼을 클릭하거나 (또는 F5 키를 눌러) 스크립트를 실행하세요.
- LED 스트립을 보세요. 2초 동안 최대 밝기로 켜졌다가 2초 동안 꺼지고, 천천히 밝아졌다가 천천히 어두워집니다. 팬의 경우에는 대신 속도가 올라갔다 내려가는 소리가 들립니다.
- Thonny 하단의 Shell에서 메시지를 확인하세요.
스크립트 이름을 main.py로 지정하여 MicroPython 장치에 저장하면, ESP32의 전원이 켜질 때마다 자동으로 실행됩니다.
Shell에는 메시지가 나오는데 스트립이 꺼져 있나요? 부하 전원 전압을 측정해 보세요. 약 6V 이상이어야 하며, 그렇지 않으면 MOSFET이 열리지 않습니다.
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.