자 이제 본격적으로 스마트홈 구축을 위한 프로그래밍을 진행해보자. 앞에서 언급했던 것 처럼 파이썬은 지그비 통신을 활용하여 온습도 데이터를 수신받아 데이터베이스화 할 것이며 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

1. XBee 모듈 종류

XBee 모듈은 크게 Series1과 Series2 두 종류로 나눌 수 있다. 두 시리즈 제품은 기본적으로 동일한 특징들을 많이 가지고 있지만 몇 가지에서 서로 다른 차이점을 보이는데 먼저 S1 같은 경우에는 별도의 설정이 필요하지 않기 때문에 즉시에 사용할 수 있다는 편리성이 있으며 IEEE 802.15.4 프로토콜을 사용한다. 이 프로토콜은 무선 개인 영역 네트워크로 노드 사이의 데이터 처리를 1초당 250Kbps까지 제공하는 특징이 있다. 또한 네트워크 토폴로지의 경우에는 P2P 또는 스타 네트워크 사용이 가능하다. 반면에 S2의 경우에는 802.15.4 프로토콜에 네트워크 계층과 응용 계층을 더 추가한 지그비 프로토콜을 지원한다. 이로 인해 초기에 사용하기 위해서는 별도의 설정이 필요하며 더 적은 전력으로 사용할 수 있고 추가적인 기능과 네트워크 사용이 가능하다.

 

Series 1

Series 2

통신규약

IEEE 802.15.4

Zigbee

토폴로지






 


     

실내 통신거리

30m

40m

실외 통신거리

100m

120m

공급전압

2.8~3.4V

2.8~3.6V

공급전류

45mA

40mA


XBee 모듈은 일반 모듈과 프로 모듈로도 구분할 수 있다. 두 모듈의 차이는 크기와 무선전력의 차이가 있으며 작동과 기능은 거의 동일하다고 볼 수 있다. 프로 모듈의 경우 일반 모듈보다 크기가 크고 소비전력을 많이 소비하며 그만큼 더 먼 거리까지의 통신을 지원한다.

마지막으로 XBee 모듈은 안테나를 통해서도 구분할 수 있는데 사실 안테나 종류에 따른 다양한 모델들이 있긴 하지지만 성능을 따져봤을 때 큰 의미는 없다. 즉 어떤 제품이든지 간에 잘 동작한다는 소리이다. 물론 안테나 유무에 따라서 신호의 세기를 감지하는 패턴이 달라지기 때문에 사용 용도에 따라 구분할 수 있겠지만 이 또한 그다지 큰 성능 향상을 기대하기 힘들다. 따라서 이 부분은 개인의 취향대로 구매하면 될 듯하다.


 Wire Antenna

Chip Antenna

u.FL Antenna 

Trace Antenna 


2. XBee 통신 모드

XBee모듈은 AT모드와 API모드를 모두 지원한다. 먼저 AT모드의 경우 전달 모드(Transpatent)라고도 불리며 간단하게 메시지 데이터를 보내고 받을 수 있다. 쉽게 말해 RX와 TX를 통해 데이터를 주고받는 직렬 데이터의 단순한 전송과 수신이 가능해진다. 따라서 별도의 프로그래밍이나 패키지화가 필요하지 않으며 간단하게 무선 통신을 진행할 수 있다는 장점이 있다. 반면에 API모드의 경우에는 AT모드에서 주고받는 직렬 데이터뿐만 아니라 도착 주소, 패킷 형태, 신호 강도 등의 정보를 같이 패키지화하여 전송한다. 이는 사용자가 필요로 하는 다양한 정보를 설정을 통해 데이터와 함께 보낼 수 있는 개념으로 각 노드간에 유연성있고 다이나믹한 통신망을 구축할 수 있게 해주며 상황에 따라 신뢰성 또한 크게 향상시킬 수 있게 해준다.

두 노드간 서로 통신을 설정할 때는 양측이 모두 같은 모드일 필요는 없으며 API모드에서 AT 모드로 데이터 전송이 가능하고 그 반대도 가능하다. 모드는 XBee 모듈 사이에서 결정하는 것이 아니라 메인 컨트롤러와 XBee 모뎀 사이의 연결을 정의하는 것이기 때문이다.


3. XBee 핀 배치



1) DOUT/DIN

직렬데이터 송수신 핀. 이 데이터는 XBee의 환경 설정을 설정하고 읽을 수 있으며 기본 데이터 속도는 비동기 직렬 통신을 사용하여 9600baud이다.

2) CTS/RTS/DTR

일반적으로 XBee 모듈에 펌웨어 업데이트를 다운로드할 때 사용되며 오직 Serial 통신을 활용한 XBee 어댑터 보드를 사용할 때만 동작한다.

3) DIO

표준 3.3V 디지털 입력 및 출력으로 사용되며 핀의 상태의 설정을 조절할 수 있다.

4) AD

10비트의 아날로그를 디지털로 변환하여 XBee에 입력하는 역할을 하며 값을 읽을 수는 없지만  전압의 양(PWM)으로 나타낼 수 있다.

5) RSSI

PWM 출력으로 수신된 신호의 강도를 확인할 수 있다.

6) PWM

아날로그 출력에 사용할 수 있는 10비트 펄스 폭 변조 출력을 위해 설정 할 수 있다.

7) ASSOC

XBee가 기존의 네트워크에 가입할 수 있도록 설정하고 할당할 수 있는 매개 변수 이다.


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

지그비 무선 통신하기  (13) 2016.01.26
지그비 통신의 개념 (네트워크의 이해)  (8) 2016.01.16
[Galileo] 초음파센서 사용하기  (0) 2016.01.08


최근에 무선통신 기술중 지그비 통신을 활용하게 되어 관련된 자료를 찾아보았는데 괜찮은 정보를 찾기가 매우 어려웠다. 제대로 검색하지 못한 필자의 탓일 수도 있지만 찾아본 대부분의 자료들은 대체 핵심은 어디 갖다 팔아먹었는지 그저 이러저러 해라 식의 단순 지식만 늘어놓고 있었으며 중복되는 내용 또한 심심찮게 발견할 수 있었다. 이러한 글을 읽고 제대로 이해될리 만무하다. 물론 구글을 활용해 해외 사이트에서 검색한다면 원하는 정보를 쉽게 찾을 수 있겠지만 국내에서 지그비와 관련된 간단한 설정법조차 찾기 힘들다는 사실은 매우 안타까울 뿐이다.


때문에 답답한 나머지 지그비 통신에 대해서 필자가 찾아보고 공부한 내용을 정리하여 공유하고자 한다. 순서는 네트워크와 지그비에 대한 개념부터 시작해서 지그비 모듈 종류 및 설정 방법, 아두이노를 활용한 무선 통신 실습 순으로 포스팅할 생각이며 부디 처음으로 지그비 통신을 공부하고 활용하고자 하는 사람들에게 도움이 되길 바란다.



1. 네트워크 이해


지그비에 대한 개념을 설명하기 앞서 네트워크에 대한 이야기를 잠시 해볼까 한다. 워낙 방대한 주제인 만큼 여기서는 간단하게 개념만 짚고 넘어가도록 하자. 네트워크란 Net + Work의 합성어로 컴퓨터들이 통신기술을 이용하여 그물망처럼 연결된 형태를 의미한다. 쉽게 말해 여러 대의 컴퓨터들이 서로 통신하는 것을 말하는 것으로 여기서 통신기술이란 프로토콜(Protocol)을 뜻하며 사전적으로 '규약', '약속'등을 의미한다. 컴퓨터 네트워크에서 서로 통신하기 위한 사전의 약속같은 것으로 해석할 수 있다. 예를 들어 식당에서 음식을 주문하는 상황을 가정해보자. 한 손님이 메뉴판에서 자신이 먹을 음식을 결정했고 바로 주문하려고한다. 하지만 웨이터는 다른 손님의 주문을 받고 있으며 다른 웨이터들 또한 보이지 않는다. 당신이라면 이 상황에서 어떻게 하겠는가? 아마도 당신이 조금의 기다림을 참지 못하는 몰상식한 사람이 아니라면 웨이터가 주문을 다 받을때 까지 기다린 후에야 자신의 주문 내용을 말할 것이다. 


그렇다. 방금 당신은 훌륭하게 사람들 간에 지켜야 할 프로토콜을 잘 지킨 셈이다. 만약 프로토콜을 지키지 않고 웨이터를 억지로 불렀다면 자신과 웨이터 뿐만 아니라 다른 손님과의 소통 또한 제대로 될리가 없다. 이렇듯 사람들이 말을 할 차례를 지켜 주는 것이 중요한데 이러한 개념은 네트워크 통신에서도 똑같이 적용된다. 네트워크 측면에서 위와 같이 통신의 순서를 정해주는 것을 미디어 접근(Media Access)라고 하며 동시에 여러 통신이 발생하는 상황을 다중 접근(Multi Access)라고 한다. 그리고 이러한 상황과 유사한 프로토콜이 바로 CSMA/CD 이다.


   · CSMA/CD (Carrier Sense Multi Access / Collision Detection)

   LAN(이더넷)에서 각 단말기 간 자료를 전송하고 있는 동안 회선을 감시하여 충돌이 감지되면 즉각 전송을 멈

   추고 재전송을 위해 기다렸다가 다시 시도하는 방식


위 방식은 여러 단말기가 통신을 시도했을 때의 충돌 상황을 완화시키는 역할을 한다. 쉽게 말해 앞서 언급한 웨이터의 일이 끝날때 까지 기다려 서로의 통신이 끊어지지 않도록 도와주는 것이다.


또한 네트워크 통신에서 단말기간 특정 주소를 가지는 개념은 매우 중요하다. 각 컴퓨터가 자신의 고유 주소인 IP를 할당받는 이유는 다른 컴퓨터와 구별되기 위해서임을 우리는 이미 알고있다. 따라서 각 단말기간 어떤 통신이 진행되기 위해서는 특정한 수신자의 주소가 지정되 있어야 데이터 보내기가 가능하다. 이러한 주소는 네트워크상에서 숫자로 할당받게 된다.



2. 네트워크 토폴로지(Network Topology)


네트워크 토폴로지란 단말기 상호 간에 데이터를 전송할 수 있도록 연결된 형태를 말한다. 이는 데이터가 잘 보내지고 받을 수 있도록 어떻게 네트워크를 구축할 것인가 라는 네트워크 전략과도 일맥상통하며 어떤 형태를 구축하느냐에 따라서 데이터의 흐름이 결정되게 된다. 따라서 다양한 형태와 방법이 존재하지만 여기서는 지그비 통신과 관련된 몇가지만 소개하고자 한다.


일대일 통신 (Peer to Peer)

일대일 네트워킹은 두 노드 (여기서 노드는 연결점을 의미하며 단말 장치나 통신 처리 장치 등을 뜻한다.) 사이에 데이터를 전송하기 위한 가장 간단한 형태이다. 다양한 채널을 사용할 수 있으며 서로 다른 주파수에 작동하는 무선조종자동자가 좋은 예이며 또한 개인과 개인이 직접 연결되어 파일을 공유하는 P2P도 이러한 개념의 연장선이라고 이해할 수 있다.



스타형 토폴로지 (Star Topology)

스타형은 이더넷 LAN에 가장 널리 사용되는 물리적 네트워크 구조로 중앙의 연결 지점에 허브나 라우터 같은 중심 노드(Coordinator)가 배치되어 모든 노드들을 관리하게 된다. 모든 데이터가 중앙 지점으로 모여지는 중앙 제어 방식이기 때문에 관리가 편하고 확장이 용이하지만 그만큼 부하가 많이 걸리게 되며 중앙 노드에 장애가 발생하면 전체 네트워크 사용이 불가능하게 되는 단점이 있다.


 메쉬형 토폴로지 (Mesh Topology)

메쉬형은 모든 노드가 네트워크상에서 혹은 개별적으로 현결된 그물망 형태로 다수의 노드 쌍이 동시에 통신할 수 있다. 이는 특정 노드의 장애가 다른 노드에 영향을 주지 않기 때문에 장애에 유연한 대처가 가능해지고 가용성이 극대화 되는 장점으로 작용한다. 하지만 그만큼 회선구축 비용이 많이 들게 되며, 새로운 노드를 추가할 시에 선로 구성이 복잡해지고 비용부담이 발생한다.

                        


토폴로지는 상황에 맞게 적절한 방식을 선택하는 것이므로 좋고 나쁨을 떠나 자신이 구축할 네트워크 환경에 적합한 것을 써야 한다.


3. ZigBee 통신


서론이 생각보다 길었다. 그럼 이제 본격적으로 지그비 통신이 무엇인지 알아보도록 하자. 지그비는 근거리 저전력 무선 통신을 위한 프로토콜을 일컫는다. 앞서 프로토콜의 개념을 제대로 이해하였다면 지그비 통신 또한 여러 개의 노드가 서로 통신하기 위해 만들어진 통신 규약이라는 것을 알 수 있을 것이다. 그럼 다른 무선 통신 방법과 비교하여 지그비의 특징을 살펴보자.


 

Zigbee

 Bluetooth

Wi-Fi 

NFC 

전송거리

 ~100m

~10m 

~100m 

~20cm

 전송속도

~250Kbps 

~24Mbps 

 11M / 54Mbps

106~848Kbps 

최대 채널 수

 32000

 14

 1

 소비전력

Very Low

Medium

High

Low

복잡성

Low

Low

High

Low

 비용

Low

Low

High

Low


위 표를 통해 지그비 통신은 복잡하지 않은 시스템 구조로 구성되어 있으며 적은 소비전력으로 인해 소형화가 가능함을 알 수 있다. 비록 전송 속도면에서 블루투스나 와이파이 통신이 우수하긴 하지만 가격이 비싸기 때문에 상대적으로 저렴하고 간단한 무선 네트워크를 구축할 수 있다. 또한 네트워크 규모도 방대하기 때문에 다수의 센서를 활용하거나 모듈을 사용하는 시스템에 적합한 형태를 보인다.


지그비 통신 모듈은 시중에서 다양한 형태로 판매되고 있으나 여기서는 가장 대중적인 제품인 Digi 사의 XBee모듈에 대해서 설명하겠다.  Xbee란 지그비 프로토콜을 바탕으로 보다 쉬운 설정과 사용을 위해 개발된 별개의 프로토콜이다. 따라서 지그비 통신을 기반으로 하고는 있지만 XBee 전용의 프로토콜을 따로 제공하고 있다는 점을 염두해 두어야 한다. 이러한 XBee 모듈의 설명은 다음 포스팅에서 이어서 설명하도록 하겠다.


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

지그비 무선 통신하기  (13) 2016.01.26
XBee 모듈 정보 및 종류  (0) 2016.01.17
[Galileo] 초음파센서 사용하기  (0) 2016.01.08