라즈베리파이 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] 전자공학 기초: 알아두면 쓸모있는 기본 지식
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • 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 (4)
      • 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)
  • 인기 글

  • 태그

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

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

티스토리툴바