라즈베리파이 GPIO 완전 정복: 기초부터 8채널 릴레이 제어까지

2025. 5. 30. 10:42·하드웨어
반응형

안녕하세요! 오늘은 라즈베리파이의 GPIO(General Purpose Input/Output)에 대해 기초부터 실전 활용까지 완벽하게 마스터해보겠습니다. 🎯

많은 분들이 "GPIO가 뭔지는 알겠는데 실제로 어떻게 사용하는 거지?"라고 궁금해하시죠. 이 글을 읽고 나면 GPIO의 모든 것을 이해하고 8채널 릴레이로 실제 가전제품까지 제어할 수 있게 됩니다! 💪

🎯 이 가이드에서 배울 내용

  • GPIO란 무엇인가? 완벽한 이해
  • pinout 명령어로 GPIO 핀맵 확인하기
  • 8채널 릴레이 확장 보드 연결 및 제어
  • Node-RED를 활용한 스마트 릴레이 시스템 구축
  • 안전한 고전압 장치 제어 방법

🔌 GPIO란 무엇인가?

GPIO의 정의와 역할

GPIO (General Purpose Input/Output)는 라즈베리파이가 외부 세계와 소통하는 창구입니다. 간단히 말해서 디지털 신호를 주고받을 수 있는 핀들이죠.

GPIO의 핵심 특징

✅ 디지털 입출력: HIGH(3.3V) 또는 LOW(0V) 신호
✅ 프로그래밍 제어: 소프트웨어로 자유자재로 제어
✅ 실시간 반응: 즉각적인 하드웨어 제어 가능
✅ 다양한 모드: 입력, 출력, PWM, I2C, SPI 등

GPIO vs 일반 포트의 차이점

일반 컴퓨터 포트 (USB, HDMI 등)

  • 정해진 용도로만 사용
  • 복잡한 프로토콜 필요
  • 고수준 데이터 전송

GPIO 포트

  • 용도를 자유롭게 정의 가능
  • 간단한 ON/OFF 제어
  • 하드웨어 직접 제어

GPIO의 동작 원리

출력 모드 (Output)

라즈베리파이 → GPIO 핀 → 외부 장치 (LED, 릴레이 등)

예시: 
GPIO 핀에 3.3V 출력 → LED 켜짐
GPIO 핀에 0V 출력 → LED 꺼짐

입력 모드 (Input)

외부 센서 → GPIO 핀 → 라즈베리파이

예시:
버튼 눌림 → GPIO 핀으로 3.3V 입력 → 프로그램에서 감지

📍 라즈베리파이 GPIO 핀맵 상세 분석

40핀 GPIO 구성 (라즈베리파이 4B 기준)

전원 관련 핀들

3.3V 전원 핀:
- 핀 1, 핀 17
- 최대 출력: 50mA (전체 합계)
- 용도: 센서, 소형 모듈 전원 공급

5V 전원 핀:
- 핀 2, 핀 4  
- 외부 어댑터에서 직접 공급
- 용도: 릴레이, 모터 드라이버 전원

GND (접지) 핀:
- 핀 6, 9, 14, 20, 25, 30, 34, 39
- 모든 회로의 기준점
- 반드시 연결해야 하는 필수 핀

특수 기능 핀들 (대체 기능 보유)

I2C 통신:
- GPIO2 (핀 3): SDA (데이터 라인)
- GPIO3 (핀 5): SCL (클럭 라인)
- 용도: 센서, 디스플레이 연결

UART 시리얼 통신:
- GPIO14 (핀 8): TxD (송신)
- GPIO15 (핀 10): RxD (수신)
- 용도: GPS, 블루투스 모듈 연결

SPI 통신:
- GPIO10 (핀 19): MOSI (마스터→슬레이브)
- GPIO9 (핀 21): MISO (슬레이브→마스터)
- GPIO11 (핀 23): SCLK (클럭)
- GPIO8 (핀 24): CE0 (칩 선택 0)
- GPIO7 (핀 26): CE1 (칩 선택 1)

범용 GPIO 핀들 (자유롭게 사용 가능)

추천 핀들:
- GPIO4 (핀 7): 가장 안전하게 사용 가능
- GPIO17 (핀 11): 일반적으로 많이 사용
- GPIO18 (핀 12): PWM 지원 (밝기 조절 등)
- GPIO27 (핀 13): 일반 디지털 IO
- GPIO22 (핀 15): 일반 디지털 IO
- GPIO23 (핀 16): 일반 디지털 IO
- GPIO24 (핀 18): 일반 디지털 IO

GPIO 전기적 특성 이해

중요한 전압/전류 제한

⚡ GPIO 출력 전압: 3.3V (절대 5V 아님!)
⚡ 단일 핀 최대 전류: 16mA
⚡ 전체 GPIO 핀 합계: 50mA 이하
⚡ 입력 전압 한계: 3.6V (초과 시 손상!)

안전한 사용을 위한 팁

✅ LED 연결 시 반드시 저항 사용 (220Ω 이상)
✅ 5V 장치는 레벨 컨버터 사용
✅ 고전류 장치는 릴레이나 트랜지스터 사용
❌ 직접 5V를 GPIO에 연결 금지
❌ 모터를 직접 GPIO에 연결 금지

🔍 pinout 명령어로 GPIO 확인하기

pinout 명령어 사용법

기본 pinout 명령어

# 터미널에서 실행
pinout

이 명령어를 실행하면 현재 라즈베리파이의 정확한 핀맵이 텍스트로 출력됩니다!

pinout 출력 예시

🔧 8채널 릴레이 확장 보드 이해하기

8채널 릴레이 보드란?

8채널 릴레이 보드는 라즈베리파이로 8개의 고전압/고전류 장치를 안전하게 제어할 수 있게 해주는 확장 보드입니다.

릴레이의 동작 원리

라즈베리파이 3.3V 신호 → 릴레이 코일 → 자기장 생성 → 스위치 동작
→ 고전압 회로 ON/OFF (완전히 분리된 회로)

8채널 릴레이 보드 주요 특징

✅ 8개 독립 릴레이: 각각 다른 장치 제어 가능
✅ 광절연: 라즈베리파이와 완전 분리로 안전
✅ LED 표시: 각 릴레이 동작 상태 시각적 확인
✅ 고전압 지원: AC 220V, DC 30V까지 안전 제어
✅ 고전류 지원: 10A까지 제어 가능

하드웨어 연결 방법

릴레이 보드 핀 구성

전원 연결:
VCC → 라즈베리파이 5V (핀 2 또는 핀 4)
GND → 라즈베리파이 GND (핀 6, 9, 14 등)

제어 신호 연결:
IN1 → GPIO4 (핀 7)
IN2 → GPIO17 (핀 11)  
IN3 → GPIO18 (핀 12)
IN4 → GPIO27 (핀 13)
IN5 → GPIO22 (핀 15)
IN6 → GPIO23 (핀 16)
IN7 → GPIO24 (핀 18)
IN8 → GPIO25 (핀 22)

실제 연결 단계별 가이드

1단계: 안전 확인
⚠️ 모든 전원을 차단한 상태에서 작업
⚠️ 라즈베리파이와 릴레이 보드 모두 전원 OFF
⚠️ 제어할 가전제품도 플러그 뽑기
2단계: 릴레이 보드 전원 연결
# 점퍼선으로 연결
라즈베리파이 5V (핀 2) → 릴레이 보드 VCC (빨간선)
라즈베리파이 GND (핀 6) → 릴레이 보드 GND (검은선)
3단계: 제어 신호 연결
# 8개 제어선 연결 (색깔별로 구분 추천)
GPIO4 (핀 7) → IN1 (주황선)
GPIO17 (핀 11) → IN2 (노란선)  
GPIO18 (핀 12) → IN3 (초록선)
GPIO27 (핀 13) → IN4 (파란선)
GPIO22 (핀 15) → IN5 (보라선)
GPIO23 (핀 16) → IN6 (회색선)
GPIO24 (핀 18) → IN7 (흰색선)
GPIO25 (핀 22) → IN8 (갈색선)
4단계: 고전압 장치 연결
⚠️ 매우 주의! 220V 고전압 작업

각 릴레이의 COM, NO, NC 단자:
- COM (Common): 공통 단자
- NO (Normally Open): 평상시 열림, 릴레이 동작시 연결
- NC (Normally Closed): 평상시 연결, 릴레이 동작시 차단

일반적인 연결:
전원 → COM
COM → NO → 장치 → 중성선
(릴레이 ON → 장치 동작)

💻 Node-RED로 8채널 릴레이 제어하기

기본 단일 릴레이 제어

1번 릴레이 제어 플로우

[Inject: ON] → [rpi gpio out: GPIO5]
[Inject: OFF] → [rpi gpio out: GPIO5]

rpi gpio out 노드 설정

// GPIO4 (1번 릴레이) 설정
Pin: GPIO 5
Type: Digital output
Initialize pin state: 체크
Initial level: low (릴레이 OFF 상태)
Name: 1번 릴레이

8채널 전체 제어 시스템

마스터 제어 Function 노드

// 릴레이 설정 - 수정된 GPIO 핀 번호
const RELAY_CONFIG = {
    pins: [5, 6, 13, 16, 19, 20, 21, 26], // 수정된 GPIO 핀 번호
    labels: ["릴레이1", "릴레이2", "릴레이3", "릴레이4", "릴레이5", "릴레이6", "릴레이7", "릴레이8"]
};

// 현재 릴레이 상태 가져오기 (1=OFF, 0=ON - 릴레이는 LOW 액티브)
let relayStates = context.get('relayStates') || {
    1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1  // 기본값 1 (OFF)
};

// 입력 처리: { relay: 3, state: "on" } 또는 { relay: "all", state: "off" }
let input = msg.payload;
let outputs = [null, null, null, null, null, null, null, null]; // 8개 출력

function setRelayOutput(relayNum, state) {
    if (relayNum < 1 || relayNum > 8) return;
    
    // state를 GPIO 출력값으로 변환 (릴레이는 LOW 액티브)
    let gpioValue;
    if (state === "on" || state === 1) {
        gpioValue = 0;  // ON = LOW (0)
        relayStates[relayNum] = 0;
    } else {
        gpioValue = 1;  // OFF = HIGH (1) 
        relayStates[relayNum] = 1;
    }
    
    // rpi-gpio out 노드로 보낼 메시지
    outputs[relayNum - 1] = {
        topic: `relay${relayNum}`,
        payload: gpioValue, // GPIO 출력값 (0 또는 1)
        relayNum: relayNum,
        pin: RELAY_CONFIG.pins[relayNum - 1],
        label: RELAY_CONFIG.labels[relayNum - 1],
        relayState: state // 실제 릴레이 상태
    };
}

// 단일 릴레이 제어
if (typeof input.relay === 'number' && input.relay >= 1 && input.relay <= 8) {
    setRelayOutput(input.relay, input.state);
}
// 모든 릴레이 제어
else if (input.relay === "all") {
    for (let i = 1; i <= 8; i++) {
        setRelayOutput(i, input.state);
    }
}
// 토글 기능
else if (input.toggle && input.toggle >= 1 && input.toggle <= 8) {
    let currentState = relayStates[input.toggle] || 1; // 기본값 1 (OFF)
    let newState = currentState === 1 ? "on" : "off";
    setRelayOutput(input.toggle, newState);
}

// 상태 저장
context.set('relayStates', relayStates);

// 활성 릴레이 로그 (0 = ON 상태)
let activeRelays = [];
for (let i = 1; i <= 8; i++) {
    if (relayStates[i] === 0) activeRelays.push(i);
}
node.log(`Active relays: [${activeRelays.join(', ')}]`);

return outputs;

 

🔧 문제 해결 및 디버깅

자주 발생하는 문제들

릴레이가 동작하지 않을 때

# 1. GPIO 상태 확인
raspi-gpio get 4  - 라즈베리 4
pinctrl get 4 - 라즈베리 5

# 2. 전원 공급 확인
# 멀티미터로 5V, 3.3V 전압 측정

# 3. 연결 상태 확인
# 점퍼선 접촉 불량 여부

# 4. 릴레이 보드 LED 확인
# 제어신호가 들어왔을 때 LED가 켜지는지 확인

Node-RED 디버깅 방법

// Debug Function 노드로 상세 정보 출력
node.log("현재 상태: " + JSON.stringify(msg.payload));
node.warn("주의: 비정상 동작 감지");
node.error("오류: " + error.message);

// Context 변수 확인
var allContext = context.keys();
node.log("저장된 변수들: " + JSON.stringify(allContext));

성능 문제 해결

// 메모리 사용량 모니터링
var memUsage = process.memoryUsage();
node.log(`메모리 사용량: ${memUsage.rss / 1024 / 1024} MB`);

// GPIO 응답 시간 측정
var startTime = Date.now();
// GPIO 제어 코드
var responseTime = Date.now() - startTime;
node.log(`GPIO 응답시간: ${responseTime}ms`);

 


💬 여러분의 릴레이 프로젝트를 공유해주세요!

  • 8채널 릴레이로 어떤 장치들을 제어하고 계신가요?
  • 가장 유용했던 자동화 기능은 무엇인가요?
  • 다음에 도전해보고 싶은 고급 기능이 있다면 댓글로 알려주세요!

⚠️ 안전 사용 재확인

  • 고전압 작업 시 반드시 전원 차단
  • 릴레이 정격 전류 확인 (10A 이하)
  • 정기적인 연결 상태 점검
  • 비상 정지 기능 항상 준비

🔗 참고 자료

  • 라즈베리파이 공식 GPIO 문서
  • Node-RED 공식 가이드

#라즈베리파이 #GPIO #릴레이제어 #NodeRED #스마트홈 #IoT #자동화 #전기안전 #pinout #8채널릴레이

저작자표시 비영리 변경금지 (새창열림)

'하드웨어' 카테고리의 다른 글

라즈베리파이 USB 카메라 완벽 설정: 연결부터 실시간 스트리밍까지  (0) 2025.05.30
RS485 통신 완전 정복: 산업용 통신의 표준  (4) 2025.05.30
Node-RED로 XY-MD02 온습도 센서 실시간 모니터링하기  (1) 2025.05.29
[아두이노&라즈베리파이 완전정복 #4] 전자공학 기초: 알아두면 쓸모있는 기본 지식  (3) 2025.05.26
[아두이노&라즈베리파이 완전정복 #3] 개발 환경 구축하기: 첫 번째 발걸음  (2) 2025.05.25
'하드웨어' 카테고리의 다른 글
  • 라즈베리파이 USB 카메라 완벽 설정: 연결부터 실시간 스트리밍까지
  • RS485 통신 완전 정복: 산업용 통신의 표준
  • Node-RED로 XY-MD02 온습도 센서 실시간 모니터링하기
  • [아두이노&라즈베리파이 완전정복 #4] 전자공학 기초: 알아두면 쓸모있는 기본 지식
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (730)
      • 스마트팜 (1)
      • 상품 추천 (223)
      • DataBase (0)
        • MongoDB (4)
        • PostgreSQL (0)
      • 하드웨어 (19)
      • 일기장 (4)
      • 파이썬 (131)
        • Basic (42)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (5)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    unity
    Python
    C#
    devlife
    rtsp
    셀레니움
    스마트스토어리뷰
    카페24리뷰이관
    카페24리뷰
    ipcamera
    codingcommunity
    라떼우유
    programming101
    cv2
    상품 리뷰 크롤링
    codingtips
    스크립트 실행 순서
    리뷰관리
    programmerlife
    긴유통기한우유
    쇼핑몰리뷰
    유니티
    믈레코비타멸균우유
    파이썬
    learntocode
    appdevelopment
    스크립트 실행
    리뷰이관
    list
    리스트
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
라즈베리파이 GPIO 완전 정복: 기초부터 8채널 릴레이 제어까지
상단으로

티스토리툴바