Published Book on Amazon
All of IOT Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 1 | |
All of IOT Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 2 |
출판된 한글판 도서
최신 라즈베리파이(Raspberry Pi)로 시작하는 사물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (상) | |
최신 라즈베리파이(Raspberry Pi)로 시작하는 사물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (하) |
Original Book Contents
25.6.3 <RPi.GPIO> library
25.6.3.1 <RPi.GPIO> library 개요
이 library는 Python 개발언어에서 Raspberry Pi의 GPIO를 조정할 수 있는 class 모듈을 제공해 준다.
이 library는 실시간이거나 시간 동기화가 중요한 application에서는 부적합하다. 왜냐하면 python이 언제 garbage collect을 할지 예측할 수 없고, 실시간 처리에 적합하지 않는 Linux kernel에서 실행되기 때문이다. Linux는 multitasking O/S로서 CPU에 대해서 GPIO 처리 프로그램보다 다른 프로세서가 더 높은 우선순위를 가질 수도 있고, 그럴 경우는 GPIO 처리 프로그램이 혼란에 빠질 수도 있기 때문이다.
현재 버전은 Raspberry Pi에서 SPI, I2C, hardware PWM 또는 serial functionality를 지원하지 않는다. 가까운 장래에 지원할 계획이다.
추가적인 정보가 필요하면 아래의 자료를 참조하기 바란다.
■ https://pypi.python.org/pypi/RPi.GPIO
25.6.3.2 <RPi.GPIO> library 설치
Raspberry Pi의 Raspbian에서는 <RPi.GPIO> library가 기본적으로 설치되어 있다. 따라서 특별한 이유가 없으면 따로 설치할 필요가 없다. 다음은 해당 library가 설치되어 있는지를 확인해 본 것이다.
pi@raspberrypi ~ $ dpkg -l *gpio |
Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-================-=============-=============-====================================== ii python-rpi.gpio 0.5.11-1 armhf Python GPIO module for Raspberry Pi ii python3-rpi.gpio 0.5.11-1 armhf Python 3 GPIO module for Raspberry Pi |
별도의 추가적인 설치가 필요하면 다음과 같은 절차로 프로그램 팩키지를 설치한다. "python-rpi.gpio"는 Python 2 IDLE를 위한 library이고 "python3-rpi.gpio"는 Python 3 IDLE를 위한 library이다.
sudo apt-get install python-rpi.gpio python3-rpi.gpio |
25.6.3.3 <RPi.GPIO> library 사용법
● GPIO 처리 권한
대부분의 Raspberry Pi의 Linux 배포판들은 슈퍼유저만 GPIO 포트를 사용할 수 있도록 제한하고 있다. 따라서 Python으로 개발한 프로그램을 실행하기 위해서는 "sudo" 명령을 함께 사용해야 한다.
● pin numbering 체계
<RPi.GPIO> library에서 GPIO pin에 번호를 부여하는 방법은 두 가지가 있다.
■ BOARD의 번호체계를 이용하는 방법
이것은 Raspberry Pi의 board에 있는 P1 header에서의 pin 번호를 의미한다. 통상 physical 번호라고 하는 것으로 좌에서 우로, 위에서 아래로 순서적으로 번호가 부여되어 있다. 이 방법을 사용하면 Raspberry Pi의 board revision에 상관없이 항상 hardware가 잘 작동한다는 것이다. 따라서 connector를 다시 작성하거나 프로그램 code를 수정할 필요가 없다.
■ BCM number 체계를 이용하는 방법
이 방법은 Broadcom SOC에서의 channel number를 이용하는 것으로 lower level의 작업이 필요하다. 이 방법을 사용하려면 Rasberry Pi board에 있는 pin과 channel number 간의 연관도가 필요할 것이며 board가 revision되면 프로그램을 수정해야 한다.
어떤 번호체계를 이용할 것인지를 다음과 같은 방식으로 사전에 지정해야 한다.
GPIO.setmode( <GPIO-mode>) |
GPIO mode는 다음과 같은 값을 지정한다.
■ GPIO.BOARD -- BOARD 번호 체계
■ GPIO.BCM -- BCM 번호 체계
다른 Python 모듈에서 현재 설정되어 pin 번호 체계를 확인하려면 다음과 같은 함수를 사용한다.
mode = GPIO.getmode() |
실행한 결과 값은 "GPIO.BOARD", "GPIO.BCM" 또는 "GPIO.UNKNOWN"이 될 것이다.
● import
GPIO 라이브러리를 사용하려면 사전에 import를 해야 한다. 프로그램 처음에서 처리한다.
import RPi.GPIO as GPIO |
● GPIO setup
GPIO 포트들은 사용하기 전에 먼저 입력 또는 출력으로 초기화를 해주어야 한다.
GPIO.setup( <port>, <pin-mode> ) |
pin-mode는 해당 port를 입력 또는 출력으로 사용할 것인지를 지정하는 것이다.
■ GPIO.IN -- 입력
■ GPIO.OUT -- 출력
Example) GPIO.setup(11, GPIO.OUT)
● GPIO output
출력 port로 지정된 port에 대해서는 지정된 값을 출력할 수 있다.
GPIO.output(<port>, < output > ) |
output는 다음과 같은 값을 사용할 수 있다.
■ GPIO.HIGH, True, 1 -- 전류 On
■ GPIO.LOW, False, 0 -- 전류 Off
Example) GPIO.output(11, True)
● GPIO input
입력 port로 지정된 port에 대해서는 port에서 들어오는 값을 읽을 수 있다.
variable = GPIO.input( <port> ) |
intput는 다음과 같은 의미를 가진다
■ True -- 전류 On
■ False -- 전류 Off
Example) input_value = GPIO.input(12)
<RPi.GPIO> library를 이용한 interface 처리에 대한 사례는 [25.7.1.3 <RPi.GPIO> library를 이용한 사례]을 참고하기 바란다.