쉽게 개발 가능한 IoT 전용 플랫폼을 알아보자

[테크월드=이나리 기자] 스마트폰의 다음 시장으로 사물인터넷(IoT) 시장에 대한 기대가 커지면서 대부분의 IT 기업에서 IoT에 대한 다양한 플랫폼을 출시하고 있다. IoT 시장에서 가장 중요한 부분은 ‘연결성’, ‘보안’, ‘개발 환경’이다. 또한 쉽게 개발할 수 있는 장점이 있어야 한다.

이런 부분에 있어서 구글에서 최근에 안드로이드 띵스(Android Things)라는 IoT 전용 플랫폼을 출시했다. 안드로이드 띵스의 장점은 안드로이드 운영체제와 같은 맥락의 운영체제이고, 자바를 기반으로 하는 시스템이라는 것이다. 따라서 자바 언어를 통해 IoT 하드웨어 장치를 만들 수 있고, 기존의 IoT 플랫폼 위에 안드로이드 띵스를 설치해 운영할 수 있는 것이 장점이다.

그럼 지금부터 현재 어떠한 IoT 플랫폼이 있고 안드로이드 띵스의 개발은 어떤지 3회에 걸쳐 알아보도록 하겠다.

◇ 아두이노

아두이노 보드는 현재 전 세계에서 가장 널리 사용되고 있는 오픈소스 기반 플랫폼이다. 여기서 오픈소스라는 의미는 소프트웨어적으로 오픈소스라는 것뿐만 아니라 개발 툴과 하드웨어에 대한 개발 정보까지 오픈소스로 공개돼 있음을 말한다. 따라서 하드웨어적으로나 소프트웨어적인 전문적인 지식이 없어도 누구나 쉽게 배우고 사용할 수 있도록 개발됐다. 아두이노 보드는 이미 전 세계적으로 수많은 아티스트, 디자이너, 초보 개발자, 학생들 등 다양한 사람들에게 널리 보급돼 사용되고 있다.

또 아두이노 보드는 간단한 입출력 보드와 쉬운 언어를 이용한 개발 환경에 기반을 두고 있다. 또한 컴퓨터나 다른 기기와 연결되지 않고 독립적으로 작동하도록 구성됐다. 현재 맥 OS X, 윈도우, 리눅스 버전으로 오픈소스 기반 통합 개발 환경을 제공하는데, 아두이노 웹사이트에서 무료로 다운로드해 사용할 수 있다.

◇ 아두이노 하드웨어

기본적인 아두이노의 하드웨어 모델은 세 가지지만, 기본 구조를 변형해 다양한 형태의 하드웨어로 재탄생시킬 수 있다. [그림 1], [그림 2], [그림 3]까지가 대표적인 아두이노 보드들이다. 보다시피 아두이노 보드는 USB 포트와 전원 그리고 외부센서나 기기에 연결할 수 있는 제어포트로 이뤄진 마이크로프로세서 보드 형태다. 다만 추가장치, 모양, 크기에 따라 여러 형태의 하드웨어가 존재할 수 있으나 근본적인 구조는 동일하다.

2000년대 초 마이크로 마우스 경진 대회가 주목을 받을 때 사용되던 마이크로프로세서는 PIC나 AVR이었다. 하지만 10년 이상의 임베디드 시스템을 개발한 임베디드 소프트웨어 개발자도 PIC나 AVR과 같은 마이크로프로세서를 다루는 일은 결코 쉽지 않은 일이다. 또한 개발을 위해 준비해야 할 작업들, 개발 툴을 설치하고, 개발 툴의 기능들을 익히고, 프로세서에 적합한 기능으로 프로그램을 구현하고, 프로세서에 작성한 프로그램을 다운로드하는 일은 결코 간단한 작업이 아니다. 그래서 이런 마이크로프로세서를 제어한다는 것은 일반인이 접근하기 힘든 영역에 속했다.

이런 어려움을 극복하기 위해 나온 것이 아두이노 프로젝트다. 아두이노는 마이크로프로세서를 이용해 프로그래밍을 하는 과정을 일반인들도 쉽게 접근할 수 있도록 간편화해 제공하고 있다. 아두이노의 장점을 살펴본다면 다음과 같다.

공개된 하드웨어 플랫폼: 누구나 하드웨어 설계의 수정 혹은 변경이 가능하다.

검증된 하드웨어 플랫폼: 오랜 시간 하드웨어, 소프트웨어에 대한 검증 작업이 이뤄졌다.
통합 환경: 윈도우, 리눅스, 맥 OSX 환경에 이르기까지 다양한 환경에서 동작하는 개발 환경을 사용할 수 있다.

이해하기 쉽고 프로그래밍하기 쉬운 언어 구조: 하드웨어 제어를 C 언어와 유사한 언어로 쉽게 제어할 수 있다. 이런 장점은 엔지니어나 개발자가 아닌 일반인과 심지어 초‧중‧고생까지 쉽게 접근할 수 있다.

개발자 및 리소스: 개발자, 개발에 관련된 정보가 풍부하다. 따라서 많은 리소스가 있다. 개인, 회사에서 진행하는 다양한 프로젝트로 활용되는 것을 볼 수 있다.

다양한 하드웨어 기능 지원: 단순히 키나 LED를 동작시키는 것뿐만 아니라 모터, 센서, 바코드 리더기와 같은 다양한 장치를 연결할 수 있고, 이더넷과 같은 네트워크 기능도 제공한다.
소프트웨어의 다양성: 현재 아두이노는 플랫폼 하드웨어의 다양성뿐만 아니라 소프트웨어적인 기능도 다양해지고 있다. 간단한 제어부터 복잡한 웹서버 기능까지 제공하고 있다. 이런 소프트웨어 기능의 다양성 때문에 활용의 범위도 점점 넓어지고 있는 추세다.

◇ 마니아를 위한 혹은 개발자를 위한 아두이노

미국 잡지인 <MAKE>와 같은 DIY(Do It Yourself) 잡지들에서 아두이노를 이용한 프로젝트가 종종 소개되고 있다. 개인적인 취미활동으로 하드웨어 만들고 부품을 납땜해 연결하는 것에 즐거움을 느끼는 해커 취향의 마니아가 의외로 많다는 것에 놀라게 된다. 아두이노 보드를 이용해 개인용 수치 제어 머신(CNC)나 3차원 프린터를 만들고, 모형 항공기의 제어 컴퓨터로 사용하고 있다. 또한 개발자뿐만 아니라 음악가나 행위 예술가를 위한 예술의 도구로도 쓰이는 경우가 있다. 사실 지금 언급한 것은 활용의 일부 예를 든 것이며 활용범위는 무궁무진하다.

[그림 4] 아두이노의 다양한 활용
[그림 5] 아두이노로 구현한 세그웨이
[그림6]아두이노로 구현한 도어락

◇ 아두이노 소프트웨어

아두이노의 개발 환경은 [그림 7]과 같이 특별히 설치하는 형태가 아니라 다운로드해 압축을 풀면 바로 실행시켜서 사용할 수 있다. 따라서 USB 메모리와 같은 저장장치에 가지고 다닐 수 있는 매우 가벼운 개발 환경이다.

[그림 7] 아두이노의 개발 환경 파일들

아두이노라고 보이는 실행파일을 선택하면 곧바로 개발을 시작할 수 있다.

[그림 8] 아두이노의 통합 개발 환경

◇ 아두이노 프로그래밍

아두이노 프로그래밍은 통합 개발 환경에서 프로그램을 작성해 USB로 아두이노 보드에 다운로드하는 형태로 이뤄진다. USB 포트는 PC에서 시리얼 포트로 인식돼 프로그램 다운로드뿐만 아니라 동작 중 필요한 정보를 출력해주는 디버깅 창 역할도 한다. 아두이노 프로그래밍을 단계적으로 살펴보면 다음과 같다.

⓵ 아두이노 보드와 USB 케이블 준비
⓶ 아두이노 개발 환경 다운로드 및 설치(http://arduino.cc/en/Main/Software)
⓷ 보드와 PC를 USB 케이블로 연결
⓸ USB 포트를 시리얼 포트로 에뮬레이션하는 아두이노 전용 드라이버 설치
⓹ 아두이노 개발 환경 실행
⓺ 예제나 프로그램 작성
⓻ 개발한 프로그램을 아두이노 보드에 다운로드하고 실행

[그림 9] 아두이노 프로그램 예제 선택 화면

[그림 9]처럼 아두이노 통합 개발 환경에는 쉽게 개발 방법을 익힐 수 있도록 다양한 예제를 선택해 테스트할 수 있는 소스가 제공된다.

⓼ 보드 및 시리얼 포트 선택: 아두이노 통합 개발 환경에서는 여러 종류의 아두이노 보드를 지원할 수 있도록 구성돼 있다. 따라서 구입한 보드에 맞게 종류와 이름을 선택해야 정상적으로 작성한 프로그램이 동작한다.

[그림 10] 아두이노 보드 선택 화면  

⓽ 프로그램 업로드: USB 포트를 통해 프로그램을 보드에 업로드하고 동작하게 만든다.

◇ 아두이노 프로그래밍 예제

아두이노 보드에 LED와 같은 하드웨어를 연결하고 깜박이는 동작을 수행하도록 프로그래밍하는 것은 C/C++와 같은 언어에 대한 지식만 있다면 쉽게 따라해 볼 수 있다. 지금부터 아두이노 보드에 LED를 연결하고 어떻게 프로그래밍하는지 잠시 살펴보겠다.

 [그림 11] 아두이노 보드에 LED 연결 방법 회로도

[그림 12]는 아두이노 보드에 LED를 실제로 연결하는 방법을 설명한 것이고, [그림 11]은 회로도로 볼 때 LED가 어떻게 연결돼 있는지 설명하고 있다.

[그림 12] 아두이노 LED 연결 방법

이 같이 아두이노는 손쉽게 하드웨어 부품을 연결하고 테스트할 수 있는 구조로 하드웨어가 설계됐다. 연결한 LED를 프로그래밍하는 방법은 [리스트 1], [리스트 2]와 같다.

[리스트 1] 아두이노 LED 제어 프로그램 예제

/*
  LED를 1초간 켜고 1초간 끄는 프로그램
 */

void setup() {               
  // LED 연결핀을 초기화한다.
//  아두이노 보드의 13번 핀에 LED가 연결됨
  pinMode(13, OUTPUT);    
}

void loop() {
  digitalWrite(13, HIGH);   // LED를 켠다.
  delay(1000);              //  1초간 기다린다.
digitalWrite(13, LOW);    // LED를 끈다.
  delay(1000);              // 1초간 기다린다.
}

[리스트 2] 버튼 상태를 판단하는 프로그램 예제

const int buttonPin = 2;     // 버튼 번호 지정
const int ledPin =  13;      //  LED 지정

int buttonState = 0;         // 버튼 상태 관리 변수

void setup() {
  // LED 포트의 초기화
pinMode(ledPin, OUTPUT);     
  // 버튼 초기화
pinMode(buttonPin, INPUT);    
}

void loop(){
  // 버튼의 상태를 읽어들인다.
buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {    
    // 버튼 상태가 HIGH 상태이면 LED를 켠다.
    digitalWrite(ledPin, HIGH); 
  }
  else {
    // LED를 끈다.
    digitalWrite(ledPin, LOW);
  }
}

◇ WiFi 연결

[그림 13]는 아두이노 메가 보드에 WiFi 연결 기능을 제공하는 WiFi 쉴드를 장착한 모습이다. WiFi 쉴드는 아두이노 보드에서 인터넷 연결 기능을 제공하며, 이 기능을 사용해 스마트폰과 통신하는 기능을 구현할 수 있다. 스마트폰과 연결방법에는 다음 두 가지가 있다.

[그림 13] 아 두이노 보 드에 와이파이 장치를 연결한 모습

- 스마트폰과 직접 연결
- 스마트폰과 인터넷 서비스를 통한 간접 연결

스마트폰과 직접 연결방식은 WiFi 다이렉트를 사용하거나 아두이노 보드에서 서버를 구현하고 스마트폰에서 클라이언트 형태로 접속하는 방식을 사용한다. 하지만 이 경우 확장성이나 한계가 많기 때문에 인터넷 서비스를 통한 간접 연결방식을 구현해 스마트폰과 연결하는 방식을 살펴보겠다. 연결에 대한 구체적인 내용은 다음과 같다.
  
- 아두이노 보드는 WiFi 쉴드를 이용해 인터넷과 접속
- 인터넷 서버는 구글 앱 엔진이나 웹서버를 통해 구현
- 아두이노 보드는 REST(Representational State Transfer) 형식의 API를 통해 서버와 통신
- 스마트폰은 REST 형식의 API를 통해 서버와 통신하고, 서버는 아두이노 보드와 통신. 다소 복잡한 모습이지만 향후 확장성 및 다양한 기능을 위해 접근한 방법이다.

[리스트 3]은 아두이노와 와이파이 쉴드를 이용한 인터넷 연결 프로그램의 예제다. 아두이노에서는 WiFi 연결에 관한 프로그램을 간단하게 작성할 수 있으며, 이 기능을 이용해 서버에 접속하는 기능을 구현할 수 있다.

[리스트 3] 와이파이 쉴드를 이용한 인터넷 연결 프로그램

#include <WiFi.h>

char ssid[] = "yourNetwork";     // 네트워크 이름
int status = WL_IDLE_STATUS;     // 상태
void setup() {
  // 디버그용 시리얼 포트 속도
 Serial.begin(9600);

// 연결 시도
Serial.println("Attempting to connect to open network...");
  status = WiFi.begin(ssid);

// 연결 문제 시 처리
if ( status != WL_CONNECTED) {
    Serial.println("Couldn't get a wifi connection");
    while(true);
  }
  // 연결 시 처리
else {
      Serial.print("Connected to the network");
  }
}

void loop() {
  // do nothing
}

REST API

REST API 혹은 RESTful API는 웹서비스 업체들이 자사의 서비스를 Open API 형태로 발표하면서 유행하게 된 통신방식으로, 구현과 확장이 유연하다는 장점이 있다. 아두이노에서도 복잡한 프로그램이 없이 API 호출이 자유롭기 때문에 REST API 형태로 서버를 구현하고 스마트폰과 통신하는 형태를 많이 선택하고 있다. [그림 13]은 REST API의 예를 보여주고 있다. REST API는 http 프로토콜을 사용하고 명령과 인자 전달에 있어 XML과 같은 형태로 관리할 수 있기 때문에 접근방법이 쉽다.

[그림 14] REST API를 통한 아두이노와 서버의 통신방식

[리스트 4]는 아두이노에서 REST API를 사용해 서버와 통신하는 예제다. 복잡한 코드 구성없이 서버와 통신한다는 것을 알 수 있다.

[리스트 4] 아두이노에서 REST API를 사용한 정보 전달

void sendData(int thisData) {
 
  if (client.connect(server, 80)) {   // 연결 시도
    Serial.println("connecting...");
    // HTTP PUT 명령 전달
    client.print("PUT /v2/feeds/")  ;
    client.print(FEEDID);
    client.println(".csv HTTP/1.1");  // 헤더
    client.println("Host: api.pachube.com");
    client.print("X-PachubeApiKey: ");
    client.println(APIKEY);
    client.print("User-Agent: ");
    client.println(USERAGENT);
    client.print("Content-Length: ");

// 전달 정보의 크기
    int thisLength = 8 + getLength(thisData);
    client.println(thisLength);

// 헤더 끝
    client.println("Content-Type: text/csv");
    client.println("Connection: close");
    client.println();

// 전달 정보, 여기서는 센서 데이터
    client.print("sensor1,");
    client.println(thisData);
 
  }

서버에 전달된 정보는 [그림 15]와 같이 서버에 기록되며, 마찬가지로 스마트폰에서는 본 서버와 동일한 REST API를 통해 서버와 접속하고 아두이노 보드를 제어하게 된다.

[그림 15] 아두이노에서 서버로 전달된 정보

◇ 스마트폰 연결 서버

스마트폰 연결 서버는 웹서버와 데이터베이스 등을 독자적으로 구현할 수 있지만, 매우 간단하게 구현할 수 있는 방법도 있다. 바로 구글의 앱 엔진을 사용하는 것이다. 구글 앱 엔진을 사용하면 간단한 서버를 파이선과 같은 언어로 쉽게 구현할 수 있기 때문에 개발 초기에는 좋은 접근방법이다. [그림 16]는 파이선 언어를 사용해 서버를 구현한 소스의 일부분이다.

[그림 16] 구글 앱 엔진에 파이선을 이용해 구현한 서버

[그림 17]은 구글 앱 엔진을 통해 전달된 정보를 로깅하고 그래프로 보여준 화면이다.

[그림 17] 아두이노 보드의 로깅 그래프

[그림 18]은 스마트폰에서 아두이노 보드의 정보를 읽고 제어하는 모습이다. 물론 서버에 기록돼 있는 정보를 확인하고 필요한 명령은 서버를 통해 아두이도 보드로 전달한다.

[그림 18] 스마트폰과 아두이노 보드와 연결

지금까지 아두이노 보드를 이용한 IoT 구현 방법에 대해 살펴 봤다. 다음호에서는 본 내용을 기반으로 안드로이드 띵스에서는 IoT 시스템을 어떻게 구현하는지에 대해 살펴보도록 하겠다.

글 : 라영호 테뷸라 대표이사
자료제공 : 테뷸라(www.tebular.com)

 

이 기사를 공유합니다
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지