자 이제 본격적으로 스마트홈 구축을 위한 프로그래밍을 진행해보자. 앞에서 언급했던 것 처럼 파이썬은 지그비 통신을 활용하여 온습도 데이터를 수신받아 데이터베이스화 할 것이며 PHP로 구축된 웹페이지에서 이 DB를 활용하여 차트로 도식화 한다. 이러한 프로그램 각각의 역할과 코드의 기능에 대해 정확히 알고 있어야 본 예제를 입맛에 맞게 수정하거나 응용할 수 있으므로 모쪼록 잘 이해하고 넘어가주길 바란다.



1. MySQL


MySQL을 다루려면 기본 SQL(Structured Query Language) 명령어를 어느정도 숙지하고 있어야 한다. 여기서 SQL은 데이터베이스의 자료를 검색하고 추가및 삭제 등의 조작을 할 수 있도록 고안된 컴퓨터 언어이다. 사람이 사용하는 언어와 문법 자체가 비슷하기 때문에 이해하기 쉽고 사후 관리도 편리하다. 또한 Query 라는 이름에서도 알 수 있듯이 검색 부문에 특화되어있는 데이터베이스이다.


구조 자체가 어렵진 않으니 여기서는 간단히 사용되는 명령어만 서술할 것이며 자세한 내용은 인터넷 상에 자료가 많으므로 검색해 볼 것을 추천한다.


  # MySQL 접속

mysql -u user -p password


위에서 user 부분은 사용자명을 뜻하며 따로 설정을 하지 않았다면 기본값인 root를 적어주며 password 부분은 MySQL을 설치할 때 생성한 비밀번호를 적어준다.


# 데이터베이스 생성

  CREATE DATABASE db_name;


# 데이터베이스 목록 표시

SHOW DATABASES;


# 데이터베이스 사용

USE db_name;


# 테이블 생성

  CREATE TABLE table_name(ddate datetime, zone text, temp float, humi float);


# 테이블 목록 표시

SHOW TABLES;


# 테이블 구조 표시

DESCRIBE table_name;


위 명령어 들을 사용해보면 데이터베이스를 만들거나 관리하는 것이 그렇게 어려운 부분이 아니라는 것을 알게 될 것이다. 자세한 설명은 생략하며 아래처럼 테이블까지 만들어서 파이썬을 통해 데이터베이스에 현재 시간과 장소, 온습도 데이터를 넣을 준비를 하자. 필자는 db의 이름을 testdb, 테이블의 이름을 tempdata로 지정했으며 다른 이름을 사용해도 무방하다.




2. Python


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import serial
import MySQLdb
import datetime
 
# Xbee 모듈과 시리얼 통신
port = serial.Serial("/dev/ttyAMA0""9600")
 
# MySQL 접속
db = MySQLdb.connect("localhost""User_name""User_password""testdb")
curs = db.cursor()
 
ZONE = "HOUSE"
print 'Start Monitor'
 
while True:
        try:
            # 지그비 통신을 통한 데이터 수신
            data = port.readline()
 
            print("House temp/humi is ")
            print(data)  
 
            # 수신한 데이터와 현재 시간 및 장소를 SQL 쿼리문으로 전송
            curs.execute("""INSERT INTO tempdata (ddate, zone, temp, humi) VALUES (%s,%s,%s,%s)""",
                (datetime.datetime.now().strftime('%Y-%m-%d %H:%M'), ZONE, data.split(',')[0], data.split(',')[1].strip()))
            db.commit()
 
        except KeyboardInterrupt:
                break
 
port.close()
db.close()

cs


파이썬 코드의 경우 먼저 지그비 통신을 하기 위해 Xbee 모듈과 시리얼로 연결된다. 그리고 MySQL에 접속하여 수신 받은 데이터를 SQL 쿼리문 형태로 전송하여 앞서 생성한 DB에 데이터를 입력하게된다. 제대로 동작한다면 다음과 같이 1분마다 DB에 데이터가 입력되는 것을 볼 수 있다.




3. Highcharts


다음은 저장된 DB를 가지고 그래프로 출력하는 법을 알아보겠다. 사실 DB와 연동하여 PHP 만으로도 꽤나 괜찮은 그래프를 만들어볼 수 있긴 하지만 여기서는 그보다 간단하면서 깔끔하게 나타낼 수 있는 오픈소스를 사용해보자. 차트를 만들어 볼 수 있는 오픈소스로는 Google chart나 Nwagon, chart.js 등의 다양한 종류가 있으며 여기서는 개인 홈페이지에서는 무료로 사용할 수 있으며 모바일 부분도 잘 지원해주는 highchart 소스를 활용할 것이다. 


주소는 다음과 같으며 해당 소스를 다운로드한 후 라즈베리파이의 웹서버 경로인 /var/www/html 에 압축을 풀어주면 된다.



http://www.highcharts.com/



4. PHP + HTML


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
 
// PHP 에러 코드 확인
ini_set('display_errors''On');
error_reporting(E_ALL|E_STRICT);
 
// MySQL 접속
$mysql_host = 'localhost';
$mysql_user = 'User_name';
$mysql_password = 'User_password';
$mysql_db = 'testdb';
$conn = @mysql_connect($mysql_host$mysql_user$mysql_password);
$dbconn = mysql_select_db($mysql_db$conn);
 
// DB에서 원하는 데이터 검색
$sql="
select * from (
SELECT DATE_FORMAT( ddate,  '%m-%d %HH' )  mdh , COUNT( * ) cnt, SUM( temp ) , 
round(SUM( temp ) / COUNT( * ),1)  atemper, round(SUM( humi ) / COUNT( * ),1)  ahumier
FROM  `tempdata`
GROUP BY DATE_FORMAT( ddate,  '%Y%m%d%H' )
order by ddate desc
limit 12
) t_a
order by t_a.mdh
";
 
$result = mysql_query($sql) ;
 
$str_mdh="";
$str_atemper="";
$str_ahumier="";
 
// 온습도 문자열 연결
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
 $str_mdh .="'".$row['mdh']."',";
 $str_atemper .="".$row['atemper'].",";
 $str_ahumier .="".$row['ahumier'].",";
}
 
// 오른쪽 공백 제거
$str_mdhsubstr($str_mdh,0,-1);
$str_atempersubstr($str_atemper,0,-1);
$str_ahumiersubstr($str_ahumier,0,-1);
 
?>
cs


highchart 웹페이지에서 예제 소스를 보면 아래 HTML 코드의 xAxis-categories 부분에 시간이나 날짜가, series-data 부분에 y축을 나타내는 데이터가 각각 쉼표와 함께 들어간다는 사실을 알 수 있을 것이다. 따라서 차트를 따라 그리려면 데이터가 알맞게 들어갈 수 있도록  PHP 코드상에서 한 문자열로 만들어주어야 한다. 


위 코드는 이러한 방식을 구현한 코드로서 select 문을 통해 db에서 데이터를 순서대로 가져온 후 while 문을 통해 각각의 날짜와 시간을 변수 str_mdh에 저장한다. 또한 온도와 습도 데이터는 변수 str_atemper와 str_ahumier 에 쉼표와 함께 한 문자열로 연결하고 최종적으로 뒤의 공백을 제거함으로서 완성한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<!DOCTYPE HTML>
<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>House Monitor</title>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <style type="text/css">${demo.css}</style>
        <script type="text/javascript">
 
$(function () {
    $('#temp').highcharts({
        chart: {
            type: 'line'
        },
        title: {
            text: 'Temperature'
        },
        subtitle: {
            text: 'http://creamp.tistory.com'
        },
        xAxis: {
            categories: [<?php echo $str_mdh?>]
        },
        yAxis: {
            title: {
                text: 'Temperature (°C)'
            }
        },
        plotOptions: {
            line: {
                dataLabels: {
                    enabled: true
                },
                enableMouseTracking: false
            }
        },
        series: [{
            name'HOUSE',
            data: [<?php echo $str_atemper?>]
        }]
      });
    $('#humi').highcharts({
        chart: {
            type: 'line'
   },
        title: {
            text: 'Humidity'
        },
        xAxis: {
            categories: [<?php echo $str_mdh?>]
        },
        yAxis: {
            title: {
                text: 'humidity (%)'
            }
        },
        plotOptions: {
            line: {
                dataLabels: {
                    enabled: true
                },
                enableMouseTracking: false
            }
        },
        series: [{
            name'HOUSE',
            data: [<?php echo $str_ahumier?>]
        }]
    });
});
        </script>
</head>
<body>
        <script src="https://code.highcharts.com/highcharts.js"></script>
        <script src="https://code.highcharts.com/modules/exporting.js"></script>
        <div id="temp" style="width: 900px; height: 440px; margin: 30px auto"></div>
        <div id="humi" style="width: 900px; height: 440px; margin: 30px auto"></div>
</body>
</html>
cs




5. 결과 화면


이제 모든 과정이 완료되었다. 라즈베리파이의 웹서버에 접속하여 위와 같은 화면이 제대로 나오는지 확인해보자.

 


본 포스팅에서는 라즈베리파이와 아두이노를 지그비 통신을 활용하여 무선으로 연결하고 이를 통해 온습도 센서 데이터를 전송받아 파이의 웹서버에 차트로 뿌려주는 프로젝트에 대한 내용을 서술하려고 한다. 또한 여기에 추가적으로 웹서버 접속을 통해 집밖에서도 전등을 제어할 수 있도록 할 것이다.(여기서는 실제 전등 대신 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를 생성할 수 있다. 반면에 에러 발생시에는 실수한 것은 없는지 순서대로 확인해보도록 한다.


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


이번에는 본격적으로 지그비 통신을 활용하여 무선통신을 실습해보도록 하겠다. 아직 지그비 통신에 대한 정확한 개념을 잡지 못했다면 전에 포스팅한 글을 꼭 참고하기 바란다. 실습에서는 지그비 설정 툴인 X-CTU에 대한 사용법을 숙달하고 컴퓨터 상에서 간단하게 통신을 테스트해본 뒤에 아두이노 2개를 가지고 서로 데이터를 주고받아보는 순으로 진행할 것이다. 또한 지그비 검색 결과 XBee S1 모듈에 대한 예제들은 많이 있었지만 S2 모듈 설정에 대한 글은 찾기가 매우 힘들었다. 따라서 여기서는 미약하나마 도움이 될 수 있도록 S2 모듈을 가지고 진행하려고 한다.



1. 지그비 통신 준비


- XCTU 프로그램

XCTU 프로그램은 XBee 모듈을 다루고 설정하기 위해 필수로 필요한 소프트웨어이다. XBee 모듈에 대한 ID, CH 등을 설정하고 테스트할 수 있는 환경을 제공해주며 최근 1~2년 사이에 새로 업데이트 되면서 UI 부분이 많이 바뀌었다. 전 버전과 동일한 기능을 수행할 수 있으므로 이번 실습에서는 최신 버전의 프로그램을 사용하도록 한다.

다운로드 : http://www.digi.com/products/xbee-rf-solutions/xctu-software/xctu 


- XBee S2 모듈

안테나 유무나 PRO 등에 관계없이 S2 모듈이기만 하면 상관없다.


- 아두이노


- XBee Breakout 보드

XBee 모듈은 소형으로 제작되어 핀 배열이 좁기 때문에 활용하기 힘들다. 따라서 아두이노로 간단하게 사용할 수 있도록 위와 같은 보드가 필요하다.


- XBee FTDI 보드(인터페이스 보드)

모듈을 설정하기위해 필요한 인터페이스보드. 소켓 헤더와 led, USB 2 Serial 보드를 내장하고 있으며 제조사마다 다양한 제품이 있으므로 어떤 것을 사용해도 무방하다. 만약 아두이노 XBee 쉴드가 있다면 굳이 필요는 없지만 정신건강을 위해 하나 사는 것을 추천한다. 간단한 테스트환경을 제공해주며 안정된 통신을 보장한다.



2. XCTU 프로그램 설정


아래 화면은 XCTU 프로그램의 메인화면으로 왼쪽 상단의 Add devices 버튼을 클릭하면 XBee 모듈을 추가할 수 있다.



버튼을 클릭하면 현재 컴퓨터에 연결된 디바이스 정보가 표시된다. 해당하는 포트 선택후 아래 옵션은 그대로 놔둔채 Finish 버튼을 클릭한다.



성공적으로 XBee 모듈을 불러왔다면 불러온 모듈을 한번 클릭해주자. 그러면 해당하는 모듈의 다양한 정보가 표시될 것이며 설정된 값을 수정할 수 있다.



먼저 설정페이지 상단을 살펴보자. 여러개의 버튼 밑에 모듈 정보가 표시되는게 보일 것이다. 이는 각각 연결된 XBee 모듈의 명칭과 네트워크 역할, 펌웨어 버전을 의미하며 여기서 가장 중요한 것이 바로 네트워크 역할을 의미하는 Function set 이다. 앞서 지그비 개념 관련 포스팅에서 언급했던 네트워크 토폴로지의 개념이 여기서 적용되는 것으로 사용자는 이 부분을 변경함으로서 Star, Mesh 등 자신의 네트워크 환경에 적합한 토폴로지를 구축할 수 있다. Zigbee 통신에서 설정할 수 있는 Function set은 대표적으로 3가지가 있으며 서로 다른 역할을 하게 된다.


 Coordinator

  네트워크의 구성 및 보안을 담당하며 라우팅 구축을 지원해준다.

 Router

  거리가 멀어 직접 통신할 수 없는 노드 사이에서 데이터를 전달해주는 역할을 한다. 

 End Device

  데이터를 수집하거나 간단한 제어를 담당하며 수집된 정보를 전송해준다.



변경 방법은 상단 버튼 중 Update 버튼을 클릭하여 진행할 수 있으며 여기서 AT 모드, API 모드 설정과 함께 해당하는 최신 펌웨어 업데이트를 동시에 할 수 있다.


모듈의 기본적인 설정이 완료되었다면 이제 설정 페이지 밑의 다양한 항목들을 확인해보자. XCTU 프로그램은 지그비 통신의 주소, 접속, 제어 등을 처리하기 위한 여러가지 구성 설정을 제공해준다. 이를 통해 사용자는 모뎀 구성, 통신 테스트, 루프백 등으로 활용할 수 있다. 자세한 설정 방법이나 명령어들은 XBee 매뉴얼을 참고하기를 바라며 여기서는 중요한 설정값 몇개만 살펴보도록 하겠다.


CH

  지그비 통신의 2.4GHz의 대역내에서 동작 주파수 채널을 설정할 수 있는 항목이다. XBee 모듈

  서는 통신할 모듈끼리 채널이 같아야하기 때문에 중요한 지표이지만 S2 모듈의 경우에는 같지않 

  아도 통신이 가능하 설정값 또한 변경할 수 없다.

ID

  실질적인 네트워크 ID를 설정할 수 있는 항목을 지칭하며 이부분을 다르게 설정함으로서 각각의

  네트워크를 구별하는데 활용할 수 있다. 

DH, DL

  데이터가 전송되는 목적지 주소를 나타내며 데이터 전송 노드를 정의하기 위해 사용된다.

SH, SL

  XBee 모듈 고유의 시리얼 넘버를 말하며 수정할 수 없다. DH, DL과 같이 쓰인다.

MY

  노드 자체의 주소(나의 주소)를 설정하는 항목이다.



3. 테스트 환경 구축


그럼 이제 XBee 모듈 2개를 서로 다르게 설정하여 지그비 통신할 수 있도록 해보자. 모듈이 2개이므로 간단한 Peer to Peer 토폴로지로 네트워크를 구축할 것이며 하나는 기본 노드인 Coordinator AT로 설정하고 다른 하나는 Router AT로 구성하도록 한다. 앞서 언급했던 것 처럼 Update 버튼을 통해 설정할 수 있으며 펌웨어는 최신버전으로 업데이트 하도록 한다. 또한 2개의 모듈이 서로 통신할 수 있도록 다음과 같이 설정값을 변경하고 Write 해야 한다.


 

 Coodinator

Router 

 ID

 1234

1234

 DH

Router의 SL 값

Coordinator의 SH 값

 DL

Router의 SH 값

Coordinator의 SL 값


위와 같이 Coordinator와 Router의 DH, DL을 맞춰주면 2개의 노드가 오직 서로만 통신하게 된다. 이렇게 되면 설정은 모두 완료되었다. 만약 XBee 인터페이스 보드 혹은 아두이노 쉴드가 2개 있다면 설정된 모듈을 모두 연결하여 간단하게 통신이 정상적으로 되는지 테스트 해보자. 프로그램 상단 오른쪽에 터미널 모양의 버튼을 클릭하고 두 개의 모듈을 모두 Open 한다. 



그리고 콘솔에 글자를 입력하게 되면 정상적으로 데이터 송신과 수신이 되고 있음을 알 수 있다. 만약 테스트가 성공적이라면 이제 설정은 모두 완료되었다. 이제 우리는 Peer to Peer 토폴로지를 활용하는 모든 프로젝트에서 본 XBee 모듈을 활용할 수 있다.



4. 지그비 통신 실습


그러면 이제 배운 것들을 토대로 아두이노간의 지그비 무선 통신 실습을 진행해보도록 하자. 사실 실습이라 하기에는 그저 간단한 테스트에 불과하지만 성공한다면 이를 응용하여 할 수 있는 것들이 매우 다양해질 것이다. 회로는 아두이노 2개를 각각 다음과 같이 구성하도록 하며 지그비 모듈은 전원이 3.3V에서 동작하도록 설계되어 있으므로 5V 전원 인가시 고장날 수 있기 때문에 이 점에 유의해서 연결하도록 한다.


코드는 심플하다. 송신부에서는 1초마다 A 문자를 전송하며 수신부에서는 문자를 받을때 마다 조건 판별후 테스트 성공 문자를 시리얼 모니터에 출력하는 방식이다. 



1
2
3
4
5
6
7
8
9
10
11
12
// Node1_지그비 송신 코드
 
#include <SoftwareSerial.h>
SoftwareSerial xbee(23); 
 
void setup() {
xbee.begin(9600); 
}
void loop() {
xbee.print('A');
delay(1000);
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Node2_지그비 수신 코드
 
#include <SoftwareSerial.h>
SoftwareSerial xbee(23); 
 
void setup() {
Serial.begin(9600);
xbee.begin(9600); 
}
void loop() {
if(xbee.available()){
  char data = xbee.read();
  if(data == 'A'
    Serial.print("Zigbee test OK!"); 
  }
}
cs


이로서 지그비 통신에 대한 개념 포스팅을 모두 마친다. 내용이 부실하고 미흡하지만 그래도 필요로하는 사람들에게 도움이 되길 바라는 바이다. 다음에는 라즈베리파이와 아두이노를 지그비로 연결한 스마트홈 구축을 주제로 포스팅해볼 예정이며 후에 시간이 가능하다면 지그비 통신의 API 모드 설정법과 활용 방안에 대해서도 글을 올려보고 싶다.



'Electronic > Arduino' 카테고리의 다른 글

XBee 모듈 정보 및 종류  (0) 2016.01.17
지그비 통신의 개념 (네트워크의 이해)  (8) 2016.01.16
[Galileo] 초음파센서 사용하기  (0) 2016.01.08