Search
Duplicate

[pyphy]1.micro 파이썬 기초문법&함수

목차(클릭하세요)
핀맵과 함께 보는 것을 추천

micro 파이썬 기초 핵심 요약

1. 하드웨어 제어 (machine 모듈)

하드웨어 제어의 가장 기본이 되는 핀 설정과 입출력 함수를 모아 놓은 모듈
대부분의 코드에 from machine import Pin가 상단위치

1-1.디지털 입출력 (Pin)함수

LED를 켜거나 버튼 입력을 받을 때 사용
핀 설정 메서드 (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은 거의 모든 출력 핀에서 사용할 수 있어 훨씬 범용적
LED 밝기 조절이나 모터 속도 제어, 부저 음계 출력에 사용
from machine import Pin, PWM # PWM 객체 생성 pwm = PWM(Pin(15)) # 주파수 설정 (Hz) pwm.freq(1000) # 듀티 사이클(출력 강도) 설정 (0 ~ 1023) pwm.duty(512) # 약 50% 강도
Python
복사
참고: 주파수가 높을수록 해상도는 낮아질 수 있음
마이크로 파이썬 공식 문서에 따르면 기본 주파수(base frequency)가 증가할수록 듀티 해상도(duty resolution)는 감소한다"는 trade-off 관계가 명시되어 있음
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)

다양한 색상의 LED를 제어
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)

횟수가 정해진 반복:for문,
조건이 정해진 반복: 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 센서 연결 시 주의