라즈베리 파이 GPIO pin 상태를 읽어 이용하기 - GPIO pull up 사용
라즈베리 파이의 GPIO 핀 상태에 따라 라즈베리 파이를 다르게 동작시키기 위한 방법을 설명한다.
라즈베리 파이에 wiringpi 라이브러리가 설치되어 있어야 한다. 라즈베리 파이와 wiringPi 라이브러리에 대한 자세한 설명과
설치방업은 아래 링크를 참조한다.
http://fishpoint.tistory.com/1814 - Raspberry Pi GPIO 와 wiringPi 라이브러리
현재 GPIO pin 4개는 아래와 같이 연결되어 있다.
즉 GPIO 16, GPIO 20, GPIO 19, GPIO 26 이 네 핀의 상태를 읽어오는 작업이다. 순서를 이야기 하면
1. 상태를 얻고자 하는 gpio pin 을 입력 input 으로 설정한다.
2. 그 핀의 상태를 pull up 으로 설정한다.
3. 아무것도 연결하지 않은 상태에서 핀의 값을 읽으면 high 로 읽어온다.(프로그램에서 pull up 으로 설정했기 때문)
4. 각각의 GPIO 핀을 GND 와 연결하고 읽어오면 low 값으로 읽어온다.
이런 방식으로 현재 어느 핀이 low 인가를 판단하여 동작하게 된다.
GPIO 16 핀이 low 면 인터넷 카메라로 동작하고
GPIO 20 핀이 low 면 로봇으로 동작하고
GPIO 19 핀이 low 면 아무일도 안하고
GPIO 26 핀이 low 면 자율 주행 하도록 선택해서 작업을 시킬 수 가 있다.
간단하게 작성된 소스코드를 살펴보면
#include <signal.h> //Signal 사용 헤더파일 #include <unistd.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> //exit() 사용 헤더파일 #include <wiringPi.h> #define TEST1 28 // GPIO 20 #define TEST2 27 // GPIO 16 #define TEST3 25 // GPIO 26 #define TEST4 24 // GPIO 19 void sig_handler(int signo); // 마지막 종료 함수 int main (void) { signal(SIGINT, (void *)sig_handler); //시그널 핸들러 함수 if (wiringPiSetup () == -1) { fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno)); return 1 ; } pinMode (TEST1, INPUT) ; pinMode (TEST2, INPUT) ; pinMode (TEST3, INPUT) ; pinMode (TEST4, INPUT) ; pullUpDnControl (TEST1, PUD_UP) ; pullUpDnControl (TEST2, PUD_UP) ; pullUpDnControl (TEST3, PUD_UP) ; pullUpDnControl (TEST4, PUD_UP) ; for (;;) { if(digitalRead(TEST1)) printf("test1 pin high\n"); else printf("test1 pin low\n"); delay(500); if(digitalRead(TEST2)) printf("test2 pin high\n"); else printf("test2 pin low\n"); delay(500); if(digitalRead(TEST3)) printf("test3 pin high\n"); else printf("test3 pin low\n"); delay(500); if(digitalRead(TEST4)) printf("test4 pin high\n"); else printf("test4 pin low\n"); delay(500); } return 0 ; } void sig_handler(int signo) { printf("process stop\n"); digitalWrite (TEST1, 0) ; // Off exit(0); }
핀을 입력으로 설정하고 pull up 설정하고 읽어오면 상태를 알 수 있다.
이게 사용된 실제 사진이다. 사실 회로도는 전화선 RJ11 연결도이다. 아래 사진처럼 전화기 잭을 이용하여 GPIO 핀과 GND 를 연결한 전화기 잭을 꼽는 위치에 따라 해당 핀만 Low 로 읽혀지기 때문에 어디에 꼽혔는지 알 수 있다.
궁금한 사항이나 이해가 가지 않는 부분은 언제든지 질문하여 주시기 바랍니다.
'개발자 > Raspberry Pi' 카테고리의 다른 글
Nodejs 를 사용하여 mcp3208 ADC 컨버터 사용하여 데이터 읽어오기 (0) | 2016.09.07 |
---|---|
라즈베리 파이에서 Gstreamer 설치 테스트 스트리밍하는 방법 (7) | 2016.08.31 |
8G SD 카드 이미지 백업 받은것을 32G SD 카드에 굽고 난 다음 (0) | 2016.08.11 |
스마트 농장 안드로이드 앱 소스 파일 (0) | 2016.06.29 |
라즈베리 파이의 씨리얼포트(UART)- RX, TX 를 데이터 입출력으로 사용 (0) | 2016.03.31 |
Raspberry Pi GPIO 와 wiringPi 라이브러리 (0) | 2016.03.24 |
라즈베리 파이 7인치 터치스크린 touch screen 디스플레이 (0) | 2016.02.14 |
사물인터넷 DIY 방과후 강사 양성 교육 - 강의 후기 (0) | 2016.01.28 |
더욱 좋은 정보를 제공하겠습니다.~ ^^