개발자/Raspberry Pi

라즈베리 파이 GPIO pin 상태를 읽어 이용하기 - GPIO pull up 사용

지구빵집 2016. 4. 19. 16:46
반응형


라즈베리 파이 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 로 읽혀지기 때문에 어디에 꼽혔는지 알 수 있다.






궁금한 사항이나 이해가 가지 않는 부분은 언제든지 질문하여 주시기 바랍니다.




반응형