임베디드 TIL

혀니·2024년 4월 3일

코딩 TIL

목록 보기
5/28

오늘 학교에서 실습해본 임베디드 시스템에 대한 TIL을 적어보고자 한다.
문제는 아래와 같았다.

라즈베리파이, 다이오드, 스위치로 회로를 만드는 실습이었다.
하지만 우리는 회로를 고딩때... 해봐야 디지털 논리 회로 1학년 때 배웠어서 회로와 거리가 먼 사람들이라 꽤 헤맸다.(그래서 공부 겸 정리)

그래서 라즈베리파이 개념 정리


개념

GPIO

라즈베리파이의 입출력 인터페이스
크게 신호(s), 전원(v), 그라운드(g)로 나뉨

S핀(시그널-Signal)

입력 또는 출력으로 설정될 수 있음(하나의 핀이 입출력 둘다는 안되는 것 같음)
입력 설정 시 외부 장치로부터 신호를 받아들임(스위치 입력 등)
출력 설정 시 신호를 외부 장치로 보냄(다이오드 등)

V핀(전원-Voltage, VCC 등)

외부 장치에 전원을 공급하는 역할
라즈베리파이에선 양극(+)으로 쓰이는 것 같음

G핀(그라운드-Ground, GND)

음극 역할을 함


pin 입출력 모드 설정

GPIO.setmode(GPIO.BCM)
GPIO.setup(11, GPIO.OUT) #11번 pin 출력모드
GPIO.setup(12, GPIO.IN) #12번 pin 입력모드

주의

선 연결할 때 3V3 power, Ground 직접 연결 절대 금지
프로그램 상 핀 번호와 물리적인 핀 번호가 달라서 잘 확인하고 코딩 해야 됨


스위치 입력

switch = GPIO.input(4) #4번 pin 값 확인
if switch == 0: #풀업 저항이므로 LOW(0)이 버튼 눌린 것
	print("눌림") #버튼 눌렸을 때 실행

풀업 저항

명시적으로 0 또는 1을 넣어주기 위해 사용
주로 입력 핀과 VCC 사이에 연결
floating 상태 방지
-> 입력 핀이 아무 것도 연결되지 않았을 때의 상태(floating)는 예측할 수 없기 때문에 그 입력 핀을 VCC를 끌어올려 명확하게 HIGH로 만듬
-> 따라서 스위치를 눌렀을 때 핀이 GND로 연결되어 LOW(0) 상태가 됨

노이즈 방지, 명확한 논리 상태 제공을 위해 사용됨

풀다운 저항

풀업 저항과 비슷한 원리
핀을 LOW 상태로 유지
입력 핀과 VCC 대신 GND에 연결


polling

CPU가 주기적으로 상태를 검사하며 특정 조건이 충족되었는지 확인하는 방식
CPU가 능동적으로 상태 변화를 확인함

interrupt

하드웨어 장치나 소프트웨어에서 발생한 이벤트가 CPU에게 직접 알리는 방식
이벤트가 발생하면 즉시 반응하는 비동기 처리 방식
GPIO.wait_for_edge(), GPIO.add_event_detect()

GPIO.wait_for_edge()

핀에 변화가 생길 때까지 기다리는 역할
변화가 감지될 때까지 프로그램 실행이 멈춰있음(블로킹 상태)

  • 상승 에지: 신호가 낮은 상태에서 높은 상태로 변하는 순간
  • 하강 에지: 신호가 높은 상태에서 낮은 상태로 변하는 순간
    즉, 다른 일을 하지 않고 그 신호만을 기다리게 하는 명령
GPIO.wait_for_edge(4, GPIO.RISING) 
# 신호가 LOW->HIGH로 변할 때

+ 이벤트

GPIO.RISING

핀의 전압이 LOW에서 HIGH로 변할 때 발생하는 이벤트(버튼을 뗄 때 기준)

GPIO.FALLING

핀의 전압이 HIGH에서 LOW로 변할 때 발생하는 이벤트(버튼을 누를 때 기준)

GPIO.BOTH

RISING과 FALLING 모두 감지

GPIO.add_event_detect()

GPIO 핀에 대한 이벤트 감지를 설정하고 특정 에지가 감지될 때 호출될 콜백 함수를 지정할 수 있음
프로그램 다른 부분이 실행되는 동안에도 핀의 상태 변화를 감시

GPIO.add_event_detect(4, GPIO.RISING, callback=my_callback, bouncetime=100)
# my_callback은 사용자 정의 함수
# bouncetime은 전기 신호에 의해 interrupt가 여러 번 호출되는 것을 방지하며 
#첫 신호 후 100동안 신호는 무시됨

실습 결과


스위치2, 다이오드 2를 사용하는 것이므로 각 핀에 스위치와 다이오드를 하나씩 연결하였다.
스위치가 연결된 핀은 setup(핀번호, GPIO.IN)으로 설정했고, 다이오드가 연결된 핀은 setup(핀번호, GPIO.OUT)으로 설정했다.

그 후 add_event_detect()를 사용하여 스위치(1)를 눌렀을 때 이벤트가 발생되도록 하였다.
스위치(1)를 누르면 my_handler라는 사용자 정의 함수가 실행되며 이 함수에서는 mode를 0과 1 정반대로 바꿔준다.
그 다음 mode를 이용하여 1인 경우와 0인 경우, 그 중에서도 스위치(2)가 눌렸을 때(LOW) 핀 신호를 바꿔가며 핀에 연결된 다이오드의 불빛을 빛나게 했다.



라즈베리파이 같은 하드웨어는 2학년 때 무인 결제 시스템 개발해볼 때 마지막으로 봤었는데
오랜만에 실제로 구현을 해보려고 하니까 꽤 막막한 느낌이 있었다.

처음엔 문제에 대한 회로를 그려보려 했으나 회로를 접한게 무려 5년전이라... 병럴 회로 찾아보고 회로 그려보며 접근하고자 하였다.
하지만 이 문제는 공부 자료를 찾아보니까 핀 번호 하나당 각각 연결하면 되는 문제였고 진행했더니 성공하였다.

아직도 이 문제를 회로로 그리면 어떻게 되는건지 모르겠당...
그래도 수업이 전기과 수업 약간 체험해 보는 것 같아서 흥미로웠다 :D
앞으로 회로랑 좀 친해질 필요가 있겠다는 생각이 든다.

0개의 댓글