사물인터넷 (IOT)는 우리가 일상에서 접할수 있는 사물들이 인터넷과 연결되어 우리의 삶을 유익하게 하는 기술을 이야기 합니다. 해당 분야의 관심도와 사업성은 커지고 있고 워크식스의 고객들의 요구사항을 만족 시키고 정확한 개발 상담을 위해 라즈베리파이, 아파치, PHP, C 를 이용해 사물인터넷 (IOT) 을 테스트 하였습니다.

이 글은 사물인터넷 기술로 LED를 끄고 켜는 개발 연구 및 테스트 과정을 설명하는 글이 되겠습니다.


 

라즈베리파이는 손바닥만한 크기의 싱글보드 컴퓨터로 저렴한 가격에 원할한 퍼포먼스를 낼수 있습니다. 자세한 정보는 https://www.raspberrypi.org/ 에서 확인할 수 있습니다.

가장 보편적으로 사용되는 웹 서버를 구성하고 웹 기능을 구현하는데  아파치와 PHP를 사용하였으며, 이는 인터넷과 사물을 연결하는 매개가 됩니다.

여기서 C 언어는 사물을 컨트롤 하는데 사용되며, 많은 언어 중에 C 언어를 선택한 이유는 산업현장에서 가장 많이 사용되는 언어이기 때문 입니다.





라즈베리파이 OS설치


다음글을 참조하여 OS를 설치합니다. 

[LAB] - [워크식스] 라즈베리파이3 OS설치 (라즈비안 LITE)





라즈베리파이와 LED의 연결


물리적으로 라즈베리파이와 LED를 다음과 같이 연결하였습니다.


 example raspberry LED

LED는 극성이 있는 전자부품으로 +부분은 신호가 출력되는 40번핀(GPIO21)에 -부분은 220옴 저항을 거쳐 39번핀(Ground)로 연결 합니다.


다음은 라즈베리파이 핀맵 입니다. 연결시 참고 합니다.


raspberry pinmap





C언어로 라즈베리파이의 핀을 컨트롤 하기위한 wiringPi 라이브러리 설치


C언어로 라즈베리파이의 핀을 컨트롤을 도와주는 wiringPi 라이브러리가 있습니다.


wiringPi는 github에서 다운로드 받아 사용할수 있습니다. 


우선 다음 명령어로 git-core 라이브러리를 설치해줍니다.



$ sudo apt-get install git-core


 


github에서 wiringPi를 다운로드 받아 옵니다.



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




wiringPi를 설치해 줍니다.



$ sudo ./wiringPi/build


 







C언어로 LED 동작 예제 만들기


C 언어 프로젝트를 관리를 편하게 하기 위해서 project  폴더를 만들어 주고 폴더로 이동 합니다.



$ mkdir project

$ cd ./project




C프로그램을 만들 파일을 하나 만듭니다.



$ nano led_test.c


 


LED를 켜고 끌수 있는 C 프로그램을 짭니다.


#include<stdio.h>

#include<wiringPi.h>


#define LED4 29  //led


void red_on();

void led_off();


int main(int argc, char* argv[]){

    

    int data;

    

    if(wiringPiSetup()==-1){

        return 1;

    }

   

    pinMode(LED4,OUTPUT);


    if(argc == 1){

        fputs("옵션을 입력하지 않으셨습니다.",stderr);

        return 1;

    }else{

        data = (int)argv[1][0];

    }    

    

    if(data=='r'){

        red_on();

    }


    if(data=='x'){

        led_off();

    }


return 0;


}


void red_on(){

    digitalWrite(LED4,1);

    printf("on");

}


void led_off(){

    digitalWrite(LED4,0);

    printf("off");

}



ctrl + X로 저장해줍니다.



위 C프로그램에서 #define LED4 29 는 wiringPi에서 핀번호 입니다. 라즈베리파이 핀번호와 wiringPi 핀번호는 서로 다르며, 다음과 같이 매칭정보를 확인할 수 있습니다.


$ gpio readall



Physical 이 라즈베리파이 핀번호이며 wPi 가 wiringPi의 핀번호 입니다.






C언어 동작 테스트


작성한 C언어 프로그램을 동작시키기 위해선 컴파일하여 실행파일을 만들어줘야 합니다.



$ gcc -o led_test led_test.c -lwiringPi


 

gcc -o [만들어질 실행파일명] [실행파일을 만들기위해 준비된 파일] -lwiringPi  의 규칙으로 명력어를 써서 컴파일 합니다.




$ ls -la



위와 같은 명령어로 확인해보면 led_test라고 파일하나가 더 생긴것을 확인할 수 있습니다.



실행은 다음과 같이 합니다.



$ sudo ./led_test r



여기서 r은 파라미터로 C언어 프로그램에서 r 이 입력되면 켜지라고 작성된 내용을 보실 수 있습니다. if(data=='r')


반대로 LED를 끄려면 다음과 같이 실행 합니다.



$ sudo ./led_test x


 







아파치 및 php 설치


아파치를 설치해 줍니다.



$ sudo apt-get install apache2


 


php를 설치해 줍니다.



$ sudo apt-get install php5


 


관리를 편하게 하기 위해서 폴더를 하나 만듭니다.



$ mkdir web




새로 만든 web 폴더 안에 php 파일을 넣어서 관리 할것 이기때문에 아파치의 root 경로를 변경해 줄것 입니다. 설정 파일을 엽니다.



$ sudo nano /etc/apache2/apache2.conf



<Directory /var/www> 를 찾아서 해당 부분을 # 기호로 주석 처리 한후 아래와 같이 /home/pi/web 을 추가해줍니다. <Directory /var/www> 의 경로를 /home/pi/web 으로 변경해도 됩니다.



#<Directory /var/www>

#        Options Indexes FollowSymLinks

#        AllowOverride None

#        Require all granted

#</Directory>


<Directory /home/pi/web>

        Options Indexes FollowSymLinks

        AllowOverride None

        Require all granted

</Directory>



ctrl + x 로 저장 합니다.


한가지 설정을 더 필요 합니다. 다음 설정 파일을 엽니다



$ sudo nano /etc/apache2/sites-available/000-default.conf



/var/www 를 /home/pi/web 로 변경해줍니다. 



#DocumentRoot /var/www

DocumentRoot /home/pi/web


 


변경된 설정이 적용되도록 아파치를 재시작 해줍니다.



$ sudo service apache2 restart


 


설치가 정상적으로 완료되었는지 index.php 파일을 하나 만들어 테스트 해봅니다.



$ nano /home/pi/web/index.php




<? phpinfo(); ?>


 

ctrl + x 로 저장 합니다.


정상적으로 설치되었다면 웹브라우저에서 다음과 같이 보여 집니다.










PHP에서 C언어 파일 실행 시키는 파일 만들기 (컨트롤 웹페이지)


index.php 파일을 다음과 같이 내용을 변경해줍니다.



<style>


*{

    outline:none;

 -webkit-tap-highlight-color:rgba(0,0,0,0);

 -webkit-tap-highlight-color:transparent;

}



body{

    padding:100px;

}


button{

    border-radius: 4px;

    border:1px solid #eee;

    background:#f5f5f5;

    cursor: pointer;

}

button.on{

    background:yellow;

}


</style>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>


<button id="on_btn">LED ON</button> <button id="off_btn" class="on">LED OFF</button>



<script>


$(function(){


    $('#on_btn').click(function(){

        if(!$(this).hasClass('on')){

            $.post('./action.php',{"go":"on"},function(res){

                if(res=='on'){

                    $('#on_btn').addClass('on');

                    $('#off_btn').removeClass('on');

                }

            },'text');

        }

    });


    $('#off_btn').click(function(){

        if(!$(this).hasClass('on')){

            $.post('./action.php',{"go":"off"},function(res){

                if(res=='off'){

                    $('#off_btn').addClass('on');

                    $('#on_btn').removeClass('on');

                }

            },'text');

        }

    });


});


</script>




ctrl + x 로 저장 합니다.


두번째 파일을 작성해 줍니다.



$ nano /home/pi/web/action.php




<?

$mode = $_POST['go'];


if($mode=='on'){

    exec('sudo /home/pi/project/led_test r',$result);

}else{

    exec('sudo /home/pi/project/led_test x',$result);

}


echo $result[0];

?>



ctrl + x 로 저장 합니다.


위 두 php파일은 ajax로 LED 동작을 요청하고 C 프로그램을 실행 시키는 동작을 하게 합니다. 이후 C 프로그램은 정상적으로 동작되면 결과를 ajax를 통해서 리턴해주게 되고 버튼의 상태가 변경되게 됩니다.







웹페이지에서 LED 동작테스트


실제로 동작해봅니다.


웹페이지로 접속해서 버튼을 클릭해 봅니다. 



그러나 정상적으로 동작되지 않습니다. 그리고 에러 로그가 남지도 않습니다.


저도 이곳에서 원인을 찾는데 한참 걸렸습니다. 원인은 wiringPi 는 sudo(root 권한)로 실행되어야 하는데 웹(www-data)은 권한을 가지지 못하기 때문 입니다.








오류 해결하기


www-data 에서 sudo를 사용할 수 있도록 권한을 변경해 줍니다.



$ sudo nano /etc/sudoers.d/010_pi-nopasswd



다음과 같이 www-data라인을 추가해줍니다.



pi ALL=(ALL) NOPASSWD: ALL

www-data ALL=(ALL) NOPASSWD: ALL



ctrl + x 로 저장 합니다.








웹페이지에서 LED 동작 다시 테스트


다시 웹브라우저에서 테스트 해봅니다.


정상적으로 LED가 켜지고 꺼지는 것을 확인할 수 있습니다.








[문의하기]








copyright ⓒ 2017. 워크식스






+ Recent posts