드디어 기본 준비 포스팅은 끝내버리고, 프로젝트 실전 입니다. ㅋㅋ
우선은 제일 간단한 LED 컨트롤 입니다만, 선뜻 나서질 못했네요 ㅎㅎ
사실 디바이스 드라이버에 대해 공부를 하는 중이라, 막상 실전에 들어가기가 쉽지 않았어요.
디바이스 드라이버를 만들기 위해 커널 컴파일 부터 손대어 볼까 했는데,
역시나 라즈비안OS에는 GPIO 컨트롤을 위한 디바이스 드라이버가 있었습니다.
LED가 아닌 복잡한 장치는 제조사에서 제공해 줄 것 같긴 하고...
GPIO가 아닌 I2C나 SPI에 대한 드라이버도 이미 설치되어 있지 않을까 생각해봅니다. : )
우선은 C언어 코드로 진행하였고,
차후에는 python으로 갈아타야 할 듯 합니다.
(라즈베리파이 재단에서 기본 제공하는 python 라이브러리가 많다고 들었네요... )
LED 컨트롤 프로젝트를 위해서는 준비물이 몇 개 필요합니다.
1. LED (당연하겠죠? ㅎㅎ)
2. 저항이 필요합니다. (5V이면, 500옴 정도면 적당하겠습니다.)
(라즈베리파이 스펙에는 전압 5V를 추천하는데, 소모전류를 봤을 땐 3V정도에도 문제 없을 듯 합니다.)
3. GPIO 핀 점퍼케이블 이나 확장 케이블세트
라즈베리파이에는 핀이 40개 있죠. 핀 하나 하나 연결할 수 있는 점퍼케이블도 좋고,
저는 40핀 짜리를 한번에 꽂아서 뺄 수있는 확장 케이블세트를 구입했습니다.
확장 세트에 각 pin 정보도 프린팅 되어있어 더욱 편리합니다.
4. 브레드보드
전자공학도라면, 이것 하나쯤은 가지고 계실 것 같습니다.
저와 같은 컴퓨터공학도라면, 하나 장만하시면 됩니다. ^^
LED와 저항은 지인을 통해 얻었지만,
케이블과 브레드보드 구입기는 아래 링크를 참고해주세요. : )
http://ironmask.net/387
아래에 그림들이 잘 안보이시면, 클릭해주세요! 큰 화면으로 보입니다. ^^
저항 띠색 읽는 방법
브레드보드에 부품을 세팅할 때는 전압, 저항, 전류를 고려해야 합니다.
사실 별 것 아닙니다만, 저항을 잘못 세팅하면, 많은 전류가 흘러 연결한 장치가 망가질 수 있습니다.
어릴 적 과학시간에 배웠던 V = I * R 을 생각해 봅시다 ㅋㅋㅋ
그리고, 저항을 얻어서 사용하다 보니 몇 옴짜리 인지 몰랐는데,
저항에 표시된 띠색깔로 값을 알 수가 있는 거였습니다. :)
아래를 잘 참고하셔서 500옴 정도 되는 것을 고르세요 ㅎㅎ
이 표에 따라 아래와 같이 읽으시면 됩니다.
저항은 색띠의 개수가 4개인것도있고 5개인것도 있고 또 3개인것도 있습니다.
4색띠 읽는 방법은 위와 같습니다.
제 1색과 2색은 수로 십의 자리와 일의자리로 본 뒤에 승수를 곱하면 됩니다 그리고 오차범위를 구하시면 됩니다.
주황색(수) 주황색(수) 빨간색(승수) 금색(오차범위) 순서라면
3 3 * 100 = 3300Ω 이 되는 것입니다.
그리고 금색의 오차범위는 ±5%이므로
3300Ω,오차±5% 이렇게 읽을수가 있는것입니다
또 1000Ω =1kΩ이므로 3300Ω은 3.3kΩ으로 나타낼수가 있습니다.
*여기서 오차범위란 저항이 항상 똑같은 값 만큼만 저항을 주는게 아니라서
약간의 오차가 있을수 있는데 그것의 범위를 나타내는 것입니다.
3300옴의 오차범위 5%는 165옴이므로
3135옴 ~ 3465옴까지의 저항값이 오차가 있을수 있다는 것을 의미합니다.
이 또한 4색 저항 읽는 법과 비슷한데요 '제 3색(수)'가 추가되었을 뿐 4색 저항과 방법은 같습니다.
제 1색과 2색과 3색을 각자 백의 자리 십의 자리 일의 자리로 본 뒤에 승수를 곱해주시면 됩니다.
노란색(수) 보라색(수) 검정색(수) 검정색(승수) 갈색(오차범위) 순서라면
4 7 0 * 1 = 470Ω 이 되는 것입니다.
그리고 갈색의 오차범위는 ±1%이므로
470Ω,오차±1% 이렇게 읽을수가 있는것입니다
또 1000Ω =1kΩ이므로 470Ω은 0.47kΩ으로 나타낼수가 있습니다.
*여기서 오차범위란 저항이 항상 똑같은 값 만큼만 저항을 주는게 아니라서
약간의 오차가 있을수 있는데 그것의 범위를 나타내는 것입니다.
470옴의 오차범위 1%는 4.7옴이므로
465.3옴 ~ 474.7옴까지의 저항값이 오차가 있을수 있다는 것을 의미합니다.
출처 : http://blog.naver.com/ygs1090/220085805951
LED 컨트롤 C언어 소스코드
원래 디바이스 드라이버 부터 손대보려고 했기에,
C언어로 접근을 먼저 해보려 합니다.
기존 제공하는 GPIO컨트롤 디바이스 드라이버를 사용하는 리눅스 응용프로그램을 만들면 되는데요.
리눅스 응용프로그램이란, C언어로 구현한 소스코드를 리눅스환경 버젼의 gcc 컴파일러로 컴파일해서 나온 결과물 입니다.
그리고, 라즈베리파이는 ARM 제조사의 코어를 사용하므로, 이에 맞는 버젼의 gcc 컴파일러가 필요한데,
이미 라즈비안OS에는 설치되어 있는 것 같군요. ^^
각설하고, 코드는 아래와 같습니다. ^^
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
int led(int gpio)
{
int fd;
char buf[BUFSIZ];
fd = open("/sys/class/gpio/export",O_WRONLY); /* Export */
sprintf(buf, "%d", gpio);
write(fd, buf, strlen(buf));
close(fd);
sprintf(buf, "/sys/class/gpio/gpio%d/direction", gpio); /* Direction */
fd = open(buf, O_WRONLY);
write(fd, "out", 4); /* input: write(fd, "in", 3) */
close(fd);
sprintf(buf, "/sys/class/gpio/gpio%d/value", gpio); /* Output value */
fd = open(buf, O_WRONLY);
write(fd, "1", 2);
close(fd);
getchar(); /* Wait for key input */
fd = open("/sys/class/gpio/unexport", O_WRONLY); /* Unexport */
sprintf(buf, "%d", gpio);
write(fd, buf, strlen(buf));
close(fd);
return 0;
}
int main(int argc, char** argv)
{
int gno;
if(argc < 2)
{
printf("Usage : %s GPIO_NO\n", argv[0]);
return -1;
}
gno = atoi(argv[1]);
led(gno);
return 0;
}
디바이스파일에 값을 출력해서 라즈베리파이의 GPIO를 제어할 수도 있습니다. 이 글에 나온 명령어와 코드는 "사물인터넷을 위한 리눅스 프로그래밍 with 라즈베리파이" 책의 108쪽부터 나온다고 합니다.
출처 : http://blog.naver.com/specialist0/221106973238
gcc 컴파일 후 나온 결과물 파일을 실행시킬 때,
인자로 GPIO 핀 넘버를 붙여주시면 됩니다. ^^
ex) pi@raspberrypi :~ $ LED_Test 12 (12번 핀 일때)
LED 컨트롤 연결구조 및 시연
확장케이블 세트와 브레드보드 입니다.
브레드보드 크기가 조금 아쉽네요..
확장케이블과 브레드보드 그리고 저항과 LED 까지 연결한 모습!!
제대로 진행되었다면, 요로케 LED에 불이 들어옵니다. ^^
LED 발 2개가 GPIO 핀과 GND에 담궈야 함을 잊지 마세요!!