본문 바로가기

개발자/Raspberry Pi

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

반응형


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






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




반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩