사용 회로와 목표
사용 회로:
[그림6-9]와 같이 멀티원 실드를 옥토보드의 내부 핀 영역에 장착합니다.
대체 회로:
[그림8-1]과 같이 브레드보드에 C3 mini와 부품들로 회로를 구성합니다. 또는 옥토보드의 외부 핀 영역에 C3 mini와 멀티원 실드을 장착해도 됩니다.
목표:
버튼1에는 핀이 눌릴 때(하강할 때) 트리거를 걸어 두고, 핀을 누를 때마다 LED1을 토글합니다.
버튼2에는 눌릴 때( 상승할 때)와 뗄 때(하강할 때) 모두 트리거를 걸어 두고, 버튼1을 누르고 있으면 LED2를 켜고 뗄 때 끄도록 합니다.
AI 프롬프트 8-1
마이크로파이썬 프로그램을 다음 조건에 따라 만들고, 코드를 설명해줘 [조건] from machine import … import time time.sleep_ms()를 사용 두 개의 LED와 두개의 버튼을 사용 모듈 pinno에는 핀 번호 상수 값이 저장되어 있음 import pinno BUTTON_1_PIN = pinno.L3_IN BUTTON_2_PIN = pinno.L4_IN LED_1_PIN = pinno.L5_IN LED_2_PIN = pinno.L6_IN LED1: 핀번호: LED_1_PIN 전류 소싱으로 연결 LED1_ON_VALUE = 1 LED1_OFF_VALUE = not LED1_ON_VALUE LED2: 핀번호: LED_2_PIN 전류 싱킹으로 연결 LED2_ON_VALUE = 0 LED2_OFF_VALUE = not LED2_ON_VALUE led1_toggle(): LED1이 켜져 있으면 off LED1이 꺼져 있으면 on 디바운스 위하여: irq(handler=None) 300ms 중지 다시 irq 실행 led2_on_off(): 버튼2의 값이 HIGH(눌렸으면) LED2를 on 버튼2의 값이 LOW(해제되었으면) LED2를 off 버튼1: 핀번호: BUTTON_1_PIN PULL_UP해야함 irq설정: falling(HIGH에서 LOW) handler: led1_toggle() 버튼2: 핀번호: BUTTON_2_PIN PULL_DOWN해야함 irq설정: rising 과 falling 동시 handler: led2_on_off() 프로그램 시작하면 Print(“버튼1을 누르면 LED1 toggle(), 버튼2를 누르면 LED2 on() 떼면 off()”) 두 LED를 off 다음은 연속 실행이야: 모드 while loop에 대하여: 1ms 중지
마이크로파이썬 코드
다음은 주어진 조건에 맞춘 마이크로파이썬 프로그램 코드입니다:
from machine import Pin import time import pinno # 핀 설정 BUTTON_1_PIN = pinno.L3_IN BUTTON_2_PIN = pinno.L4_IN LED_1_PIN = pinno.L5_IN LED_2_PIN = pinno.L6_IN # LED 상태 값 설정 LED1_ON_VALUE = 1 LED1_OFF_VALUE = not LED1_ON_VALUE LED2_ON_VALUE = 0 LED2_OFF_VALUE = not LED2_ON_VALUE # LED 핀 설정 led1 = Pin(LED_1_PIN, Pin.OUT) led2 = Pin(LED_2_PIN, Pin.OUT) # 버튼 핀 설정 button1 = Pin(BUTTON_1_PIN, Pin.IN, Pin.PULL_UP) button2 = Pin(BUTTON_2_PIN, Pin.IN, Pin.PULL_DOWN) # LED1 토글 함수 (디바운스 포함) def led1_toggle(pin): # LED1 토글 if led1.value() == LED1_ON_VALUE: led1.value(LED1_OFF_VALUE) else: led1.value(LED1_ON_VALUE) # IRQ 비활성화 (디바운스 처리) button1.irq(handler=None) # IRQ 비활성화 time.sleep_ms(300) # 300ms 대기 button1.irq(trigger=Pin.IRQ_FALLING, handler=led1_toggle) # IRQ 다시 활성화 # LED2 on/off 함수 def led2_on_off(pin): if button2.value() == 1: # 버튼2가 눌렸을 때 led2.value(LED2_ON_VALUE) else: # 버튼2가 해제되었을 때 led2.value(LED2_OFF_VALUE) # IRQ 설정: 버튼1의 FALLING 엣지에서 led1_toggle() 실행 button1.irq(trigger=Pin.IRQ_FALLING, handler=led1_toggle) # IRQ 설정: 버튼2의 RISING, FALLING에서 led2_on_off() 실행 button2.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=led2_on_off) # 프로그램 시작 시 메시지 출력 print("버튼1을 누르면 LED1 toggle(), 버튼2를 누르면 LED2 on() 떼면 off()") # LED 초기 상태 off led1.value(LED1_OFF_VALUE) led2.value(LED2_OFF_VALUE) # 메인 루프 while True: time.sleep_ms(1)
코드 설명:
-
핀 설정 및 변수 정의:
pinno
모듈에서 핀 번호 상수를 불러와 버튼과 LED 핀을 설정합니다. LED1은 전류 소싱으로 연결되고, LED2는 전류 싱킹으로 연결됩니다.LED1_ON_VALUE = 1
,LED2_ON_VALUE = 0
로 설정됩니다. -
led1_toggle 함수: LED1을 토글하는 함수입니다. 디바운스 처리를 위해, LED1을 토글한 후 버튼1의 인터럽트를 해제(
irq(handler=None)
)하고, 300ms 동안 대기 후 다시 인터럽트를 활성화합니다. -
led2_on_off 함수: 버튼2가 눌리면 LED2를 켜고, 해제되면 LED2를 끄는 함수입니다.
IRQ 설정:
- 버튼1은 PULL_UP 저항을 사용하고, FALLING(HIGH에서 LOW) 시
led1_toggle()
함수가 호출됩니다. - 버튼2는 PULL_DOWN 저항을 사용하고, RISING과 FALLING 모두에서
led2_on_off()
함수가 호출됩니다.
- 버튼1은 PULL_UP 저항을 사용하고, FALLING(HIGH에서 LOW) 시
-
프로그램 시작 시 메시지 출력: 한국어로 프로그램 동작에 대한 설명을 출력하며, LED1과 LED2를 초기 상태로 꺼둡니다.
-
메인 루프:
time.sleep_ms(1)
으로 1ms 동안 대기하면서 프로그램을 계속 실행합니다.