GPIO(General Purpose Input/Output)
- 범용 입/출력 장치를 말하며 라즈베리파이에서는 40개의 GPIO 핀을 제공 함.
- 컴퓨터와 주변 장치를 연결하기 위해서는 입출력 인터페이스가 필요한데, 컴퓨터에서는 USB를 통해 주변장치를 연결하는 반면, 임베디드 시스템에서는 GPIO 핀들을 제공하여 다양한 센서/액츄에이터 들을 연결할 수 있음
- AP(Application Process)는 물리적인 형태를 가지는 IC로 구현될 때 제한된 개수의 핀을 가짐
- 핀은 한 순간에 하나의 동작 상태만 가능 (입력과 출력을 동시에 하는것을 불가)
- GPIO로 MCU 또는 AP의 입/출력과 동작의 세부 상태를 설정할 수 있음
- 프로그램에서 레지스터를 통해 핀의 상태를 HIGH 또는 LOW로 설정하여 동작을 발생시킴
- GPIO 커넥터, 파이썬에서는 BCM(Broadcom SoC Defined) 방식의 핀 번호를 따름
- 버스(BUS): 디지털 회로에서 통신을 위한 신호선들로, Rasp에서는 외부 장치와 데이터 입출력을 위한 버스의 종류로 I2C, SPI, UART(RS232) 가 있음
[라즈베리파이 GPIO 핀맵]
4 Ways to Control GPIO
- DRA(Direct Register Access): Low Level C Programming, 고성능이지만 생산성이 낮음, 하드웨어 의존성 강함
- Third Party C Library: WiringPi가 대표적이며, 파이썬 기본 내장 라이브러리(RPi.GPIO) 대비 우수. 성능/생산성 향상
- Linux Sys-fs: 리눅스 기반 GPIO 프로그래밍이 가능. 하드웨어 의존성이 낮으며 다른 리눅스 시스템과 호환가능
- Language(Script) Bindings: 파이썬등의 언어기반으로 프로그래밍 쉬어 생산성이 좋으나 성능은 낮음. 하드웨어 의존성은 낮지만 OS 의존성이 높음
WiringPi설치
- Raspberry Pi에 사용되는 BCM2835를 위한 C로 작성된 GPIO Access Library
- GPIO 입출력 방식을 C기반으로 작성하고 이를 함수로 만들어 놓았다고 보면 됨
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install git-core
$ git clone httpsL//github.com/wiringPi/wiringPi
$ cd wiringPi
$ sudo ./build
$ gpio -v
$ gpio readall
내장모듈(Rpi.GPIO)과 외부라이브러리(wiringPi) 방식 비교
- 호출 명령어(모듈/클래스)만 다를뿐 기본 구조는 동일 함
import Rpi.GPIO as GPIO
import time
led_pin = 18
try:
GPIO.setmode(GPIO.BCM)
GPIO.setup(led_pin, GPIO.OUT) # 18번핀을 Out-Port로 사용하겠다고 선언
while True:
GPIO.output(led_pin, True)
time.sleep(0.5)
GPIO.output(led_pin, False)
time.sleep(0.5)
finally:
GPIO.cleanup()
import wiringpi
import time
led_pin = 18
try:
wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(led_pin, wiringpi.OUTPUT) # 18번핀을 Out-Port로 사용하겠다고 선언
while True:
wiringpi.digitalWirte(led_pin, True)
time.sleep(0.5)
wiringpi.digitalWirte(led_pin, False)
time.sleep(0.5)
finally:
print("Break")