gpioPushBtnWithPopen.tar.gz
    0.00MB

    AIoT Kit에서 /dev/mem을 읽어서 프로그램을 실행하려면 몇가지 문제가 발생될 수 있다. 그중에서 가장 크게 느껴지는 문제는 수퍼유저 권한을 획득해야 접근을 할 수 있는데, 개발이 완료된 프로그램은 소유권을 지정해서 실해할 수 있는데 반해서 개발도중 해당 장치에 접근할 때 권한 문제가 발생되며, GDB와 관련이 어느정도 있어보인다. 

     

    관련해서 검색을 해보았는데, 수퍼유저 권한으로 라즈비안을 실행하면 되는데, 최근 업데이트의 문제인지 화면이 바뀌는 문제가 있다. 물론, 필자가 가지고 있는 예전 이미지로 했을 때는 크게 문제가 없는데 apt-get upgrade를 진행한 시점과 관계가 있는지 다른 형상이 보인다. 

     

    어쨋거나 그러면 라즈베리파이에서 gpio를 제어하는 방법을 sys 디바이스로 설정하여 사용하면 popen을 이용하여 값을 손쉽게 읽을 수 있다. 

     

    사용방법은 아래와 같다.

     

    1. GPIO 등록

    echo 명령과 GPIO번호, 그리고 gpio의 export에 아래와 같이 등록한다. 아래의 예시는 GPIO0을 sys디바이스로 등록하는 방법이다.

     

    echo 0 > /sys/class/gpio/export

     

    2. GPIO 입출력 설정

    등록이 완료되었으면 입출력 설정을한다.  아래의 예시는 입력이다. 출력으로 설정하려면 out으로 지정할 수 있다. 

     

    echo in > /sys/class/gpio/gpio0/direction

     

    3. GPIO 값 읽기

    AIoT 키트의 SW6을 누른상태로 다음과 같이 입력해서 값을 출력해보자.

     

    cat /sys/class/gpio/gpio0/value

     

    gpio0의 버튼을 눌렀을 때는 0, 뗏을 때는 1이 출력됨을 확인할 수 있다. 

     

     

    이 방식을 이용하여 popen을 이용하면 실행 결과를 가져갈 수 있다. 위의 결과를 보면 0 또는 1로 한 글자만 출력이 되는 것을 확인할 수 있다. 

     

    이정도 까지만 설명하고 첨부된 소스를 확인해고 이해해보도록 하자. 

     

     

    소스 내용설명을 요약하자면,

     

    1. 생성자

      

    앞서 sys디바이스로 사용할 GPIO를 등록한다. AIoT 키트에서는 GPIO 0,1,4,5번을 등록하면 된다. 

     

    그리고 타이머를 하나 설정하고, 타이머 이벤트를 connect()로 등록한다. 

     

    2. 소멸자

     

    소멸자에서는 export했던 gpio를 unexport하여 GPIO 사용을 종료한다.

     

    3. 타이머 이벤트 메서드

     

    GPIO0,1,4,5의 상태를 읽을 수 있도록 하고, 해당 값이 0이면 오랜지색, 1이면 회색으로 출력한다. 

     

    그런데, popen에서 읽는 값은 문자이므로 문자 0은 48(Dec)이므로 -48을 해주면 0이 되므로 48을 빼준다.

     

    4. 값을 읽어오는 매서드

     

    unsigned char MainWindow::getOneByteValueOfExe(int chan)
    {

        FILE *pFile;                // 파일 포인터
        unsigned char value;   // 값 

        switch(chan)
        {
        case 0:   // 채널 0을 읽을 경우
            pFile = popen("cat /sys/class/gpio/gpio0/value", "r");
            break;
        case 1:
            pFile = popen("cat /sys/class/gpio/gpio1/value", "r");
            break;
        case 2:
            pFile = popen("cat /sys/class/gpio/gpio4/value", "r");
            break;
        case 3:
            pFile = popen("cat /sys/class/gpio/gpio5/value", "r");
            break;
        default:
            qDebug() << "xxx";
            break;
        }


        value = fgetc(pFile);   // 실행파일이 오픈되었으면 fgetc를 이용하여 1바이트만 읽어서 저장


        pclose(pFile);     // 파일 열어줬으니 닫아주고

        return value;     // 값을 반환한다.
    }

     

    어렵지 않게 GPIO의 상태를 읽어올 수 있다. 

     

    QT로 샘플을 작성했으니, 필요한 독자께서는 잘 고쳐서 사용하기 바란다.

     

    실행결과, 0번 2번 버튼 누른상태.

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기