라즈베리파이에서 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>
#define GPIO_NUM_20 28
int main(void){ int ret;
if(wiringPiSetup() == -1){
pinMode(GPIO_NUM_21, OUTPUT); digitalWrite(GPIO_NUM_21, HIGH);
fd = wiringPiI2CSetup(0x50);
if(wiringPiI2CWriteReg8(fd, 0x11, 5) == -1){ 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.
'Info' 카테고리의 다른 글
Info - 개행문자 (0) | 2016.08.31 |
---|---|
RaspberryPi - 라즈베리파이에서 시리얼통신 하기 (0) | 2016.08.31 |
RaspberryPi - 라즈베리파이에서 블루투스 사용하기 (1) | 2016.08.31 |
RaspberryPi - 라즈베리파이에서 I2C 설정하기 (0) | 2016.08.31 |
RaspberryPi - 라즈베리파이에서 SSH 사용법 (0) | 2016.08.31 |