[IOT-004][기초] GPIO로 버튼을 읽고 LED를 켜기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[IOT-004][기초] GPIO로 버튼을 읽고 LED를 켜기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 244회 작성일 26-08-31 18:36

본문

[이번 수업]
GPIO(General-Purpose Input/Output, 범용 입출력 핀)로 버튼 상태를 읽고 LED를 켭니다. 버튼은 주변 상태를 입력하는 가장 단순한 센서, LED는 전기 신호를 빛으로 바꾸는 액추에이터 역할을 합니다.

[선수지식]
IOT-001~003의 보드·펌웨어·직렬 통신 기초가 필요합니다. MicroPython이 설치된 RP2 계열 보드, 브레드보드, 버튼, LED, 330Ω 저항, 점퍼선을 준비하세요.

[학습목표]
1. GPIO 입력과 출력의 차이를 설명한다.
2. 내부 풀업 입력의 0과 1을 올바르게 해석한다.
3. 버튼 떨림을 간단히 줄이고 LED를 안전하게 끈다.

[핵심개념]
GPIO 입력은 핀의 디지털 전압 상태를 0 또는 1로 읽고, 출력은 0 또는 1을 내보냅니다. `Pin.IN`은 입력, `Pin.OUT`은 출력 모드입니다. `Pin.PULL_UP`은 입력을 내부 저항으로 기본 1에 잡습니다. 버튼을 GND에 연결하면 누르지 않았을 때 1, 눌렀을 때 0이므로 코드에서는 `value() == 0`을 pressed로 해석합니다. 이를 액티브 로우(active-low, 0일 때 동작)라고 합니다.

기계식 버튼 접점은 한 번 눌러도 아주 짧게 여러 번 붙었다 떨어질 수 있습니다. 이를 바운스라고 합니다. 예제는 값을 읽고 20ms 뒤 다시 읽어 두 값이 같을 때만 사용합니다. 완벽한 산업용 필터는 아니지만 첫 실습에서 중복 변화를 줄이는 방법입니다.

센서는 현실의 값을 전기 신호로 바꾸고, 액추에이터는 전기 신호를 빛·소리·움직임으로 바꿉니다. 단, GPIO가 직접 감당할 수 없는 부하는 별도 구동 회로가 필요합니다.

[따라하기]
USB 전원을 분리한 상태에서 배선합니다. GP14(물리 19번)와 GND(물리 18번) 사이에 버튼을 연결합니다. GP15(물리 20번)에서 330Ω 저항, LED 긴 다리(애노드), LED 짧은 다리(캐소드), GND 순서로 연결합니다. 다른 보드를 쓴다면 번호를 그대로 믿지 말고 그 보드의 핀 배치와 전압을 확인합니다.

아래 내용을 gpio_demo.py로 저장하세요.

```python
from machine import Pin
from time import sleep_ms

button = Pin(14, Pin.IN, Pin.PULL_UP)
led = Pin(15, Pin.OUT, value=0)
last = None

try:
    while True:
        first = button.value()
        sleep_ms(20)
        if button.value() != first:
            continue

        pressed = first == 0
        led.value(1 if pressed else 0)
        if pressed != last:
            print("pressed=", 1 if pressed else 0)
            last = pressed
finally:
    led.value(0)
```

구문만 확인하려면 Windows에서 `py -m py_compile gpio_demo.py`, macOS·Linux에서 `python3 -m py_compile gpio_demo.py`를 실행합니다. 하드웨어 동작은 MicroPython 보드에서만 확인할 수 있습니다. 공식 도구는 Windows에서 `py -m pip install mpremote`, macOS·Linux에서 `python3 -m pip install mpremote`로 설치하고, 보드를 USB로 연결한 뒤 `mpremote run gpio_demo.py`를 실행합니다.

처음에는 `pressed= 0`이 표시되고 LED가 꺼집니다. 버튼을 누르면 `pressed= 1`과 함께 LED가 켜지고, 놓으면 다시 `pressed= 0`과 함께 꺼집니다. 종료는 Ctrl+C입니다. `finally`가 실행되면 LED를 0으로 돌립니다.

[흔한 실수]
물리 핀 번호와 GP 번호를 혼동하면 다른 핀에 연결할 수 있습니다. 풀업 회로에서 0이 눌림이라는 점도 자주 뒤집습니다. LED 방향이나 저항을 빼먹으면 동작하지 않거나 부품을 손상시킬 수 있습니다.

[보안 주의]
배선 변경 전 USB와 모든 외부 전원을 분리하세요. 이 실습은 보드가 허용하는 저전압 GPIO에서만 진행하고 가정용 교류 전원에는 절대 연결하지 않습니다. 모터·펌프·릴레이 코일을 GPIO에 직접 연결하지 말고 정격에 맞는 드라이버, 보호 소자, 전원을 사용하세요. 확신이 없으면 실제 부하 대신 LED로 검증합니다. 네트워크 기능을 추가할 때는 비밀번호나 토큰을 코드에 넣지 말고 격리된 본인 장비에서만 실습하세요.

[직접 해볼 과제]
1. 버튼을 누르면 LED가 꺼지고 놓으면 켜지도록 출력 조건을 반대로 바꾸세요.
2. LED 상태가 바뀐 횟수를 세어 함께 출력하세요.
3. sleep_ms 값을 5, 20, 100으로 바꾸고 반응 속도 차이를 기록하세요.

[확인문제]
1. 내부 풀업을 사용한 버튼이 눌렸을 때 왜 0이 되나요?
2. 20ms 뒤 값을 다시 읽는 이유는 무엇인가요?
3. 모터를 GPIO에 직접 연결하면 안 되는 이유는 무엇인가요?

[다음 학습]
IOT-005에서는 I2C와 SPI로 여러 핀을 사용하는 디지털 센서와 통신합니다.

[공식 참고 자료]
MicroPython Pin: https://docs.micropython.org/en/latest/library/machine.Pin.html
MicroPython time: https://docs.micropython.org/en/latest/library/time.html
MicroPython mpremote: https://docs.micropython.org/en/latest/reference/mpremote.html
보드 공식 핀 배치: https://datasheets.raspberrypi.com/pico/Pico-2-Pinout.pdf

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,344
어제
6,862
최대
16,772
전체
770,295
Copyright © 소유하신 도메인. All rights reserved.