라즈베리 파이 GPIO 제어 (console, python)
라즈베리 파이의 GPIO 핀 구조는 아래와 같습니다.
이 중 Digital 핀(GPIO xx)을 제어하는, 가장 기초에 해당하는 내용입니다.
테스트를 위해 아래와 같이 2개의 LED를 연결해 줍니다.
Console 에서 GPIO 제어
먼저 해볼 방법은 console 에서 파일 다루듯이 제어하는 방법입니다. 왼쪽 빨간색 LED, GPIO 17번에 연결된 LED를 제어합니다.
cd 명령으로 /sys/class/gpio 폴더로 이동합니다. 그리고 폴더에 어떤 파일들이 있는지 한번 확인합니다.
- cd /sys/class/gpio
- ls -l
이 상태에서 GPIO17 핀을 초기화부터 해줍니다. 아래 명령으로… 그리고 다시 폴더에 어떤 파일들이 있는지 확인합니다.
- echo 17 > /sys/class/gpio/export
- ls -l
gpio17 심볼릭 링크가 생겼음을 알 수 있습니다. 이 링크를 통해 GPIO17을 제어합니다. 이제 GPIO17 을 input/output 어떤 모드로 사용할지 알려줘야 합니다.
- echo out > /sys/class/gpio/gpio17/direction
gpio17 폴더로 들어가보면 direction 파일이 생성되어 있고 거기엔 out 이라고 쓰여져 있을겁니다. GPIO17 핀이 out (3.3V 출력) 모드로 설정된 것입니다.
GPIO17 은 digital 핀이므로 여기에 0 또는 1 값을 넣어줄 수 있습니다. 예상하셨겠지만 0이 0V – LED off 상태를 의미하고, 1이 그 반대입니다. LED를 켜기 위해서는 아래와 같이 실행합니다.
- echo 1 > /sys/class/gpio/gpio17/value
다시 끄기 위해서는
- echo 0 > /sys/class/gpio/gpio17/value
테스트가 다 끝나면 이제 정리 작업을 해줍니다.
- cd /sys/class/gpio
- echo 17 > /sys/class/gpio/unexport
- ls -l
/sys/class/gpio 폴더의 내용을 확인해보면 앞서 생성된 gpio17 심볼릭 링크가 삭제되어 있음을 알 수 있습니다.
그런데 이렇게 제어하는건 좀 귀찮죠. 익숙하지도 않고… 다음은 파이썬으로 같은 작업을 해보겠습니다.
파이썬으로 GPIO 제어 1 (RPi.GPIO)
좀 더 우아하게 파이썬으로 GPIO 핀을 제어합니다. 먼저 RPi 라이브러리를 이용한 방법입니다. 제 경우에는 이 라이브러리가 이미 설치되어있던데;;; 다른 작업 하다가 설치한걸지도 모르겠네요. 아래와 같이 접속해보고 문제가 있는지 확인합니다.
- sudo python
- >>> import RPi.GPIO as GPIO
- >>> GPIO.setmode(GPIO>BCM)
- >>> quit()
문제가 발생한다면 라이브러리 설치합니다.
- wget ‘http://downloads.sourceforge.net/project/raspberry-gpio-python/RPi.GPIO-0.5.4.tar.gz’
- tar zxvf RPi.GPIO-0.5.4.tar.gz
- cd RPi.GPIO-0.5.4/
- sudo apt-get install python-dev
- sudo python setup.py install
준비가 되었으면 테스트 파일을 만들어 봅니다. 위 회로도에 있는 2개의 LED (GPIO17, GPIO27)를 깜빡이는 예제입니다. 예제 파일을 만듭니다.
- nano rpitest.py
아래 내용을 모두 넣어줍니다.
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.OUT) ## GPIO 17 ouput GPIO.setup(27, GPIO.OUT) ## GPIO 27 output def blink(): print "Starting blinking fever!" iteracion = 0 while iteracion < 30: ## Blink for 30' GPIO.output(17, True) ## On 17 GPIO.output(27, False) ## Off 27 time.sleep(1) ## Wait one second GPIO.output(17, False) ## Off 17 GPIO.output(27, True) ## On 27 time.sleep(1) ## Wait one second iteracion = iteracion + 2 ## Add 2 second, one for each blink print "I'm done!" GPIO.cleanup() ## Clean the GPIO blink() ## Call the function
파이썬 파일을 실행시켜 봅니다. (root 권한 필요)
- sudo python rpitest.py
30초 간 깜빡이고 종료되면 성공입니다.
파이썬으로 GPIO 제어 2 (WiringPi)
필수 패키지부터 설치합니다.
- sudo apt-get install -y python-dev python-setuptools
WiringPi 다운로드, 빌드
- git clone git://git.drogon.net/wiringPi
- cd wiringPi
- sudo ./build
- cd ..
WiringPi2 다운로드, 인스톨
- git clone https://github.com/Gadgetoid/WiringPi2-Python.git
- cd WiringPi2-Python
- sudo python setup.py install
WiringPi 파이썬 라이브러리가 WiringPi2 입니다. WiringPi2-Python/examples 폴더에 가면 예제들이 있습니다. 이걸 이용해서 테스트 해봅니다.
- cd examples
- nano quick2wire-io.py
예제를 아래와 같이 수정합니다.
import wiringpi2 pin_base = 65 i2c_addr = 0x20 pins = [17, 27] wiringpi2.wiringPiSetup() #wiringpi2.mcp23017Setup(pin_base,i2c_addr) for pin in pins: wiringpi2.pinMode(pin,1) wiringpi2.digitalWrite(pin,1) wiringpi2.delay(100) wiringpi2.digitalWrite(pin,0)
실행할 때는 루트 권한으로 합니다.
- sudo python quick2wire-io.py
문제없이 실행되면 끝!!
참고자료