GPIO를 제어하기 위한 방법은 여러가지가 있지만 여기에서는 파이썬으로 하는 방법에 대해서 소개하고자 한다. GPIO를 제어하기 위한 파이썬 패키지 중에서 RPi.GPIO 모듈과 WiringPi 라는 모듈이 가장 많이 쓰인다. 특히 RPi.GPIO는 라즈비언에 기본으로 설치되어 있으므로 별도로 설치하는 과정이 필요치 않다. 여기에서는 이것을 이용하기로 한다.


 RPi.GPIO 모듈을 사용하기 위해서는 먼저 다음과 같이 import 명령으로 불러와야 한다.


import RPi.GPIO as GPIO


그 이후에 다음과 같은 메서드들을 사용할 수 있다.


표 9.2.1 RPi.GPIO 모듈의 기본적인 메서드들

메서드 명

기능

GPIO.setmode(GPIO.BOARD)

GPIO.setmode(GPIO.BCM)

핀 번호를 라즈베리파이 보드(BOARD) 번호로 참조

BCM(Broadcom chip-specific pin numbers)모드

GPIO.setup(pin, GPIO.IN)

GPIO.setup(pin, GPIO.OUT)

핀을 입력으로 설정

핀을 출력으로 설정

GPIO.output(pin, GPIO.HIGH)

GPIO.output(pin, GPIO.LOW)

디지털 출력을 HIGH로 설정

디지털 출력을 LOW로 설정

GPIO.input(pin)

디지털 값을 읽음.

GPIO.cleanup()

GPIO 모듈의 점유 리소스를 해제

GPIO.VERSION

RPi.GPIO 모듈의 버전값을 갖는 변수


 GPIO.setmode()함수는 핀 번호를 지정할 때 어떤 참조 방식을 사용하는지를 설정하는 함수로서 다른 메서드를 사용하기 전에 반드시 사전에 호출해야 하는 함수이다. 인자로는 기정의된 상수를 받는데 GPIO.BOARD 는 핀 번호로 라즈베리파이 보드 상의 번호(1~40)를 이용하겠다고 설정하는 것이다. GPIO.BCM은 브로드컴칩의 번호를 참조하겠다는 것으로서 그림 9.1의 GPIOXX 에서 XX에 해당하는 번호를 사용하겠다는 것이다. 예를 들어 GPIO.BOARD 모드에서 12번 핀은 GPIO.BCM 모드에서 18번 핀과 동일하다. 다른 메서드들을 사용하기 앞서서 반드시 GPIO.mode()함수를 호출하여 핀 번호 참조 모드를 지정해 주어야 하며 이 모드의 설정없이 다른 메서드들을 호출하려고 하면 예외가 발생한다.


   GPIO.setup() 함수는 아두이노의 pinMode()함수와 유사한 기능을 수행한다. GPIO.input()이나 GPIO.output()함수를 호출하기 전에 사용하고자 하는 핀이 입력인지 출력인지를 먼저 설정해 주어야 한다. 만약 GPIO.setup() 함수 호출시 풀업(pull-up)이나 풀다운(pull-down) 저항을 연결하려면 다음과 같이 pull_up_down 키워드 파라메터를 GPIO.setup()함수에 넘겨야 한다.


GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP )

GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN )


pull_up_down 파라메터를 주지 않으면 아무런 저항도 연결되지 않는다.


 GPIO 모듈의 사용이 모두 끝나면 GPIO.cleanup()함수를 호출하는 것이 좋다. 이 함수를 호출하면 사용 중인 핀을 포함해서 모든 리소스가 시스템에 반환된다.


 한 가지 주의할 점은 RPi.GPIO는 하드웨어에 접근하여 작업을 수행하기 때문에 root권한이 필요하다. 따라서 파이썬쉘을 실행할 때 반드시 sudo 명령을 사용해야 GPIO 메서드들을 정상적으로 사용할 수 있다.


sudo python3

sudo ipython3


또한 RPi.GPIO 패키지를 사용하는 스크립트파일(,py 파일)을 실행하는 경우에도 마찬가지로 sudo 명령을 사용해야 정상적으로 실행이 된다. 예를 들어 blink.py 파일에서 RPi.GPIO 패키지를 사용한다면


sudo python3 blink.py


와 같이 sudo 명령을 반드시 앞에 붙여야 한다.

원문링크

Posted by 살레시오
TAG

댓글을 달아 주세요

  1. lights 2018.06.04 17:31  댓글주소  수정/삭제  댓글쓰기

    감사합니다!
    많은 도움이 됐습니다.^^

  2. 구태규 2018.10.03 10:55  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    라즈베리파이로 작품을 만들고 있는 학생입니다.
    문제가생겨 찾고 있다가 설명이 잘 되어 있어 질문올립니다.
    GPIO핀 1개를 input으로 아두이노에서 값을 보내면 어떠한 동작을 하게 잘 쓰고 있었습니다. 하지만 어느 순간 작동이 되지 않아 이것 저것 해보다가 GPIO핀을 이미 쓰고 있다는 에러가 발생하거나 아이에 GPIO친이 값을 못받고 심지어 간단한 HIGH값을 내보내는 코딩을 해도 동작을 하지 않았습니다.... 왜이런지를 몰라 질문 올립니다.