약 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를 제어하는 방법에 대한 설명을 모두 마칩니다.
부디 유익한 정보였기를 바라면서, 즐겁게 라즈베리파이를 가지고 노시기 바랍니다.
'좋아요'나 구독이나 댓글은 저에게 보람을 줍니다.
감사합니다.
'Study > 라즈베리파이 공부' 카테고리의 다른 글
[라즈베리파이] 적외선 센서로 인체의 움직임이 감지되면 부저가 울리는 python 예제 (0) | 2021.01.24 |
---|---|
라즈베리파이로 active buzzer 제어하는 방법 (0) | 2021.01.23 |
[라즈베리파이] sudo: python: command not found 에러 발생시 조치방법 (0) | 2021.01.21 |
[라즈베리파이] Ubuntu Linux에 FTP 서버 설치 (0) | 2021.01.20 |
[라즈베리파이] Ubuntu Linux에 Samba 서버 설치 (0) | 2021.01.19 |