본 포스팅에서는 라즈베리파이와 아두이노를 지그비 통신을 활용하여 무선으로 연결하고 이를 통해 온습도 센서 데이터를 전송받아 파이의 웹서버에 차트로 뿌려주는 프로젝트에 대한 내용을 서술하려고 한다. 또한 여기에 추가적으로 웹서버 접속을 통해 집밖에서도 전등을 제어할 수 있도록 할 것이다.(여기서는 실제 전등 대신 LED로 대체) 말은 거창하지만 실상 그다지 어려운 부분은 없으며 최대한 상세하게 설명하고자 하니 파이를 활용한 스마트홈 구축이나 기타 IOT와 관련된 프로젝트를 진행하고자 하는 사람들에게 도움이 되길 바란다.

 

우선 지그비 통신에 대한 기본 개념과 설정 방법의 경우에는 아두이노 카테고리에 자세히 포스팅 해놓았기 때문에 꼭 참고하기 바라며 지그비 모듈에 대한 모든 설정이 마쳐진 상태에서 시작하도록 하자. 필요 준비물은 라즈베리파이와 아두이노, 설정이 완료된 지그비 모듈 2개, 마지막으로 온습도센서(여기서는 DHT11 사용)가 필요하다.

 

 

1. 동작흐름도


시작하기에 앞서 어떤 방식으로 어떻게 구현할 것인지 소개하기 위해 간단하게 흐름도를 만들어보았다. 먼저 센서부의 경우에는 아두이노와 온습도 센서로 구성되며 센서 데이터를 측정하고 라즈베리파이에 지그비 모듈을 통해 전송하게 될 것이다. 그리고 라즈베리파이에서는 파이썬 프로그램을 통해 전송받은 센서 데이터를 MySql DB로 저장하게 되며 마지막으로 php 기반의 자체 웹서버와 저장된 DB를 연결하여 아두이노로 부터 받은 센서 데이터를 차트로 도식화하여 보여주게 된다.

 

 

2. 아두이노 설정 



아두이노 회로 구성에 경우 위와 같이 온습도 센서(DHT11)와 지그비 모듈을 결선하도록 하며 코드는 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <DHT11.h>
#include <SoftwareSerial.h>
SoftwareSerial xbee(23); 
int pin=4;
DHT11 dht11(pin); 
 
void setup()
{
  xbee.begin(9600); 
}
 
void loop()
{
  int err;
  float temp, humi;
  if((err=dht11.read(humi, temp))==0)
  {
    xbee.print(temp);
    xbee.print(",");
    xbee.print(humi);
    xbee.println();
    delay(60000);
  }
}
cs


 

3. 라즈베리파이 설정


필자도 이 부분에서 많이 애를 먹었다. 아두이노에서는 간단하게 코드 몇 줄이면 지그비 모듈을 사용할 수 있는 반면에 라즈베리파이의 경우 UART 통신을 하려면 따로 설정이 필요하기 때문이다. 또한 파이1에서는 2로 넘어오면서 설정 방법이 바뀌는 바람에 시간을 많이 날려버렸다. 여기서는 파이2에 대한 방법을 서술하도록 하겠다.

 

먼저 초기 설정값을 default로 만들기 위해 ttyAMA0에 대한 모든 설정을 삭제하도록 한다. 여기서 ttyAMA0는 우리가 지그비 통신을 위해 사용하게될 시리얼 포트 이름이다.


  $ sudo nano /boot/cmdline.txt


모두 삭제가 완료되면 다음과 같은 코드만 남아있어야 한다. 물론 기존의 것이 아래와 같다면 수정할 필요는 없다.


  dwc_otg.lpm_enable=0 rpitestmode=1 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait


또한 라즈베리파이 아크 리눅스 환경에서는 ttyAMA0 포트가 이미 설정된 상태로 시스템 콘솔에서 동작하고 있다. 따라서 포트를 사용하기 위해서는 기존의 동작하고 있는 상태를 disable 시켜주어야 하므로 터미널에 다음과 같은 명령어를 쳐서 포트를 정지시키도록 한다.


  $ sudo systemctl mask serial-getty@ttyAMA0.service


마지막으로 라즈베리파이의 회로 구성은 다음과 같이 진행하여 설정을 모두 마치도록 하자.




4.  웹서버 환경 구축


라즈베리파이를 외부에서도 접속하고 관리할 수 있도록 웹서버를 구축해보도록 하자. 여기서는 웹서버의 표준 구성이라고 할 수있는 APM(Apache + PHP + MySQL)을 설치하려고한다. APM은 라즈베리파이를 강력한 웹서버로 활용할 수 있게 해줄 뿐만아니라 웹사이트를 보다 쉽게 운영하고 관리할 수 있도록 도와줄 것이다. 따라서 파트별로 간단하게 어떤 역할을 하는지와 설치 방법을 알아보도록 하며 언어 문법이나 보다 자세한 내용은 따로 검색해 볼 것을 추천한다.


1) Apache

아파치는 우리가 구축할 웹서버을 동작시키는데 있어서 가장 중요한 역할을 하는 웹 서버 어플리케이션이다. 리눅스 기반으로 만들어져 있으며 확장성이 좋아 여러 모듈을 통해 수많은 기능을 덧붙일 수 있다.(PHP, MySQL 등) 또한 매우 단순하면서 강력한 무료 웹서버를 무료로 제공하기 때문에 서버 애플리케이션 중에서 가장 인지도가 높다.


$ sudo apt-get update

$ sudo apt-get install apache2


위 명령어를 통해 설치가 완료되면 자동으로 설정되는 기본위치인 /var/www경로를 사용할 수 있도록 권한 설정을 하자.


$ sudo chown pi -R /var/www

$ sudo chmod 0777 /var/www


마지막으로 라즈베리파이가 부팅시에 프로그램이 가동될 수 있도록 설정해준다.


  $ sudo update-rc.d apache2 defaults


2) MySQL

데이터베이스(DB)란 데이터를 쉽게 저장하고 검색할 수 있는 시스템을 말하며 이 데이터를 삽입하고 검색할 수 있는 언어가 바로 SQL이다. 따라서 MySQL은 데이터를 보다 쉽게 관리하게 해주며 데이터 저장에 특화되어 있는 오픈소스 애플리케이션이다.


  $ sudo apt-get install mysql-server mysql-client libmysqlclient-dev


설치가 완료되면 MySQL 접속에 필요한 비밀번호를 2번 입력하도록 한다. 또한 외부에서 데이터베이스에 접속할 수 있게 바인드 어드레스를 비활성화 한다. 여기서 바인드 어드레스란 해당 주소에서만 접속을 허용하며 그 외는 접속을 차단해주는 주소를 의미한다.


  $ sudo nano /etc/mysql/my.cnf



위처럼 bind-adreess 앞에 #을 붙여주면 주석처리되어 비활성된다.


3) PHP

PHP는 웹페이지에 동적 기능을 불어넣어 주는 서버단에서 동작하는 프로그래밍 언어이다. 사실 HTML 만으로는 사용자의 입력에 유연하게 반응하지 못하기 때문에 PHP는 이러한 정적 HTML에 동적으로 동작할 수 있도록 개발되었다. 때문에 HTML의 처리에 강점을 가지며 다양한 데이터베이스를 지원하기 때문에 데이터베이스와 사용자간의 중간 다리 역할도 훌륭히 수행한다.


  $ sudo apt-get install php5


설치 후 PHP를 효과적으로 관리할 수 있도록 도와주는 PHP MyAdmin도 설치하도록 하자. 이때 웹서버 인증은 apache2를 선택하고 웹에서 사용할 비밀번호를 3번 정도 입력하면 설치가 완료된다.


  $ sudo apt-get install phpmyadmin



4) Python 

마지막으로 파이썬의 경우 지그비 통신을 통해 온습도 데이터를 수신받는 역할을 할 것이며 이 데이터를 MySQL의 데이터베이스로 만들어 줄 것이다. 따라서 파이썬에서 MySQL로 접속할 수 있도록 연동해주어야하며 아래와 같은 라이브러리 설치가 필요하다.


  $ sudo apt-get install libmysqlclient-dev

$ sudo apt-get install python-dev

$ sudo pip install MySQL-python


설치가 모두 마무리되면 제대로 동작하는지 확인을 위해 파이썬 쉘을 실행시키고 import MySQLdb 를 입력해보자. 에러없이 그대로 임포트 된다면 성공적으로 설치가 완료 되었으므로 파이썬에서 DB를 생성할 수 있다. 반면에 에러 발생시에는 실수한 것은 없는지 순서대로 확인해보도록 한다.


이제 필요한 모든 설정을 마쳤다. 다음 포스팅에서는 위 프로그래밍 언어들을 사용하여 온습도 데이터를 기반으로 하는 스마트홈 구축과 관련된 내용을 서술하도록 하겠다.