GPIO (General Purpose Input/Output) 란?
라즈베리파이(Raspberry Pi)가 일반적인 미니 PC를 넘어 IoT(사물인터넷) 핵심 장비로 불리는 가장 큰 이유는 보드 상단에 위치한 40개의 GPIO 핀(Pins) 덕분입니다. GPIO는 이름 그대로 범용적인 목적의 입출력을 담당하는 핀으로, 디지털 신호를 보내거나(Output) 외부 장치로부터 전기적 신호를 읽어 들일(Input) 수 있습니다.
개발자는 파이썬, C, Node.js 등의 프로그래밍 언어를 이용해 이 핀들을 제어함으로써 LED 불빛을 켜고, 모터를 회전시키고, 온습도 센서나 카메라 등 무수히 많은 하드웨어 컴포넌트와 통신할 수 있습니다.
GPIO 핀 구조 및 넘버링 방식 (Pinout)
라즈베리파이 모델 B+ 이후 버전을 기준으로 총 40개의 핀이 2열(20개씩)로 배열되어 있습니다. 핀 번호를 부르는 기준은 크게 두 가지로 나뉩니다.
- BOARD 모드 (물리적 번호): 보드에 인쇄된 핀의 1번부터 40번까지 순서대로 부르는 직관적인 번호입니다. 코드가 물리적 연결과 직관적으로 일치합니다.
- BCM 모드 (Broadcom 모드): 머리말 `GPIO` 뒤에 붙는 논리적인 프로세서(Broadcom SoC) 내부 할당 번호입니다. 회로도 등 전문 문서를 볼 때 널리 쓰이지만 물리 번호와 다소 불규칙하게 매핑되어 있어 혼동하기 쉽습니다. (예: 물리적 11번 핀 = BCM GPIO 17번)
추가로, 모든 핀이 다 범용 입출력 용도는 아닙니다. 3.3V와 5V 전원을 제공하는 VCC 핀, 회로의 기준 전압인 GND(Ground, 접지) 핀, 그리고 통신 전용 프로토콜을 위한 I2C, SPI, UART 특수 핀들이 섞여 있으므로 연결하기 전 반드시 라즈베리파이 Pinout 다이어그램을 참고해야 합니다.
실습: LED 깜빡이기 (Blink)
GPIO 제어의 가장 기초가 되는 "Hello, World"인 LED 점멸 실습을 파이썬 코드로 살펴보겠습니다. 라즈베리파이에 연결된 LED를 1초 간격으로 켜고 끄는 예제입니다.
가장 많이 쓰이는 라이브러리는 `RPi.GPIO`와 초보자에게 더 친숙한 `gpiozero`가 있습니다. 이번에는 전통적이고 직관적인 `RPi.GPIO` 방식을 사용합니다.
import RPi.GPIO as GPIO
import time
# 1. 핀 넘버링 기준 설정: 물리적 핀 번호(BOARD)를 사용하겠다고 선언
GPIO.setmode(GPIO.BOARD)
# LED 양극(+) 다리가 연결된 물리 11번 핀 지정
LED_PIN = 11
# 2. 핀 출력(OUT) 모드로 설정
GPIO.setup(LED_PIN, GPIO.OUT)
try:
print("LED 테스트를 시작합니다. (종료: Ctrl+C)")
while True:
# 핀에 전기 신호 인가 (3.3V 전압 출력 -> LED 켜짐)
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1) # 1초 지연
# 핀의 전기 신호 차단 (0V -> LED 꺼짐)
GPIO.output(LED_PIN, GPIO.LOW)
time.sleep(1)
except KeyboardInterrupt:
print("\n프로그램을 종료합니다.")
finally:
# 3. 종료 시 사용했던 핀 설정을 모두 초기화하여 안전한 상태로 복구
GPIO.cleanup()
안전 수칙 (Warning)
GPIO 회로를 구성할 때 잘못된 핀(특히 5V 라인)에 선을 잘못 꽂거나 합선(Short)이 발생하면 라즈베리파이의 메인 칩셋(SoC)이 영구적으로 손상될 수 있습니다. 다음 두 가지를 주의하세요.
- LED와 핀 사이에는 과전류를 막아줄 저항(Resistor, 보통 220Ω ~ 330Ω)을 필수로 연결해야 합니다.
- 회로 배선을 변경하거나 점퍼 선을 꽂고 뺄 때는 반드시 라즈베리파이 전원을 끈(Shutdown) 상태에서 작업해야 합니다.
이제 코드를 통해 모니터 너머의 현실 세계(Hardware)를 제어하는 첫걸음을 내디뎠습니다. 다음 포스트에서는 스위치의 입력값을 읽어 들이는 Input 모드에 대해 알아보겠습니다.