취소

커뮤니티

가이드

서포트

전체

Raspberry Pi 의 GPIO 사용해보기

라즈베리파이에는 버전에 따라서 다르지만 아두이노처럼 GPIO 가 헤더핀포트로 제공되고있습니다. 이를 어떻게 사용할 수 있는지에 대해서 한 번 알아보도록 하겠습니다.

GPIO란?

GPIO는 General Purpose Input / Output 으로, 말 그대로 범용 입출력 인터페이스입니다. PCB, ICT보드 등 다양한 전자기판에서 내부 회로 이외 외부적으로 물리적으로 소통할 수 있는 장치로, 이를 이용해서 LED, Servo Motor 등 다양한 물리적 외부 장치들에 대해서 배선하고 연결하여 제어 할 수 있습니다.

Raspberry Pi의 GPIO

이미지 출처 : SparkFun

라즈베리파이의 GPIO는 2버전을 기준으로 IO 개수가 달라지게됩니다. 초기 버전에는 26개의 IO를 지원하였으나 지금은 40개의 IO를 지원하게 되었습니다.IO MAP을 보면, 라즈베리파이는 단순 디지털 입출력 뿐만 아니라, 직렬 시리얼통신(UART), I2C(Inter-Integrated Circuit), SPI(Serial Peripheral Interface), PWM(Pulse Width Modulation) 등 다양한 입출력을 제공합니다.

GPIO 결선 준비

라즈베리파이에서 GPIO를 연결하여 한 번 간단한 디지털 입출력 제어를 해보도록 하겠습니다. 준비물은 다음과 같습니다.

- 라즈베리파이 본체(2/3/Zero 등) - LED 2EA - BUTTON 1EA - 1kΩ 이하의 저항 (본 게시글에서는 220Ω 사용)

배선되는 PIN PORT는 모든 라즈베리파이가 동일합니다. 위의 이미지가 잘 보이지 않는다면 아래의 표를 참고해서 결선해주세요.

Component

Raspberry Pi GPIO

LED 1

GPIO 18

LED 2

GPIO 23

BUTTON

GPIO 17

GND

GND

Wiring Pi 설치 및 결선 테스트

C를 이용하여 라즈베리파이의 GPIO를 제어할때도 필요로 하지만, 간단하게 배선 테스트도 진행 할 수 있는 좋은 라이브러리인 Wiring Pi를 터미널을 실행(단축키 Ctrl+Alt+T)시켜서 설치해보도록 하겠습니다.

$ sudo apt-get install git-core $ sudo apt-get update $ sudo apt-get upgrade $ git clone git://git.drogon.net/wiringPi $ cd wiringPi $ git pull origin $ ./build

Wiring Pi 설치가 완료되었나요? 한 번 지금 결선해놓은 것들에 대해서 테스트를 진행해보도록 하겠습니다.

// LED 1 테스트 $ gpio -g mode 18 output $ gpio -g write 18 1 $ gpio -g write 18 0 // LED 2 테스트 $ gpio -g mode 23 output $ gpio -g write 23 1 $ gpio -g write 23 0 // BUTTON 테스트 $ gpio -g mode 17 up $ gpio -g read 17

정상적으로 결선이 되었다면 LED 가 동작 할 것이며, 버튼 역시 누를 경우 터미널에 결과가 나타납니다. 만일 결과가 나타나지 않는다면 한 번 배선 상태를 점검해보시길 바랍니다.

Python 또는 GCC 준비

기본적으로 라즈비안 등 대다수 라즈베리파이의 OS에는 Python 과 GCC 등이 있습니다. 만약 없을 경우 터미널을 실행(단축키 Ctrl+Alt+T)시켜서 아래와 같이 입력하고 설치를 진행해주세요.

$ sudo apt-get update // Python 설치 $ sudo apt-get install -y python-dev python-setuptools // GCC 설치 $ sudo apt-get install gcc g++

gedit 설치

다른 에디터 등 코드를 작성 할 수 있는 많은 에디터들이 있지만, 본 게시글에서는 gedit으로 통일하여 진행하도록 하겠습니다. gedit 이 없을 경우 터미널을 실행(단축키 Ctrl+Alt+T)시켜서 아래와 같이 입력해서 설치를 진행해주세요.

$ sudo apt-get update $ sudo apt-get install gedit

Python 으로 GPIO 실습해보기

Python을 이용해서 GPIO 제어를 실습해보도록 하겠습니다. 먼저 터미널을 실행(단축키 Ctrl+Alt+T)시켜서 아래와 같이 입력하여 python_code 폴더 생성 및 .py 파일을 생성, 작성준비까지 해보겠습니다.

$ mkdir python_code $ cd python_code $ touch led_btn.py $ gedit led_btn.py

우리가 작성하려고 하는 GPIO 제어는 다음과 같습니다. 버튼을 누르면 LED2가 점멸하고, 버튼을 누르지 않은 상태에서는 LED1이 켜져있는 제어입니다. 아래의 코드를 참고해서 한 번 작성해보시길 바랍니다.

# GPIO 라이브러리 불러오기 import RPi.GPIO as GPIO # PIN 설정 led1 = 18 # P1 pin 12 led2 = 23 # P1 pin 16 btn  = 17 # P1 pin 11 # GPIO 설정 GPIO.setmode(GPIO.BCM) # 브로드컴 핀 넘버링으로 설정 GPIO.setup(led1, GPIO.OUT) # LED1에 사용할 18번 핀 OUTPUT으로 설정 GPIO.setup(led2, GPIO.OUT) # LED2에 사용할 23번 핀 OUTPUT으로 설정 GPIO.setup(btn, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 버튼에 사용할 17번 핀 pull-up 타입 input으로 설정) # GPIO 제어 시작 print("Press CTRL+C to exit") try:   while 1:     if GPIO.input(btn): # 버튼을 누르지 않았을때       GPIO.output(led1, GPIO.HIGH) // LED1 켜기       GPIO.output(led2, GPIO.LOW) // LED2 끄기     else: # 버튼을 눌렀을때       GPIO.output(led0, GPIO.LOW) // LED1 끄기       GPIO.output(led2, GPIO.HIGH) // LED2 켜기       time.sleep(0.1)       GPIO.output(led2, GPIO.LOW) // LED1 끄기       time.sleep(0.1) except KeyboardInterrupt: # Ctrl+C 를 눌러서 종료 할 경우   GPIO.cleanup() # GPIO 초기화

작성이 완료되셨나요? 그러면 저장(단축키 Ctrl+S)을 한 후 창을 닫고 터미널에서 아래와 같이 입력하여 실행시켜봅니다.

$ sudo python led_btn.py

C와 Wiring Pi 로 GPIO 실습해보기

이번에는 C와 Wiring Pi를 이용해서 GPIO 제어를 실습해보도록 하겠습니다. 먼저 터미널을 실행(단축키 Ctrl+Alt+T)시켜서 아래와 같이 입력하여 c_code 폴더 생성 및 .c 파일을 생성, 작성준비까지 해보겠습니다.

$ mkdir c_code $ cd c_code $ touch led_btn.c $ gedit led_btn.c

준비 다 되셨나요? C로 제어해보려는 것 역시 Python과 동일하게 버튼을 누르면 LED2가 점멸하고, 버튼을 누르지 않은 상태에서는 LED1이 켜져있는 제어입니다. 아래의 코드를 참고해서 한 번 작성해보시길 바랍니다.

// 라이브러리 불러오기 #include <stdio.h> // printf 출력목적 #include <wiringPi.h> // GPIO 사용 목적, Wiring Pi // PIN 설정 int led0 = 18; int led1 = 17; int btn  = 23; // 메인 int main(void) {   wiringPiSetupGpio(); // GPIO 셋업   pinMode(led0, OUTPUT); // LED1에 사용할 18번 핀 OUTPUT으로 설정   pinMode(led1, OUTPUT); // LED2에 사용할 23번 핀 OUTPUT으로 설정   pinMode(btn, INPUT);  // BUTTON에 사용할 17번 핀 INPUT으로 설정   printf("Press CTRL+C to exit \n");   while(1) {     if(digitalRead(btn)) { // 버튼을 누르지 않았을 때       digitalWrite(led0, HIGH); // LED1 켜기       digitalWrite(led1, LOW); // LED2 끄기     } else { // 버튼을 눌렀을때       digitalWrite(led0, LOW); // LED1 끄기       digitalWrite(led1, HIGH); // LED2 껴기       delay(100); // 0.1초 대기       digitalWrite(led1, LOW); // LED2 끄기       delay(100); // 0.1초 대기     }   }   return 0; }

작성이 완료되셨나요? 그러면 저장(단축키 Ctrl+S)을 한 후 창을 닫고 터미널에서 아래와 같이 입력하여 컴파일을 진행하고 실행시켜보도록 하겠습니다.

$ gcc -o led_btn led_btn.c -l wiringPi $ sudo ./led_btn

마무리

이번에는 간단하게 GPIO에 대한 기본 개념과 이를 이용한 디지털 입출력 사용을 중점적으로 알아보았습니다. GPIO를 이용해서 PWM 출력을 이용한 서보제어, UART/I2C/SPI 등을 이용한 통신 등 다양하게 사용이 가능하니 한 번 하나하나 차근차근 사용해보시길 바랍니다.

소스코드에 정답은 없다. 다양한 생각이 있듯 다양한 방법이 있으며, 이는 그 중 하나다.

참고문서

https://www.raspberrypi.org/documentation/https://learn.sparkfun.com/tutorials/raspberry-gpio