본문 바로가기
코스웨어/16년 스마트컨트롤러

2016-04-26_조재찬_업무일지_디지털제어-RPi GPIO 제어

by 알 수 없는 사용자 2016. 4. 26.
728x90
반응형


라즈베리 파이, WiringPi를 이용한 GPIO 제어



WiringPi 설치하기전 Git 설치


sudo apt-get install git-core



라즈베리 파이 업데이트

sudo apt-get update

sudo apt-get upgrade



Git을 통해 WiringPi 내려받기

git clone git://git.drogon.net/wiringPi



다운로드 완료 후, 빌드 수행

cd wiringPi

./build




gpio 유틸리티 실행



GPIO 확장보드의 28과 29핀을 쓸 것. (BCM 20, 21)



라즈베리파이 GPIO (General purpose input/output)







74HC08N, Quad 2-input AND gate







LED켜기 

#include <wiringPi.h>
#include <stdio.h>

#define         A       28
#define         B       29

int main(void)
{
        wiringPiSetup();

        pinMode(A,OUTPUT);
        pinMode(B,OUTPUT);

        while(1)
        {
                printf("A = Lo, B = Lo: Out = ?\n");
                digitalWrite(A,LOW);
                digitalWrite(B,LOW);
                delay(1000);

                printf("A = Lo, B = Hi: Out = ?\n");
                digitalWrite(A,LOW);
                digitalWrite(B,HIGH);
                delay(1000);

                printf("A = Hi, B = Lo: Out = ?\n");
                digitalWrite(A,HIGH);
                digitalWrite(B,LOW);
                delay(1000);

                printf("A = Hi, B = Hi: Out = ?\n");
                digitalWrite(A,HIGH);
                digitalWrite(B,HIGH);
                delay(1000);
        }
        return 0;
}



컴파일시 -lwiringPiDev 붙여줘야 함


 pi@raspberrypi:~/wiringPi $ gcc -o Gpio GPIO_RPi.c -l wiringPi 


실행

pi@raspberrypi:~/wiringPi $ sudo ./Gpio



실행결과



 AND GATE이므로 28,29핀에 HIGH 신호가 들어올 때(4번째 PRINTF문) 불이 켜지는 것을 볼 수 있다.

digitalWrite(A,HIGH); digitalWrite(B,HIGH);




LED없이 출력값 보기

#include <wiringPi.h>
#include <stdio.h>

#define    IN  27
#define         A       28
#define         B       29

int main(void)
{
        wiringPiSetup();

  pinMode(IN,INPUT);
        pinMode(A,OUTPUT);
        pinMode(B,OUTPUT);

        while(1)
        {
                printf("A = Lo, B = Lo: Out = ");
                digitalWrite(A,LOW);
                digitalWrite(B,LOW);
    if(digitalRead(IN))
    {
      printf("Hi\n");
    }
    else
    {
      printf("Lo\n");
    }
                delay(1000);

                printf("A = Lo, B = Hi: Out = ");
                digitalWrite(A,LOW);
                digitalWrite(B,HIGH);
    if(digitalRead(IN))
    {
      printf("Hi\n");
    }
    else
    {
      printf("Lo\n");
    }
                delay(1000);

                printf("A = Hi, B = Lo: Out = ");
                digitalWrite(A,HIGH);
                digitalWrite(B,LOW);
    if(digitalRead(IN))
    {
      printf("Hi\n");
    }
    else
    {
      printf("Lo\n");
    }
                delay(1000);

                printf("A = Hi, B = Hi: Out = ");
                digitalWrite(A,HIGH);
                digitalWrite(B,HIGH);
    if(digitalRead(IN))
    {
      printf("Hi\n");
    }
    else
    {
      printf("Lo\n");
    }
                delay(1000);
        }
        return 0;
}



위 소스 if 문에 대한 설명


1 == digitalRead(IN))             // 1은 참을 의미, 디지털 신호가 들어올 때.

1 =! digitalRead(IN))               // 1이 아닐때는 왼쪽과 같이 소스를 짤 수 있음.



결과 : 두 핀 모두 HIGH일 때, Hi라는 문장이 출력된다.

 printf("A = Hi, B = Hi: Out = ");

digitalWrite(A,HIGH); digitalWrite(B,HIGH); if(digitalRead(IN)) { printf("Hi\n"); }




728x90