Embedded System/Raspberry Pi

[라즈베리파이] wiringPi를 이용한 GPIO사용

임베지수 2017. 4. 2. 14:44

라즈베리파이에서 GPIO를 사용하는 방법은 여러가지가 있는데 그 중에 wiringPi라는 것을 이용해서 GPIO를 사용해보자.

wiringPi는 라즈베리파이에서 각종 기능들을 쉽게 접근할 수 있도록 만들어준 라이브러리이다. 먼저 다음 사이트로 접속해서 wiringPi를 다운받는다.

   wiringPi 다운 : https://github.com/WiringPi/WiringPi

 

라즈베리파이 터미널에서 바로 다운받아도 된다. 다운받은 파일을 라즈베리파이에 옮기고 압축을 풀어준다.

wiringPi라는 폴더가 생기는데 터미널에서 build파일을 실행시켜 준다.

 

이제 wiringPi의 설치가 끝났다. 사용하기만 하면 된다. examples폴더 안에 test1.c라는 파일이 있는데 일단 저놈으로 테스트를 해보겠다. 그럼 먼저 컴파일을 해주어야 한다. 친절하게도 Makefile도 만들어놨다.

 

터미널에 그냥 make만 치면 컴파일 할게 너무 많다고 나오니 "make 해당파일"을 입력해준다.(ex. make test1)

 

파일을 실행하기 전에 확인할 수 있는 간단한 테스트 보드를 만들어야 한다. 회로 구성은 다음과 같다. 난 반대로 연결해서 핀에 0을 하면 켜지고 1을 하면 꺼진다. -_-;;

 

wiringPi 폴더 안의 wiringPi.c 파일을 살펴보면 다음을 알 수 있다.

  17, 18, 27, 22, 23, 24, 25, 4,        // From the Original Wiki - GPIO 0 through 7:       wpi  0 -  7
   2,  3,                                     // I2C  - SDA0, SCL0                                        wpi  8 -  9
   8,  7,                                     // SPI  - CE1, CE0                                           wpi 10 - 11
  10,  9, 11,                               // SPI  - MOSI, MISO, SCLK                              wpi 12 - 14
  14, 15,                                   // UART - Tx, Rx                                               wpi 15 - 16
  28, 29, 30, 31,                         // New GPIOs 8 though 11                                  wpi 17 - 20 

 

컴파일이 완료되면 test1이라는 파일이 생긴다. 파일을 실행하기 위해서는 무조건 root권한에서 실행해주어야 한다.

 

sudo ./test1을 입력하면 된다. 동영상을 보면 잘 동작됨을 알 수 있다.

 

 

led출력이 반대로 나오는게 약간 실수 이긴 하지만... 어쨌든 잘 되네~ 그럼 이제 직접 코드를 작성해보자. 먼저 gpiotest.c파일을 만들어 준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
    gpiotest.c
*/
 
#include <wiringPi.h>
#include <stdio.h>
 
int main()
{
    int i;
    
    if(wiringPiSetup() == -1)
        return 0;
    
    for(i=0; i<8; i++)
        pinMode(i, OUTPUT); // 초기화.. AVR에서 DDR같은 놈인듯?
    for(i=0; i<8; i++)
        digitalWrite(i, 1); // led 전부 끔. 난 반대로 연결해서 1이 끄는거임                                 
 
    delay(1000); // 의미없는 1초
    
    while(1)
    {
        for(i=0; i<8; i++) // 하나씩 켜주기
        {
            digitalWrite(i,0);
            delay(200);
        }
        
        for(i=7; i>=0; i--) // 하나씩 꺼주기
        {
            digitalWrite(i,1);
            delay(200);
        }
    }
    
    return 0;
}

 

컴파일할때 Makefile을 만들어서 컴파일 해주자. 라이브러리같은걸 설정해줘야해서 Makefile을 만들어놓으면 편하게 컴파일 할 수 있다. 터미널에 vi Makefile이라고 입력하고 다음 내용을 넣어준다.

1
2
3
4
5
6
7
8
CC = gcc
INCLUDE = -I/usr/local/include
LDFLAGS = -L/usr/local/lib
LDLIBS = -lwiringPi
SRC = gpiotest.c
 
all:
    $(CC) -o test &(SRC) &(LDFLAGS) &(LDLIBS)                                                               

 

Makefile을 만들었으면 터미널에 make를 입력해서 컴파일한다. 실행하기 위해서는 무조건 root권한으로 실행하는걸 잊지말자.

sudo ./test 를 입력해서 동작을 확인해본다.

 

제대로 동작되네~