목차(클릭하세요)
핀맵과 함께 보는 것을 추천
micro 파이썬 기초 핵심 요약
1. 하드웨어 제어 (machine 모듈)
하드웨어 제어의 가장 기본이 되는 핀 설정과 입출력 함수를 모아 놓은 모듈
•
대부분의 코드에 from machine import Pin가 상단위치
1-1.디지털 입출력 (Pin)함수
•
핀 설정 메서드 (Pin.OUT: 출력, Pin.IN: 입력)
•
Pin 객체는 단순히 디지털 제어뿐만 아니라, 다른 고급 기능들을 활성화하기 위한 '기본 재료'로도 필수적으로 사용
◦
아날로그 입력 (ADC): 아날로그 값을 읽으려면 ADC(Pin(34))와 같이 Pin 객체를 ADC 클래스에 넣어주어야 함
◦
PWM (펄스 폭 변조): LED 밝기 조절 등을 위해선 PWM(Pin(15))처럼 Pin 객체를 PWM 클래스에 전달해야 함
from machine import Pin
led = Pin(2, Pin.OUT) # 2번 핀을 출력으로 설정 (내장 LED)
button = Pin(33, Pin.IN) # 33번 핀을 입력으로 설정
# 출력 제어 (1: 켜짐/High, 0: 꺼짐/Low)
led.value(1) # LED 켜기
led.value(0) # LED 끄기
# 입력 값 읽기
status = button.value() # 버튼 상태 읽기 (눌리면 1, 안 눌리면 0 등)
Python
복사
참고: led.on() 또는 led.off() 함수도 사용가능
1-2.아날로그 입력 (ADC)
from machine import ADC, Pin
# ADC 객체 생성 (GPIO 32~39번 권장)
pot = ADC(Pin(34))
# 전압 감쇠 설정 (3.3V 입력을 받으려면 필수!)
# ATTN_11DB: 0V ~ 3.3V 범위 측정
pot.atten(ADC.ATTN_11DB)
# 해상도 설정 (기본 12bit: 0 ~ 4095)
pot.width(ADC.WIDTH_12BIT)
# 값 읽기
val = pot.read() # 0 ~ 4095 사이의 정수 값 반환
Python
복사
주의: 와이파이 사용 시 ADC2 핀(GPIO 0, 2, 4, 12-15, 25-27)은 사용할 수 없으므로 ADC1 핀(32-39)을 사용
1-3.PWM (펄스 폭 변조)
•
아날로그 출력이 따로 없기 때문에 PWM방식으로 아날로그 엑츄에이터를 활용 할 때 필수적으로 사용
◦
마이크로컨트롤러(ESP32 등)는 기본적으로 0(꺼짐)과 1(켜짐)만 표현할 수 있는 디지털 장치
◦
진짜 아날로그 핀(DAC) 존재: ESP32에는 DAC(Digital to Analog Converter)라고 하는 '진짜 아날로그 전압'을 내보내는 핀이 2개(GPIO 25, 26) 존재
•
하지만 PWM을 쓰는 이유??
1. 전력 효율: DAC 핀은 전류가 약해 모터나 고휘도 LED를 직접 구동하기 어려움
2. 범용성: DAC는 특정 핀(2개)만 가능하지만, PWM은 거의 모든 출력 핀에서 사용할 수 있어 훨씬 범용적
from machine import Pin, PWM
# PWM 객체 생성
pwm = PWM(Pin(15))
# 주파수 설정 (Hz)
pwm.freq(1000)
# 듀티 사이클(출력 강도) 설정 (0 ~ 1023)
pwm.duty(512) # 약 50% 강도
Python
복사
참고: 주파수가 높을수록 해상도는 낮아질 수 있음
•
TMI: PWM(펄스 폭 변조) 신호는 **내부 타이머(Timer)**가 시스템 클럭(Clock)을 하나씩 세면서(Counting) 만들어잠
•
**해상도(Resolution)**는 한 주기 동안 쪼갤 수 있는 단계의 수 (예: 10-bit 해상도 = 210 = 1024단계)
•
**주파수(Frequency)**는 1초에 이 주기가 몇 번 반복되는지를 나타냄
트레이드오프의 이유: 주파수를 높이려면 한 주기의 시간을 짧게 만들어야 함
주기가 짧아지면 타이머가 카운트할 수 있는 시간도 줄어들기 때문에, 그 짧은 시간 안에 많은 단계(높은 해상도)를 쪼개 넣을 수 없게 됨, 반대로 해상도를 높이려면 타이머가 충분히 많이 카운트해야 하므로 주기가 길어져야(주파수가 낮아져야) 함
2. 시간 및 타이머 제어
2-1.시간 지연 (Time)
import time
time.sleep(1) # 1초 대기
time.sleep_ms(500) # 0.5초 (500ms) 대기
Python
복사
2-2.타이머 (Timer)
from machine import Timer
# 콜백 함수 정의 (타이머가 울릴 때 실행할 동작)
def work_callback(t1):
"""실제 작업 수행"""
print("Timer Tick!")
def stop_callback(t2):
"""10초 후 작업 타이머 종료"""
print("Auto-stopping...")
tim1.deinit()
t2.deinit() # 자신도 종료
# 하드웨어 타이머 1~3번 사용 (0번은 시리얼 통신을 위해 예약되어 있으니 사용하지 않는 것을 추천)
# 타이머 1: 작업용 (1초마다)
tim1 = Timer(1)
# 타이머 시작 (period: 간격 ms, mode: 반복/1회, callback: 실행함수)
tim1.init(period=1000, mode=Timer.PERIODIC, callback=work_callback)
# 참고: mode설정
#Timer.PERIODIC: 주기적으로 계속 반복
#Timer.ONE_SHOT: 한 번만 실행하고 멈춤
# 타이머 2: 종료용 (10초 뒤 한 번만)
tim2 = Timer(2)
tim2.init(period=10000, mode=Timer.ONE_SHOT, callback=stop_callback)
Python
복사
callback: 시간이 되었을 때 실행할 함수를 지정하는 옵션
•
깜빡이는 용도의 타이머와 종료용 타이머를 2개 동시 작동 시킴
3. 주요 센서/라이브러리 활용
3-1.네오픽셀 (NeoPixel)
from machine import Pin
from neopixel import NeoPixel
# 설정: 14번 핀에 연결된 12구 네오픽셀
pin = Pin(14, Pin.OUT)
np = NeoPixel(pin, 12)
# 색상 지정 (순서: Red, Green, Blue / 0~255)
np = (255, 0, 0) # 첫 번째 LED 빨간색 설정
np = (0, 255, 0) # 두 번째 LED 초록색 설정
# write메서드: 설정한 색상을 실제로 출력
np.write()
Python
복사
3-2.온습도 센서 (DHT11)
import dht
from machine import Pin
import time
# 센서 객체 생성 (핀 번호 확인)
sensor = dht.DHT11(Pin(27))
# 측정 및 값 읽기
sensor.measure() # 측정 수행
temp = sensor.temperature() # 온도 (°C)
hum = sensor.humidity() # 습도 (%)
Python
복사
4. 파이썬 반복문과 제어문, 함수
4-1.반복문 (For / While)
조건이 정해진 반복: while문
# 횟수 반복 (0부터 9까지 10번)
for i in range(10):
print("Count:", i)
# 조건 반복 (무한 루프)
while True:
print("Running...")
time.sleep(1)
Python
복사
4-2.조건문 (If)
from machine import ADC, Pin
# ADC 객체 생성 (GPIO 32~39번 권장)
pot = ADC(Pin(34))
# 센서 값에 따른 분기 처리
val = pot.read()
if val > 3000:
print("아주 밝음")
elif val > 1000:
print("적당함")
else:
print("어두움")
Python
복사
4-3. 함수
•
아래의 def가 함수 선언
from machine import Timer
# 콜백 함수 정의 (타이머가 울릴 때 실행할 동작)
def work_callback(t1):
"""실제 작업 수행"""
print("Timer Tick!")
def stop_callback(t2):
"""10초 후 작업 타이머 종료"""
print("Auto-stopping...")
tim1.deinit()
t2.deinit() # 자신도 종료
# 하드웨어 타이머 1~3번 사용 (0번은 시리얼 통신을 위해 예약되어 있으니 사용하지 않는 것을 추천)
# 타이머 1: 작업용 (1초마다)
tim1 = Timer(1)
# 타이머 시작 (period: 간격 ms, mode: 반복/1회, callback: 실행함수)
tim1.init(period=1000, mode=Timer.PERIODIC, callback=work_callback)
# 참고: mode설정
#Timer.PERIODIC: 주기적으로 계속 반복
#Timer.ONE_SHOT: 한 번만 실행하고 멈춤
# 타이머 2: 종료용 (10초 뒤 한 번만)
tim2 = Timer(2)
tim2.init(period=10000, mode=Timer.ONE_SHOT, callback=stop_callback)
Python
복사
ESP32 핀 맵 꿀팁 (안전한 사용을 위해)
•
입력 전용 핀: GPIO 34, 35, 36, 39 (출력 불가, 입력만 가능).
•
부팅 관련 핀: GPIO 0, 2 (부팅 시 연결 주의).
•
자유롭게 쓰기 좋은 핀: GPIO 4, 5, 16, 17, 18, 19, 21, 22, 23 등.
•
전압: ESP32는 3.3V로 동작
5V 센서 연결 시 주의

