본문 바로가기

Study/라즈베리파이 공부

[라즈베리파이] GPO 포트로 LED 제어하기

반응형

약 20년 전 대학교 전자전기컴퓨터학부에 처음으로 입학했을 때, 전자공학실험수업에서 '빵판'이라는 것을 처음 접했을 때가 아직도 기억납니다. 

그 당시 수업을 진행하는 대학원생분이 '빵판'이라는 단어가 조금 생소하지만 별명이 아니고 정식 명칭이고 영어로는 'Bread Board'라고 진지하게 이야기하던 게 참 인상 깊었네요. 

 

약 20년이 지난 지금!

Firmware 개발자로 현업에서 경력을 쌓은지도 십 년이 넘는 지금!

라즈베리파이를 접하면서 또 다시 빵판에 손을 대고 있는 지금의 제 모습을 보면 제 운명은 '빵판'을 벗어날 수 없다는 느낌이 자꾸 드네요.  

 

그래도 정말 축복과 같은 것은, 저는 제 일에 참 만족하고 일을 할 때 가장 행복감을 느낀다는 것입니다. 

놀면서 배우고, 배우면서 일하는 저에게 일은 배움이자 놀이입니다. 

오늘도 재미있게 라즈베리파이를 가지고 놀고 있습니다. 

 


 

[GPO 제어란?]

서론이 제법 길었네요. 

라즈베리파이를 처음 시작했다면 가장 손쉽게 해 볼 수 있는 제어가 바로 GPO 포트 제어입니다. 

GPO 포트 제어라고 하는것이 조금 생소하실 수도 있겠습니다만, 흔히 말하는 GPIO 포트를 Output으로 설정해서 신호를 출력하는 것을 GPO 포트 제어라고 할 수 있겠습니다. 

 

GPIO의 약자는 아래와 같습니다. 

 

"GPIO stands for General Purpose Inout Output"

 

[GPO 출력값]

출력할 수 있는 값은 0(False)과 1(True)로 라즈베리파이에서는 0일 경우 0V로 출력되고, 1일 경우 3.3V로 출력됩니다. 

Digital 출력값 True/False 실제 출력 전압
0 False (Low) 0V
1 True (High) 3.3V

 

만약 포트에 연결된 장치가 High에서 켜진다면 High Active라고 하고, Low에서 켜진다면 Low Active라고 합니다. 

입력값 High Active시 동작 Low Active시 동작 비고
0 (Low) Off On  
1 (High) On Off  

만약, Low Active일 경우 관행적으로 회로도에 n이라는 접두어를 붙여서 Low Active임을 표시해줍니다. 

 

이 외에도 Pull Up, Pull Down, Internal Pull Up, Internal Pull Down 등의 개념들이 있는데, 추후에 다루도록 하겠습니다. 

 

 

[회로 구성]

아래와 같이 회로 구성을 했습니다.

 

Pin Map Table은 아래와 같이 작성했습니다. 

Pin Number Function Signal Name Note
8 R LED 제어 GPO_R_LED Red Led 제어신호
10 G LED 제어 GPO_G_LED Green Led 제어신호
12 B LED 제어 GPO_C_LED Blue Led 제어신호
14 GND GND Ground

 

저항은 220Ω을 사용했습니다. 

저항을 읽는 법은 아래 이미지를 보시면 큰 어려움 없이 이해하실 수 있습니다. 

 

멀티미터(DVM)를 가지고 계시면 레버를 Ω(저항)에 두고 측정을 하시면 됩니다. 

오차 범위 이내에서 220Ω으로 측정이 됩니다. 

 

빵판 구성을 완료한 모습은 아래와 같네요. 

 

[GPO 제어를 위한 python 스크립트 작성]

led_rgb.py 파일을 아래와 같이 작성하였습니다. 

import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)

while True:
    GPIO.output(14, True)
    time.sleep(1)
    GPIO.output(14, False)
    time.sleep(1)
    GPIO.output(15, True)
    time.sleep(1)
    GPIO.output(15, False)
    time.sleep(1)
    GPIO.output(18, True)
    time.sleep(1)
    GPIO.output(18, False)
    time.sleep(1)

구문에 대한 자세한 설명은 생략하겠습니다. 

 

 

[패키지 설치]

python script를 해석하고 실행하기 위한 python 패키지와 라즈베리파이 GPIO를 제어하기 위한 python-rpi.gpio 패키지를 설치하겠습니다. 

이미 설치되어 있다면 생략하셔도 됩니다. 

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install python
$ sudo apt-get install python-rpi.gpio

 

[스크립트 실행]

$ sudo python led_rgb.py

위와 같이 스크립트를 실행하면 아래와 같이 sequence로 LED가 제어됩니다.

  • Red Led 1초 점등
  • Red Led 소등
  • Green Led 1초 점등
  • Green Led 소등
  • Blue Led 1초 점등
  • Blue Led 소등
  • 1초 대기
  • 위의 과정을 무한으로 반복함

 

동작하는 모습은 아래의 동영상을 참고하세요. 

 

 

스크립트에 무한루프가 있어서 종료하고자 한다면 Ctrl + C를 누르시면 됩니다. 

 

 

[좀 더 개선해보자!]

위의 스크립트는 몇 가지 한계를 가지고 있습니다

  • 한 번에 한 개의 LED만 제어할 수 있습니다.
  • 사용자의 입력을 받아서 제어하는 상호작용(interactive)이 불가능합니다. 
  • 종료 시 Ctrl + C를 입력해서 강제로 스크립트를 종료해야 합니다.

 

그렇다면, 표준 입력으로 사용자의 명령을 받아서 처리하는 방법으로 개선해보겠습니다. 

  • 사용자가 'r'을 누르면 Red LED를 토글 시킴
  • 사용자가 'g'를 누르면 Green LED를 토글 시킴
  • 사용자가 'b'를 누르면 Blue LED를 토글 시킴

 

아래와 같이 표준 입력을 통해서 LED를 제어하도록 스크립트를 수정합니다. 

#led_rgb2.py
  
import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)

while True:
    cmd = input()

    if cmd == "r":
        GPIO.output(14, not GPIO.input(14))

    if cmd == "g":
        GPIO.output(15, not GPIO.input(15))

    if cmd == "b":
        GPIO.output(18, not GPIO.input(18))

    if cmd == "q":
        break

 

아래의 명령으로 실행해봅니다.

※ python으로 실행하면 input 구문에서 오류가 발생하므로 반드시 python3로 실행시키기 바랍니다.

$ sudo python3 led_rgb2.py

실행해보면 사용자의 입력에 따라서 LED가 제어되고, q를 누를 경우 스크립트가 종료되는 것을 확인할 수 있습니다. 

 

만약, 실행 시에 오류가 발생한다면 python3 패키지와 python3-rpi.gpio 패키지를 설치해보시기 바랍니다.

$ sudo apt-get install python3
$ sudo apt-get install python3-rpi.gpio

 

 

[끝맺음 말]

라즈베리파이를 이용해서 LED를 제어하는 방법에 대한 설명을 모두 마칩니다. 

부디 유익한 정보였기를 바라면서, 즐겁게 라즈베리파이를 가지고 노시기 바랍니다. 

'좋아요'나 구독이나 댓글은 저에게 보람을 줍니다. 

 

감사합니다. 

반응형