memo6759 님의 블로그
2025-10-14(라즈베리파이) 본문
1교시
라즈베리파이 gpi 3.3
대쉬보드를 웹인 형태로 만들어주고 거기에 욜로 scv 같은 ai 플랫폼 구축
hdc에서 사용하고 있는 그런 플랫폼 경험 할 수 있음
라즈베리파이가 뭐지? 전자회로는 어떻게 돌아가지? 코드 등 흐름을 파악하는게 더 중요
웹으로 들어가면 클라이언트에 대한 내용 이해
운행될때마다 이미지 작업 현실은 라즈베리파이는 전원에다가 연결해서 선을 꽂아넣고 있음
외부 배터리를 사용해야함,
배터리를 연결해서 가는 경우는 아두이누 rc카 같은 경우는 배터리가 있음 2개 부족 4개는 기본으로 가야함 배터리를 넣고
외부 배터리를 넣었는데 부족할 수 있음
라즈베리파이란?
- 초소형 컴퓨터로, 모니터·키보드 없이도 동작 가능
- 운영체제(OS)를 설치하면 일반 PC처럼 프로그램 실행 가능
- GPIO(General Purpose Input Output) 핀을 통해
센서, LED, 모터 등 전자부품을 제어할 수 있음 - 파이썬(Python)으로 회로를 제어하는 코드를 작성하여 실습함
- 라즈베리파이는 항상 전원에 연결되어 있어야 함
(5V 전원 어댑터나 외부 보조배터리 사용 가능) - 외부 배터리 사용 시 주의점
- 전압이 부족하면 작동 불안정
- RC카 같은 아두이노 기반 기기는 보통 AA 배터리 4개 이상 필요
- 라즈베리파이는 5V 2A 이상 공급이 안정적
- 배터리 용량이 부족할 경우, 카메라나 센서 작동이 멈출 수 있음
개념설명비유
| 전류 (Current) | 전선을 통해 흐르는 전기의 양 | 수도관을 흐르는 물의 양 |
| 전압 (Voltage) | 전류를 밀어주는 힘, 압력 | 물을 밀어주는 수압 |
| 저항 (Resistance) | 전기의 흐름을 방해하는 요소 | 좁은 수도관처럼 흐름을 막음 |
| 접지 (Ground) | 전기가 0V 상태로 안전하게 빠지는 통로 | 배수구 같은 역할 |
| 쇼트(Short) | 전원이 직접 접지로 연결되는 위험한 상태 | 물이 새거나 폭발하는 상황 |
실습 파일


led_basic_test1.py
import RPi.GPIO as GPIO
import time
led_pin = 19
# GPIO핀을 어떤 방법으로 액세스할 것인지 모드를 설정
GPIO.setmode(GPIO.BCM)
#GPIO핀이 입력 or 출력
GPIO.setup(led_pin, GPIO.OUT)
# GPIO핀에 출력
GPIO.output(led_pin, GPIO.HIGH) # 23 번으로 HIGH(1) 값을 출력
time.sleep(1)
GPIO.output(led_pin,GPIO.LOW) # 23번으로 LOW(1)값을 출력
# GPIO핀 초기화
# GPIO.cleanup()
led_basic_test2.py
import RPi.GPIO as GPIO
import time
# 1초 간격으로 LED 깜빡이기
led_pin = 23
# GPIO핀을 어떤 방법으로 액세스할 것인지 모드를 설정
GPIO.setmode(GPIO.BCM)
#GPIO핀이 입력 or 출력
GPIO.setup(led_pin, GPIO.OUT)
try:
while True :
GPIO.output(led_pin, GPIO.HIGH) # 23 번으로 HIGH(1) 값을 출력
time.sleep(1)
GPIO.output(led_pin,GPIO.LOW) # 23번으로 LOW(1)값을 출력
time.sleep(1)
except KeyboardInterrupt:
print("end....")
finally:
GPIO.cleanup()
led_basic_test3.py
# led 2개가 번갈아 켜지고 꺼지도록 구현하기
# 23,24번
import RPi.GPIO as GPIO
import time
led_pin = 23
led_pin1 = 24
GPIO.setmode(GPIO.BCM)
try:
while True :
GPIO.output(led_pin, GPIO.HIGH)
time.sleep(1)
GPIO.output(led_pin1, GPIO.HIGH)
time.sleep(1)
GPIO.output(led_pin,GPIO.LOW)
time.sleep(1)
GPIO.output(led_pin1,GPIO.LOW)
time.sleep(1)
except KeyboardInterrupt:
print("end....")
finally:
GPIO.cleanup()
import RPi.GPIO as gpio
import time
gpio.setmode(gpio.BCM)
pin = 27
gpio.setup(pin,gpio.IN, pull_up_down=gpio.PUD_UP)
#GPIO핀의 상태가 0이나 1로 변경될때 호출될 함수를 등록하고 작업
#버튼의 상태가 변하면 호출될 콜백함수정의
def mycallback(channel):
print("버튼이 눌려짐")
#신호를 감지하면 콜백함수가 실행되도록 작업
# edge : 디지털신호 값이 변하는 순간
# RISING(상승 - 신호가 LOW 상태에서 HIGH상태로 올라가는 순간 , 0 -> 1, 풀다운회로에서 버튼 누름을 감지)
# FALLING(하강 - 신호가 HIGH 상태에서 LOW상태로 내려가는 순간 , 1 -> 0, 풀업회로에서 버튼 누름을 감지)
# BOTH(상승,하강 모두)
# 이벤트 방식 또는 인터럽트 방식
# CPU가 다른 작업을 하는 중 버튼이 눌려져서 상태값이 바뀌면 하드웨어가 CPU에게 인터럽트 발생 신호를 보낸다.
# CPU는 하던 일을 잠시 멈추고 등록한 콜백함수를 실행한다.
# 미세하게 여러 번 눌리는 작업 채터링이나 바운싱이라 표현을 하고
# bouncetime=200은 0.2초 동안 들어오는 모든 신호는 무시
gpio.add_event_detect(pin, gpio.FALLING,callback=mycallback, bouncetime=200)
while True:
print("다른일을 하는 중....")
time.sleep(0.5)
→ RPi.GPIO 모듈을 불러와서 라즈베리파이의 GPIO 핀을 제어합니다.
time은 딜레이를 주기 위해 사용됩니다.
gpio.add_event_detect(pin, gpio.FALLING, callback=mycallback, bouncetime=200)
→ 인터럽트 등록:
- gpio.FALLING: HIGH → LOW(1→0) 로 떨어질 때 감지
- callback=mycallback: 이벤트 발생 시 mycallback() 실행
- bouncetime=200: 0.2초(200ms) 동안 중복 입력 무시 (채터링 방지)
while True:
print("다른일을 하는 중....")
time.sleep(0.5)
메인 루프는 계속 돌면서 다른 일을 합니다.
버튼이 눌리면, 백그라운드에서 콜백 함수가 자동 실행됩니다.
실행 동작 요약
- 프로그램이 실행되면 “다른일을 하는 중...”을 반복 출력
- 버튼을 누를 때마다 "버튼이 눌려짐" 이라는 메시지가 즉시 출력
- CPU가 버튼을 계속 체크하지 않아도 됨 → 효율적인 인터럽트 방식
연결 회로 예시 (풀업 회로 기준)
GPIO연결
| GPIO27 | 버튼 한쪽 |
| GND | 버튼 다른쪽 |
버튼을 누르면 GPIO27이 GND에 연결되어 LOW(0) 가 되고,
FALLING 엣지가 발생하여 콜백 함수 실행
import RPi.GPIO as gpio
import time
gpio.setmode(gpio.BCM)
pin = 27
led_pin = 23
gpio.setup(led_pin, gpio.OUT)
gpio.setup(pin,gpio.IN, pull_up_down=gpio.PUD_UP)
led_state = False # led 상태를 저장하는 변수
try:
while True:
input_val = gpio.input(pin)
if input_val == 0: # 스위치가 눌려졌을때
led_state = not led_state
gpio.output(led_pin, led_state)
time.sleep(0.1)
time.sleep(0.1)
except KeyboardInterrupt :
pass
finally:
gpio.cleanup()
try:
while True:
input_val = gpio.input(pin)
if input_val == 0: # 스위치가 눌려졌을때
led_state = not led_state
gpio.output(led_pin, led_state)
time.sleep(0.1)
time.sleep(0.1)
동작 방식:
- 버튼이 눌려 GPIO27이 LOW가 되면 조건문 통과.
- led_state 변수를 반전(True ↔ False)
- LED의 상태를 토글 (켜짐 ↔ 꺼짐)
- time.sleep(0.1)으로 채터링(버튼 흔들림) 방지
except KeyboardInterrupt :
pass
finally:
gpio.cleanup()
Crtl + c 를 해서 프로그램을 종료했을때
GPIO 설정을 깨끗하게 정리 설정 gpio.cleanup()
다음 실행 시 “GPIO already in use” 오류 방지
항목설명
| 버튼 핀 | GPIO 27 |
| LED 핀 | GPIO 23 |
| 회로 방식 | 풀업 방식 (버튼 → GND) |
| 기능 | 버튼을 누를 때마다 LED 상태 토글 |
| 채터링 방지 | time.sleep(0.1) 로 구현 |
| 종료 처리 | try-except-finally 로 안전 종료 |
부품라즈베리파이 GPIO
| LED (+) | GPIO 23 |
| LED (–) | GND |
| 버튼 한쪽 | GPIO 27 |
| 버튼 다른쪽 | GND |
# 폴링방식을 이벤트방식으로 변경
import RPi.GPIO as GPIO
import time
led_pin = 24
pin = 27
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin,GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(led_pin,GPIO.OUT)
#함수 밖에서 정의된 변수는 프로그램전체에서 접근은 가능하지만 수정은 불가능
led_state = False # led상태를 저장하는 변수
def push_callback(channel):
# 전역변수인 led_state를 수정
global led_state
if led_state == False:
GPIO.output(led_pin,GPIO.HIGH)
print("led_on")
else:
GPIO.output(led_pin,GPIO.LOW)
print("led_off")
led_state = not led_state
GPIO.add_event_detect(pin,GPIO.FALLING,callback=push_callback,bouncetime=200)
# push_callback(pin)
# print(led_state)
#GPIO핀에 출력 - 무한반복
try:
while 1:
print("아무일")
time.sleep(0.3)
finally:
GPIO.cleanup()
| 기능 | 설명 |
| 버튼 입력핀 | GPIO 27(풀업 회로) |
| led 출력 핀 | GPIO 24 |
| 동작 | 버튼을 누를 때 마다 LED가 켜졌다 꺼지는 토글 방식 |
| 방식 | 이벤트(인터럽트) 기반 — CPU가 버튼을 계속 감시하지 않아도 됨 |
| 채터링 방지 | bouncetime=200 (0.2초 동안 중복 신호 무시) |
'HDC 학습일지' 카테고리의 다른 글
| 2025-10-16(서브모터 제어, MQTT 통신 (자바)) (0) | 2025.10.16 |
|---|---|
| 2025-10-15(라즈베리파이-2, PWM (0) | 2025.10.16 |
| 2025-10-13(라즈베리파이(리눅스 명령어)) (0) | 2025.10.14 |
| 2025-10-02 (JDBC - final(2), JPA, DAO, DTO, 라즈베리파이) (0) | 2025.10.04 |
| 2025-10-1(JDBC - final , DBA, 라즈베이파이 , MQTT) (0) | 2025.10.01 |