본문 바로가기

Info

RaspberryPi - 라즈베리파이에서 GPIO, I2C 제어하기 (WiringPi)

라즈베리파이에서 GPIO, I2C, SPI 등을 제어하기 위한 라이브러리로 WiringPi가 존재한다.


우선 설치부터.


1. 소스 다운로드를 위해 git 패키지를 설치한다.

apt-get install git-core


2. 소스 다운로드

git clone git://git.drogon.net/wiringPi


3. 설치

cd wiringPi

./build


4. 설치확인

gpio -v

gpio readall



우선 터미널 상에서 GPIO 관련된 명령들을 알아보자.


값 읽기

gpio read [pin]


핀 모드 설정

gpio mode [pin] [in/out/pwm/clock/up/down/tri]


값 쓰기

gpio write [pin] [1/0]


gpio 모든 정보 읽기

gpio readall


GPIO의 각 핀에 매핑되는 번호들을 gpio readall을 통해서 확인할 수 있으며, 해당 값을 제어에 사용해야 한다.


BCM 번호가 GPIO번호이고, wPi가 wiringpi용 값이다.

즉, GPIO21번을 제어하고자 한다면, 29를 사용해야한다.



이제 소스에서 wiringpi를 사용해 보자.


#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

 

#define GPIO_NUM_20 28
#define GPIO_NUM_21 29
#define GPIO_NUM_23 4

 

int main(void){

 int ret;
 int fd;

 

 if(wiringPiSetup() == -1){
  fprintf(stderr, "wiringPiSetup() is failed : %s\n", strerror(errno));
  return 1;
 }

 

 pinMode(GPIO_NUM_21, OUTPUT);

 digitalWrite(GPIO_NUM_21, HIGH);
 printf("GPIO_NUM_21 value: %d\n", digitalRead(GPIO_NUM_21));

 

 

 fd = wiringPiI2CSetup(0x50);
 if(fd == -1){
  fprintf(stderr, "wiringPiI2CSetup() is failed : %s\n", strerror(errno));
  return 1;
 }

 

 if(wiringPiI2CWriteReg8(fd, 0x11, 5) == -1){
  printf("write failed...\n");
 }
 // write cycle time
 delay(5);
 
 ret = wiringPiI2CReadReg8(fd, 0x11);
 printf("read ret: %d\n", ret);

 return 0;
}


wiringPiSetup() 함수를 통해서 초기화를 진행한다.


pinMode(pin, mode) 함수를 통해 해당 핀의 모드를 지정한다.


digitalWrite(pin, value) 함수를 통해 값을 쓸 수 있다.


digitalRead(pin) 함수를 통해 값을 읽을 수 있다.


wiringPiI2CSetup(dev_id) 함수를 통해 I2C 통신을 위한 초기화를 진행한다.


wiringPiI2CWriteReg8(fd, addr, value) 함수를 통해 해당 메모리 번지에 값을 쓸 수 있다.


wiringPiI2CReadReg8(fd, addr) 함수를 통해 해당 메모리 번지의 값을 읽을 수 있다.


delay(ms) 함수를 통해 대기 시간을 줄 수 있다.


어떤 칩을 i2c로 제어하느냐에 따라 다르겠지만, 필자가 제어하는 EEPROM의 경우 데이터시트에 write cycle이 5ms로 정의되어 있었기 때문에 write 작업 후 5ms의 대기시간을 주었다.

대기시간을 주지 않으면, write 후 read가 바로 안되는 현상이 나타난다.


I2C 통신에 사용하는 dev_id는 EEPROM의 dev_id인데, 이는 데이터시트에도 정의되어 있지만, 이 정보를 알아올 수 있는 유틸이 존재한다.

apt-get install i2c-tools


위 패키지를 설치한 후, 터미널에서 i2cdetect -y 1 명령을 사용하면 연결된 dev_id 리스트가 나타난다.

숫자 1은 라즈베리파이 리비전에 따라 달라진다고한다. 리비전2는 1, 리비전1은 0.