2016년 12월 4일 일요일

사물인터넷 연결 플랫폼 IFTTT과 MQTT

IoT 사물인터넷 관련해서, 피지컬 혹은 인터넷 사이트 객체 간의 연결과 데이터 교환은 매우 중요하다. 이런 관점에서 IFTTT와 MQTT는 IoT에서 매우 중요한 위치를 차지하고 있는 플랫폼 중 하나이다.

IFTTT 개념 및 작동 방식
IFTTT (IF this than that) 는 인터넷 사이트 객체간 특정 트리거 조건이 발생했을 때, 다른 인터넷 객체에 메시지를 전달해 주는 브로커 역할을 한다. IFTTT에서는 이런 조건과 액션들을 조합해 애플릿(applet) 만드는 행위가 요리와 비슷해서 레시피라 한다. 다음 그림은 특정 트리거(사진 업로드)가 발생했을 때, 특정 액션(드롭박스에 사진을 저장)하는 레시피 예이다.

실제로, IFTTT에 가입한 후, 애플릿을 하나 만들면, 매우 직관적인 애플릿 메이커 화면이 뜨고, 각 this, that에 조건과 행위를 선택해 주기만 하면 작업이 끝난다 (예 - 구글 어시스턴스 트리거 조건 -> 특정 사이트에 메시지 전송. 아래 참고.).

이런 방식으로 IoT 객체에서 발생된 트리거를 특정 웹사이트에 전달해 줄 수 있고, 웹사이트에서 발생된 트리거를 IoT 객체에 전달해 줄 수도 있다.

MQTT 개념 및 작동 방식
MQTT (Message Queueing Telemetry Transport) 는 IBM 에서 개발된 후, 2014년 국제 민간 표준기구인 오아시스에 의해서 표준으로 제정된 네트워크 상에서 메시지를 교환하는 표준 프로토콜이다. 작동 방식을 보면, 메시지를 중계하는 브로커가 메시지 출판자와 구독자를 중계하며, 메시지 교환을 처리한다.

이런 방식은 ROS(Robot Operating System)에서도 동일하게 사용되는 방식으로, 소프트웨어 공학에서 유명한 디자인 패턴 중 publication-subscription  구조를 사용한다. 


IFTTT에 비해, MQTT는 표준화된 방식으로 메시지를 교환하는 양쪽을 연결해 주는 역할을 한다.

IoT 연결 브로커 플랫폼 
이런 브로커 플랫폼을 이용하면, 다음과 같이 아마존 에코에서 특정 음성에 반응하는 사물 인터넷 기기, CCTV에서 특정 이미지 인식 조건이 일치할 때, SMS 문자를 전송하는 기기 등을 손쉽게 개발할 수 있다.



앞으로 이와 같은 IoT 플랫폼을 이용한 제품들이 더욱 다양해 질 것이라 예상한다.

참고 - IFTTT 작업 순서 
IFTTT에서 구글 어시스턴스에서 음성을 입력받아, 특정 조건일 때의 텍스트를 특정 사이트에 전송하는 예를 간단히 만들어 본다.

1. 애플릿 생성

2. + this 선택해 트리거 설정

3. 구글 어시스턴트 선택 및 설정


4. 액션으로 Maker 선택 및 설정



5. IFTTT 애플릿 생성됨. 이제 사용하면 됩니다.ㅎ


레퍼런스

2016년 12월 3일 토요일

IoT기반 스마트 스위치

최근 스타트업에서 이슈가 된 IoT 브릿지 제품 중 스마트 스위치가 있습니다. 이 제품의 프로토타입을 단돈 만원으로 간단히 만들어 보는 내용을 정리해 보려 합니다.

1. 머리말
스마트 스위치 작동 방식은 간단해서, 스마트 폰으로 스위치를 켜고 끌 수 있도록, 손가락 모양의 장치를 무선으로 제어하는 것입니다. 이를 이용해, 스위치를 원격으로 제어하는 것이 이 제품의 핵심 아이디어입니다.

이를 구현하기 위해서는 다음과 같은 몇 가지 기술이 필요합니다.
  1. 서보 모터 제어 장치
  2. WiFi 무선 네트워크 송수신 장치
  3. IoT 연결 및 데이터 송수신
  4. 제품 외양 패키지 디자인
각 내용을 처음부터 다 만들려면, 최소 몇 달이 걸리겠지만, 다음과 같은 오픈소스 도구를 이용하면, 몇 일안에 집에서도 개발 가능합니다. 

2. 3D 프린팅
3D 프린터는 AliExpress에서 찾아보시면 가성비 좋은 제품들이 쏟아져 나오는 데요, 20~40만원대 평가가 좋은 제품 구입하시면 큰 무리없이 사용 가능합니다.

Thingiverse는 프린팅할 수 있는 수많은 3D 모델을 무료로 다운로드 할 수 있는 사이트입니다. 게다가, 플라스틱 케이스, 기어 등을 디자인하는 앱도 무료로 제공해 줍니다 (최고!). 복잡한 디자인이 아니면, 굳이 123D, Tinker캐드 등을 이용해, 디자인할 필요가 없습니다. 다운로드 받고 프린팅하면 작업 끝납니다. 


여기에서는 Customizable case app 을 이용해, 다음과 같이 케이스를 디자인하였습니다. 참고로, Thingiverse에는 캐드를 이용하지 않고 손쉽게 디자인할 수 있는 수많은 앱이 있습니다. Thingiverse App을 이용해 기어, 스틱, 스마트폰 거치대 같은 것은 쉽게 디자인할 수 있죠.

Create Thing버튼을 클릭하면, Thingiverse가 치수를 보고, 알아서 다음 처럼 디자인해 줍니다.ㅎ

자동생성된 케이스

서보모터 케이스 치수는 다음과 같습니다.
lidInsetHeight = 1.2
interiorHeight = 40
interiorFillet = 1
lidInsetOffset = 0.0
sidewallWidth = 1.1
hingeLengthScale = 1.1
hingeWidth = 3
tabSize = 1
coverThickness = 1.0
interiorLength = 52
interiorWidth = 22
rimInset = 0.6
hingeFillet = 3
hingeThickness = 0.3
자동생성된 서보 모터 케이스

이제 프린팅하면 이 케이스를 손에 넣을 수 있습니다.ㅎ 케이스는 각 부품을 고정할 수 있도록, 양면 테이프 혹은 접착재를 이용해, 고정해 줍니다.

스위치를 누르는 손가락도 Thingiverse 에서 검색해 프린팅할 수 있습니다. 

손가락은 서보 모터 회전축에 접착재로 붙이면 되겠죠. 저의 경우에는 록타이트 접착재를 이용했습니다.

3. 메이크 재료 준비
우선 다음 재료를 준비합니다.
  • ESP NodeMCU (4천원), 서보 모터 SG90 (3천원), 양면 테이프, 전선 와이어, 브래드보드, LED, 저항 10옴, 광센서, 9V 배터리 및 배터리 연결선 (2천원), mini USB 케이블 및 USB 어답터 (스마트폰 전원 어답터 재활용)
몇몇 부분을 재활용하면, 재료비는 대략 만원정도네요.ㅎ

4. 위젯 디자인
Blynk에서 다음과 같이 위젯을 스마트폰에 설치된 Blynk로 디자인해 줍니다(참고 - 이전 Blynk 관련 글). 


각 위젯 역할을 다음과 같습니다. 참고로, Virtual Pin에 연결된 것은 V# 이렇게 표시했습니다.
  • 스위치 버튼(V7): 서보 모터를 동작시킵니다. 아울러, 동작 표시를 위해 LED를 켜고 끔니다.
  • 슬라이더: 첫번째 슬라이더(V8)는 서보 모터 시작 각도, 두번째(V9)는 끝 각도를 지정합니다.
  • LED(V1): 동작 상태를 표시합니다. 
  • 그래프(A0): 시간에 따른 조도값을 표시합니다.

5. 회로 연결
ESP NodeMCU보드와 부품간 회로는 다음과 같이 연결합니다.
  • LED = D2, GND
  • 서보 모터 = D4, 3V, GND
  • 조도 센서 + 저항 = A0, 3V, GND

6. 코딩
ESP NodeMCU, Blynk 코딩은 다음과 같이 합니다. 타이머는 차후 다른 데이터 센싱을 위해, 코딩한 것입니다. 필요 없으면 삭제해도 동작합니다.


#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <Servo.h> 

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "fd288f0e5e684408b6d91ba97c87b3b2";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "U+Net8080";
char pass[] = "5000005129";

// Widget
SimpleTimer timer;
WidgetLED led(V1);

// Servo
Servo servo; 
int minAngle = 15;
int maxAngle = 105;

int ledPin = D2;
void setup()
{
  delay(10);
  pinMode(ledPin, OUTPUT);
  // pinMode(2, INPUT_PULLUP);

  servo.attach(D4); 
  
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);

  servo.write(minAngle); 
  delay(30); 

  timer.setInterval(1000L, sensingData);  
}

BLYNK_WRITE(V7) // Button Widget is writing to pin V2
{
  int pinData = param.asInt(); 
  if(pinData == HIGH)
  {
    digitalWrite(ledPin, HIGH);
    led.on();

    servo.write(maxAngle); 
    delay(30); 
  }
  else if(pinData == LOW)
  {
    digitalWrite(ledPin, LOW); 
    led.off();

    servo.write(minAngle); 
    delay(30);     
  }
}

BLYNK_WRITE(V8) 
{
  minAngle = param.asInt(); 
  
  servo.write(minAngle); 
  delay(30);     
}

BLYNK_WRITE(V9) 
{
  maxAngle = param.asInt(); 
  
  servo.write(maxAngle); 
  delay(30);     
}

void loop()
{
  Blynk.run();
  timer.run();
}

void sensingData()
{
  int state = analogRead(A0);
  // state = digitalRead(2);
}



7. 조립
3D프린팅한 케이스에 앞의 재료들을 잘 배치해 넣습니다. 전선은 떨어지지 않게 글루건을 사용해 잘 붙입니다. 양면테이프를 이용해, 케이스와 스위치가 있는 벽에 부착합니다. 그리고, 전원을 연결해 테스트 해 봅니다.

간단하게, 스마트 스위치를 만들어 보았습니다. 이 정도는 집에서도 3D프린터만 있으면 쉽게 작업할 수 있습니다. 3D프린터가 없어도, 케이스같은 것은 다이소같은 곳에서 적당한 것 사서, 짤라서 사용해도 되죠. 이때는 드라멜같은 다양한 툴셋을 지원하는 만능 전동공구가 있으면 편합니다.


8. 마무리
오늘은 간단히 IoT기반 스마트 스위치를 만들어 보았습니다. 잉여력 돋지 않나요? 다만, 크기가 해외 스타트업체에서 소개한 제품보단 큰게 안습입니다. 만약, 회로 디자인 도구와 디자인 캐드를 잘 사용하실 수 있으면, 작고 귀엽게 최적화된 스마트 스위치를 집에서 생산해 볼 수도 있을 겁니다.

집안 여기 저기에 IoT 스마트 스위치를 붙여 넣고 직장에 있을 때 한번 테스트해보세요. 본인이 만들어도, 직접 집의 가전기기들을 제어해 보면, 신기하고 재미있을 겁니다.^^


레퍼런스

  • https://www.kvaser.com/
  • http://oscc.io/


2016년 11월 23일 수요일

ThingSpeak 기반 IoT 데이터 분석

오늘은 ThingSpeak (씽 스피크) 기반 데이터 분석 방법에 대한 글을 이야기해 보겠습니다.

IoT 장치에서 데이터를 취득한 후에는 데이터 통계 및 분석 방법을 이용해, 패턴을 추출하고, 변화량이나 추세를 예측하는 등의 작업이 매우 중요해 집니다. 예를 들어, 에너지 전력 소비량을 시간에 따라 그래프에 표시하면, 불필요하게 에너지를 소비하는 시점이 언제인지, 그때 어떤 장치가 에너지를 소비하는 지 등을 알 수 있습니다.

이 글은 IoT 장치에서 센싱된 데이터를 취득하여 데이터를 분석하는 간단한 방법을 보여줍니다. 이 글에서는 데이터 취득 및 제어는 아두이노와 Blynk를 사용하며, 데이터 분석은 ThingSpeak를 사용할 것입니다.

이 글은 다음 레퍼런스를 참고 하였습니다.
ThingSpeak 기반 데이터 분석


ThingSpeak 데이터 분석 영상

1. ThingSpeak 동작 방식
ThingSpeak는 클라우드 기반으로 동작되는 데이터 분석 솔류션으로 오픈소스 기반으로 동작합니다. RESTful API를 사용하기 때문에, 데이터를 ThingSpeak로 전송하는 것은 매우 쉽습니다. Matlab 스크립트를 웹상에서 지원하므로, 과학 실험 데이터 분석도 가능합니다. 게다가, 메시지 교환 세계 표준인 MQTT (Message Queueing Telemetry Transport) 도 지원합니다.

ThingSpeak에서 데이터 분석을 위해서는 보통 다음과 같은 준비 단계를 거쳐야 합니다.

1. ThingSpeak 가입
2. ThingSpeak 데이터 분석 채널 생성
3. 채널에 분석이 필요한 데이터 필드 생성
4. 채널 설정 저장

이렇게 채널이 만들어지면, 채널 내에 정의된 필드 별로, 데이터를 RESTful API를 이용해, ThingSpeak에 저장하면 됩니다.

2. 센싱 데이터 전송
센싱 데이터는 다음 코드와 같이 ThingSpeak 에서 제공하는 API, 미리 생성된 API 키를 이용해, 각 데이터 필드에 데이터를 전송하는 과정을 거칩니다.

#include "Bridge.h"
#include "HttpClient.h"

//Thingspeak parameters
String thingspeak_update_API    = "http://api.thingspeak.com/update?";
String thingspeak_write_API_key = "key=XXXXXXXXXXXXXX";//Insert Your Write API key here
String thingspeakfieldname      = "&field1=";

void setup() {
  Bridge.begin();       // Initialize Bridge
  Serial.begin(9600);  // Initialize Serial
  
  while (!Serial);        // Wait until a Serial Monitor is connected.
  int data=240;        // Data to be sent to thingspeak, change this variable value and post accordingly
  
  postToThinspeak(data);  // run various example processes
  Serial.flush();         // Ensure the last bit of data is sent.
}

void loop() {
  // Do nothing here.
}

void postToThinspeak(int data) {
  HttpClient client;

    String request_string =  thingspeak_update_API + thingspeak_write_API_key + thingspeakfieldname + data;
    // Make a HTTP request:
    client.get(request_string);

  // if there are incoming bytes available
  // from the server, read them and print them:
  while (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  delay(15000);
}

이제, 이 코드를 WiFi 쉴드가 장착된 아두이노에 입력하고, 실행을 하면, ThingSpeak의 해당 채널에서 수집되는 데이터를 실시간 그래프로 시각화될 것입니다. 물론, 이 데이터는 통계 데이터, 회귀분석, 연관분석, 패턴분석, 클러스터링 등 다양한 데이터 분석 자료로 활용할 수 있고, Matlab과 같은 스크립트를 약간만 수정함으로써 손쉽게 결과값을 얻을 수 있습니다.


3. 결론
이 글에서는 ThingSpeak를 간단히 알아 보았습니다. 이런 데이터 분석 사이트는 많은 기능이 무료로 제공되고, RESTful API를 지원하고 있어, 사용이 매우 쉽습니다. 게다가, 과학 데이터 분석에서 사용하는 Matlab과 같은 스크립트도 지원하고 있어 그 활용도가 매우 높습니다. 다음과 같이 본인이 만든 채널을 공유하고 피드백도 받을 수 있습니다.


IoT 시대에 꼭 필요한 데이터 분석도구입니다.



2016년 11월 10일 목요일

NodeMCU(ESP8266) / Blynk 기반 IoT 기기 개발 사례 소개

이 글은 Blynk와 ESP8266 NodeMCU를 이용해, IoT 기기를 개발하는 손쉬운 방법을 설명한다. ESP8266 NodeMCU는 ESP 여러 버전 중 하나이며, IO 핀이 포함되어 있어, IoT기기를 개발하기 매우 편리하다. AliExpress에서 3~4달러에 구입할 수 있다.
Blynk에 대해서는 앞의 글을 읽어 보길 바란다. ESP8266 NodeMCU 핀은 다음과 같다.
이 글은 다음 링크를 참고하였다.
이 예제에서는 다음과 같은 재료가 필요하다. 
1. Node MCU ESP8266 12E
2. 스마트폰
3. LED, 330 옴 저항
4. 브래드보드
5. 아두이노 IDE

1. 아두이노 NodeMCU(ESP8266) 보드 및 Blynk, Thingspeak 라이브러리 설치
설치된 아두이노 프로그램을 실행한다.

NodeMCU ESP8266 라이브러리리를 설치한다. 다음과 같이 파일>환경설정 메뉴에서 '추가적 보드 매니저'에 http://arduino.esp8266.com/stable/package_esp8266com_index.json 을 입력후 확인한다.

툴>보드>보드 메니저 메뉴를 선택후, 다음 창에서 NodeMCU를 검색한다. 그리고 설치한다.

정상적으로 설치되면, NodeMCU 1.0 보드를 선택한다.

스케치>라이브러리 포함하기>라이브러리 관리 메뉴를 선택한다. 다음과 같이 Thingspeak 검색한 후 설치한다.

스케치>라이브러리 포함하기>라이브러리 관리 메뉴를 선택한다. 다음과 같이 Blynk 검색한 후 설치한다.

스마트폰에서 앱스토어를 실행한다. Blynk 앱을 검색해 설치한다. 설치한 후 Blynk 앱을 실행하고 가입한다.


2. Blynk 앱 프로젝트 개발
다음과 같이 앱을 실행해, 프로젝트를 개발한다. 

3. 회로 연결
회로를 연결한다. 

4. ESP 코드 업로드
아두이노 IDE의 파일 > 예제 > Blynk-Boards_WiFi > Esp8266Standalone 예제를 선택한다. 

보드는 NodeMCU 1.0을 선택한다. 포트 선택을 한다. 만약, 연결된 포트가 안보이면, NodeMCU 통신 포트 드라이버가 제대로 설치되지 않은 것이다. 아래 링크에서 드라이버 설치 프로그램 다운받아 설치한다.
소스코드에서 통신 속도는 115200으로 수정하고, 네트워크 ID와 PASSWORD를 코드에 입력한다. 아울러, Blynk 프로젝트의 토큰을 입력한다.

그리고 소스를 업로드한다.

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "...";    // Blynk 토큰 입력

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "...";    // wifi SSID 입력
char pass[] = "";     // wifi SSID 암호 입력

void setup()
{
  Serial.begin(115200);     // 통신속도 115200 수정
  Blynk.begin(auth, ssid, pass);
}

void loop()
{
  Blynk.run();
}


5. 원격 LED 제어
앱을 원격으로 LED를 제어해 본다.

10k옴과 조도센서를 이용해 아날로그 값을 측정해 보자. 다음과 같이 조도센서의 신호출력핀은 NodeMCU의 A0와 연결한다.

그래프 위젯을 하나 삽입하고, 센서 데이터는 A0로 부터 받도록 설정하면, 다음과 같이, 정상적으로 조도 센서값을 받고 있는 것을 확인할 수 있다. 


이로써, 스마트폰이 네트워크와 연결된 곳이라면, NodeMCU를 이용해, 원격으로 센서 신호를 받고, 스위치나 모터와 같은 액추에이터를 끄고 컬 수 있음을 알 수 있다. 

이외에 제공되는 위젯들을 잘 활용하면, 매우 다양한 제어를 원격으로 할 수 있음을 알 수 있다. 상세한 Blynk 사용 방법은 다음 링크와 아두이노 통합개발환경의 예제 메뉴에서 Blynk 예제 파일들을 참고하길 바란다.
hackster.io/blynk 예제

2016년 11월 8일 화요일

ESP8266 기반 Blynk활용 IoT 기기 개발

이 글은 ESP8266 기반 IoT 기기 개발에 대한 내용이다. 이 기기는 2~3달러로 매우 싸지만, WiFi와 GPIO포트를 지원하여, IoT기기 개발에 매우 좋은 소형 컴퓨터이다.

이 글은 ESP8266을 기반으로 Blynk를 사용해 IoT기기를 개발하는 방법을 설명한다. ESP8266은 여러가지 버전이 있다. 다음은 ESP8266-01버전이다.


이 글은 다음 레퍼런스를 참고하였다.
이 중에 아두이노 우노나 메가를 이용한 ESP 예제를 간단히 따라해 본다. 이 경우, 기존 아두이노의 작업들을 재활용할 수 있는 장점이 있다. 저렴한 ESP 로 WiFi기반 IoT 기기를 개발할 수 있다.

이 튜토리얼을 따라가기 위해서는 다음과 같은 부품이 필요하다.
  1. Arduino Uno
  2. 점퍼 와이어
  3. ESP8266-01
  4. 가변저항 및 버튼 스위치
소프트웨어 라이브러리 다운로드는 다음과 같다.

1. 아두이노 IDE 통합개발환경을 설치한다.
2. Blynk 아두이노 라이브러리를 다운로드 한다.
3. Blynk 라이브러리를 다운로드 한다.
4. Blynk-ESP8266 아두이노 라이브러리를 다운로드한다.
5. pySerial 을 다운로드 한다.
6. esptool 을 다운로드 한다.
7. SDK1.0.0 v0.22 ESP2866 펌웨어를 다운로드한다.
8. ESP8266_flasher 실행 프로그램을 다운로드한다.
9. Blynk 앱을 휴대폰에 설치한다.

1. ESP 펌웨어 설치
ESP와 아두이노를 연결한다. 

ESP8266 - Arduino
GND      - GND
GP2       - 연결안함
GP0       - GND
RXD       - RX
TXD       - TX
CHPD     - 3.3V
RST        - 연결안함
VCC       - 3.3V


이제 esp8266_flasher.exe 를 실행하고, AT22SDK100-2015-03-20-boost12.bin 을 선택한다.



COM 포트를 적절히 선택하고, download 버튼을 클릭한다. 제대로 펌웨어 업그레이드가되면, failed to leave flash mode this is OK 메시지를 볼 수 있다. 



업데이트 중에는 다음과 같이 ESP8266 모듈의 파란색 LED가 깜빡거리는 것을 볼 수 있다.


* 참고: CP2102 USB-TLL 모듈 통해 펌웨어를 업데이트하는 방법이 있다.  CP2102는 2000원 정도로 가격이 매우 저렴하다. 

CP2102 USB-TLL MODULE

ESP와 CP2102 USB-TLL간 회로 연결은 다음과 같이 한다.

ESP8266 - CP2102
GND      - GND
GP2       - 연결안함
GP0       - GND
RXD       - TX
TXD       - RX
CHPD     - 3.3V
RST        - 연결안함
VCC       - 3.3V

그리고, ESP8266 Flash Downloader 프로그램을 이용해, 앞서 설명했던 것과 똑같이 펌웨어 업데이트를 하면 된다.

ESP는 AP, STA, AP+STA모드를 지원한다. 이는 ESP8266 config 프로그램을 통해 다음과 같이 손쉽게 설정할 수 있다.


* 참고: 리눅스 환경에서는 파이썬을 이용해 펌웨어를 업그레이드 할 수 있다. PySerial-2.7 폴더에 들어간 후, python setup.py install 를 설치한 후, 파이썬 esptool.py 를 이용해, 펌웨어 업그레이드가 가능하다.

2. 아두이노 Blynk와 Blynk-ESP8266 라이브러리 설치
아두이노 Blynk와 Blynk-ESP8266 라이브러리를 설치한다. 이를 위해 아두이노 IDE 를 실행하고, 스케치의 Include library 메뉴에서 다운로드한 파일 중 다음의 zip 파일을 추가/설치한다.

blynk-library-master
ITEADLIB_Arduino_WeeESP8266-master

메뉴에서 스케치의 Include Library 메뉴에서 manage library 메뉴를 통해 ESP8266 library를 업데이트한다.

3. 아두이노 코드 업로드
다음과 같이 연결한다.

ESP8266 - Arduino Mega
GND      - GND
GP2       - 연결안함
GP0       - 연결안함
RXD       - TX
TXD       - RX
CHPD     - 3.3V
RST        - 연결안함
VCC       - 3.3V

아두이노 우노의 경우는 다음과 같이 연결한다 (혹시, 잘 동작 안되면, Arduino Mega와 같이 우노의 RX, TX핀으로 직접 연결한다. 이 예제의 경우, 직접 RX, TX를 연결하였다. 참고로 SW 시리얼은 아직 불완전하다는 말이 있다).

ESP8266 - Arduino UNO
GND      - GND
GP2       - 연결안함
GP0       - 연결안함
RXD       - D3
TXD       - D2
CHPD     - 3.3V
RST        - 연결안함
VCC       - 3.3V

이 예에서는 아두이노 D7 핀에 LED를 연결해 제어할 것이다.

1. 아두이노 메가의 경우, IDE의 파일 > 예제 > Blynk > BoardsAndShields > ESP8266_Shield_HardSer 예제를 선택한다. 아두이노 우노는 ESP8266_Shield_SoftSer 예제를 선택한다. 만약, ESP8266 통신 속도를 9600 bps로 설정하려면, AT모드에서, AT+UART_DEF=9600,8,1,0,0 명령을 수행해야 한다. 이 예제의 경우, 115200 bps를 사용하였다.

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "...";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "...";
char pass[] = "";

// Hardware Serial on Mega, Leonardo, Micro...
#define EspSerial Serial

// Your ESP8266 baud rate:
#define ESP8266_BAUD 115200

ESP8266 wifi(&EspSerial);

void setup()
{
  // Set console baud rate
  Serial.begin(115200);
  delay(10);
  // Set ESP8266 baud rate
  EspSerial.begin(ESP8266_BAUD);
  delay(10);

  Blynk.begin(auth, wifi, ssid, pass);
}

void loop()
{
  Blynk.run();
}


2. 스마트폰의 Blynk 앱을 실행하고, 프로젝트를 하나 만든 후, 생성된 인증 토큰을 ESP8266 예제의 해당 부분에 붙여 넣는다. 그리고, WiFi네트워크의 SSID, PASSWORD를 소스코드의 해당 부분에 붙여 넣는다.

3. 아두이노 IDE 모니터링 프로그램을 실행하면, 다음과 같이 아두이노가 Blynk 서버와 접속되는 정보를 볼 수 있다.


4. Blynk 제어
다음과 같이 아두이노 버튼과 가변저항을 수정하면, Blynk 위젯 정보가 원격으로 변화되는 것을 알 수있다. 


아울러, LED를 아두이노 13번 핀에 연결하고, Blynk에서 버튼 위젯을 D13에 연결하여, 버튼을 클릭하면, 다음과 같이 정상적으로 동작하는 것을 확인할 수 있다.




이런 식으로 센서와 연결된 장치를 인터넷 기반으로 제어할 수 있다. 그러므로, 시간과 노력이 있다면, 누구나 IoT 기기를 저렴하고 손쉽게 개발할 수 있다.

오픈소스 기반 IoT 기기 연결 플랫폼 Blynk 와 Temboo

이 글은 오픈소스 기반 IoT 기기 연결 플랫폼에 대한 글이다.

1. Blynk 
Blynk는 IoT 기기를 개발하는 메이커에게 도움을 주는 플랫폼이다. Blynk는 하드웨어 간 연결을 지원하고, 가상 사용자 인터페이스를 지원한다. Blynk는 상당히 빠르게 성장하는 오픈소스 기반 IoT 플랫폼이다. 이를 이용하면, 다음과 같은 IoT 센서 앱을 손쉽게 개발할 수 있다.


Blynk는 다음과 같이 인터넷 접근 가능한 다양한 하드웨어와 앱을 서로 연결해 준다. 별도의 PC가 필요없다.


Blynk 서버는 스마트폰과 하드웨어 간 통신을 담당하며, 클라우드 플랫폼으로 동작된다. 하드웨어와 서버 연결을 위해 Blynk Libraries를 제공한다.

복잡한 코딩을 할 필요가 없다. Blynk 앱에서 IoT로 만들고 싶은 인터넷에 연결된 보드 종류를 선택하고, 보드 입출력핀에 연결된 센서나 액추에이터를 선택하면 된다.

불필요한 코딩이 없음. 인터넷에 연결된 보드 종류와 입출력 핀 동작을 지정해 주면 된다

Blynk는 앱 빌더와 퍼블리쉬를 지원하며, 클라우드 기반에서 동작하며, 다양한 임베디드 하드웨어들을 지원한다.


다음 영상은 아두이노에 연결된 센서나 액추에이터를 Blynk를 이용해 얼마나 쉽게 IoT 기반 장치를 만들 수 있는 지를 잘 보여준다. 



Blynk는 매우 쉽고, 게다가, 오픈소스로 많은 위젯이 무료이다. 게다가, Blynk소스 서버가 공유되어 있어, 라즈베리파이 같은 저렴한 PC에 설치해, 자신만의 Blynk서버를 만들 수도 있다.  



아두이노와 센서가 준비되어 있다면, Blynk를 설치하고, IoT 기기를 만드는 데 5분이 걸리지 않는다.  Blynk의 Getting started 사이트는 Blynk 설치 앱과 아두이노를 위한 라이브러리를 제공한다.



Blynk는 매우 다양한 하드웨어를 지원하며, 이 중에는 가격이 불과 5달러 정도 밖에 하지 않은 ESP8266 등도 포함하고 있다. 물론, 유튜브 등에는 이와 관련된 수많은 튜토리얼 영상이 공유되고 있다.

2. TEMBOO
TEMBOO 플랫폼을 이용해 IoT 기기를 손쉽게 개발할 수 있다. Github에 소스가 올라온 지는 벌써 4년이 되어 가는 IoT 플랫폼이다. TEMBOO는 아두이노 기반으로 동작한다. 아두이노 WiFi 쉴드나 아두이노 윤을 이용해 개발할 수 있다. 다만, 아두이노 윤(Arduino Yun)을 이용하면, TEMBOO 플랫폼을 이용해 IoT 기기를 손쉽게 개발할 수 있으나, 아두이노 윤 가격이 9만원으로 매우 비싼것이 단점이다.

100개 이상의 SaaS 사이트에서 제공되는 데이터를 API기반으로 연결해, 아두이노 윤과 연결할 수 있다. 예를 들어, 트위터에서 어떤 메시지가 올라오면, 이 값을 받아서, 네트워크에 연결된 기기를 동작하거나 센싱하는 일을 손쉽게 할 수 있다.


다음은 TEMBOO를 소개하고, 간단한 앱 개발 방법을 보여준다.


단순히, 데이터를 입력받을 장치를 선택하고, 데이터를 변환하는 규칙을 적용한 후, 출력받을 장치를 선택하면 된다.


그럼, 다음과 같은 아두이노 코드를 자동으로 생성해준다.
/*
  GetYahooWeatherReport
  
  Demonstrates making a request to the Yahoo Weather API using the Temboo Arduino Yun library.
  
  This example code is in the public domain.
*/

#include <Bridge.h>
#include <Temboo.h>
#include "TembooAccount.h" // contains Temboo account information

// the address for which a weather forecast will be retrieved
String ADDRESS_FOR_FORECAST = "104 Franklin St., New York NY 10013";

int numRuns = 1;   // execution count, so that this doesn't run forever
int maxRuns = 10;  // max number of times the Yahoo WeatherByAddress Choreo should be run

void setup() {
  Serial.begin(9600);
    
  // for debugging, wait until a serial console is connected
  delay(4000);
  while(!Serial);
  Bridge.begin();
}

void loop()
{
  // while we haven't reached the max number of runs...
  if (numRuns <= maxRuns) {
      
    // print status
    Serial.println("Running GetWeatherByAddress - Run #" + String(numRuns++) + "...");

    // create a TembooChoreo object to send a Choreo request to Temboo
    TembooChoreo GetWeatherByAddressChoreo;
    
    // invoke the Temboo client
    GetWeatherByAddressChoreo.begin();

    // add your temboo account info
    GetWeatherByAddressChoreo.setAccountName(TEMBOO_ACCOUNT);
    GetWeatherByAddressChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);
    GetWeatherByAddressChoreo.setAppKey(TEMBOO_APP_KEY);
    
    // set the name of the choreo we want to run
    GetWeatherByAddressChoreo.setChoreo("/Library/Yahoo/Weather/GetWeatherByAddress");
    
    // set choreo inputs; in this case, the address for which to retrieve weather data
    // the Temboo client provides standardized calls to 100+ cloud APIs
    GetWeatherByAddressChoreo.addInput("Address", ADDRESS_FOR_FORECAST);

    // add an output filter to extract the name of the city.
    GetWeatherByAddressChoreo.addOutputFilter("city", "/rss/channel/yweather:location/@city", "Response");
    
    // add an output filter to extract the current temperature
    GetWeatherByAddressChoreo.addOutputFilter("temperature", "/rss/channel/item/yweather:condition/@temp", "Response");

    // add an output filter to extract the date and time of the last report.
    GetWeatherByAddressChoreo.addOutputFilter("date", "/rss/channel/item/yweather:condition/@date", "Response");

    // run the choreo 
    GetWeatherByAddressChoreo.run();
        
    // when the choreo results are available, print them to the serial monitor
    while(GetWeatherByAddressChoreo.available()) {
          
      char c = GetWeatherByAddressChoreo.read();    
      Serial.print(c);
    }
    GetWeatherByAddressChoreo.close();

  }

  Serial.println("Waiting...");
  Serial.println("");
  delay(30000); // wait 30 seconds between GetWeatherByAddress calls
}

TEMBOO 홈페이지에는 TEMBOO를 이용한 다양한 오픈소스 IoT 프로젝트를 다음과 같이 확인할 수 있다.

앞으로는 누구나 자신에게 필요한 IoT 기기를 쉽게 만들고, 제어할 수 있도록, 불필요한 코딩은 점점 줄여나가는 방식으로 발전될 것 같다.