라즈베리 파이 GPIO 제어 (console, python)

라즈베리 파이의 GPIO 핀 구조는 아래와 같습니다.

53bc258dc6c0425cb44870b50ab30621

이 중 Digital 핀(GPIO xx)을 제어하는, 가장 기초에 해당하는 내용입니다.

테스트를 위해 아래와 같이 2개의 LED를 연결해 줍니다.

LED_python

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

문제없이 실행되면 끝!!

참고자료

You may also like...