2016년 7월 28일 목요일

크롬 앱으로 멀티플랫폼에서 시리얼 통신하기 (Serial communication through Chrome App)

전자회로 개발 프로젝트를 진행하는 동안 때로 내가 만드는 디바이스와 시리얼로 통신을 하는 GUI를 개발할 필요가 있다.

과거에는 .Net Framework과 C#을 사용해 인터페이스를 만들었었다. Rapid protyping을 가능하게 하는 프레임웍을 사용하면 인터페이스를 커스텀화 하고 OS의 다양한 그래픽 요소를 쉽게 접근할 수 있게 해 준다.



하지만 문제는 그렇게 개발한 앱은 특정 환경에서만 사용할 수 있다는 것이다. 어떻게 하면 진정한 크로스 플랫폼, 즉 맥이나 리눅스에서도 실행될 수 있는가를 찾아 보았다. 거의 모든 운영체제에서 사용할 수 있는 Java나 Python 같은 언어를 사용할 수도 있다. 하지만 이 언어들로 GUI를 개발하는 것은 전용 프레임웍을 사용해야 한다. 추가적으로 SunOracle은 Java의 시리얼 통신 API(javax.comm)의 스펙만을 정의해 놓고 구현을 하지 않았다. 그러므로 이 API를 구현해 놓은 외부 라이브러리(가장 유명한 것이 RxTx이다)를 사용해야만 한다.

여기서 소개하는 방법은 외부 라이브러리를 사용하지 않고 웹 사이트를 개발할 때 사용하는 것과 동일한 기술로 크로스 플랫폼 앱을 개발하는 방법이다.

Chrome App


Chrome App은 기본적으로 어플리케이션이다. 하지만 공통적인 웹 기술(HTML, CSS, javascript등)을 사용해 개발되고 Chrome 브라우져 엔진에 의해 실행된다.
 
표준 웹 사이트와 비교했을 때 가장 큰 장점은 다음과 같다.

* Seamless desktop integration (no address bar...)
* Grouped in a dedicated launcher
* Ability to interface with hardware devices


Anatomy of a Chrome App


Chrome App은 크게 3가지 요소로 구성된다.

* manifest file: 앱의 메타 데이터 (이름, 버젼, 설명 등)를 가지고 있다.
* background script: 앱의 life cycle을 관리하기 위한 이벤트 페이지를 만든다.
* main interface: HTML 페이지, javascript 스크립트, CSS(Cascade Style Sheet) 등으로 만들어진다.

아두이노 IDE에 포함되어 있는 시리얼 모니터를 에뮬레이트하는 데모 앱을 준비해 보았다. 이 앱은 chrome web store에서 구할 수 있고, 소스코드는 github repository에서 다운받을 수 있다.

코드를 좀 상세히 보도록 하자.

manifest.json 파일은 메타 데이터를 포함하고 있다. 가장 중요한 것은 시리얼 포트를 억세스하기를 원한다는 것을 선언하는 것과 백그라운드 스크립트의 이름을 지정하는 것이다.



백그라운드 스크립트는 window.html 파일을 디스플레이 하기 위한 사이즈를 조정할 수 없는 윈도우 (600x500 픽셀)를 만든다.



메인 어플리케이션은 3개의 파일로 만들어 진다.

* window.html
* main.js
* main.css

또한 다양한 메시지 다이얼로그를 디스플레이 하기 위해 jQuery와, 플러그인인 jQuery simplemodal을 사용했다.

Serial port access


Javascript를 사용해 PC의 시리얼포트를 제어하기 위해 Chrome은 chrome.serial API를 제공한다.

먼저 사용 가능한 포트 목록을 찾아 콤보박스에 추가해서, 사용자가 원하는 포트를 선택할 수 있게 해 준다.

chrome.serial.getDevices(function(ports) {
  for (var i = 0; i < ports.length; i++) {
    var portName = ports[i].path;
    var newOption = '' + portName + '';
    var newOption = ' + portName + '">' + portName + '';
    $("#serial_ports_combobox").append(newOption);
  }
});




선택한 시리얼 포트에 연결하기 위해 connect 메소드를 사용한다.

chrome.serial.connect(selectedPort, connectionOptions, onConnect);

이 때 시리얼 포트 설정을 가지고 있는 배열(connectionOptions)을 넘겨줘야 한다.

var connectionOptions = {
  "bitrate": 9600,
  "dataBits": "eight",
  "parityBit": "no",
  "stopBits": "one",
  "receiveTimeout": 500,
  "sendTimeout": 500
};


연결되고 나면 send 메소드로 데이터를 보낼 수 있다.

chrome.serial.send(connectionId, convertStringToArrayBuffer(textToSend), function(sendInfo) {
  if(sendInfo.error) $.modal('Unable to send data: ' + sendInfo.error + '
')
});


에러가 발생하면 sendInfo.error가 null이 아닌 값을 가지게 된다. 위의 예제에서는 에러 메지지가 표시된다.

Javascript 언어의 주요 특징이 비동기성인데 이것이 바로 시리얼 포트로부터 데이터를 수신하는 패러다임이다. 먼저 onReceive 이벤트에 대한 listener(커스텀 함수)를 추가해 줘야만 한다.

chrome.serial.onReceive.addListener(onReceive);

시리얼 포트에 새 데이터가 수신될 때 마다 onReceive() 함수가 호출된다.

function onReceive(info) {
  if (info.connectionId == connectionId &amp;&amp; info.data) {
    var str = convertArrayBufferToString(info.data);
    $("#receive_textarea").append(str);
    $("#receive_textarea").scrollTop($("#receive_textarea")[0].scrollHeight);
  }
}


함수는 먼저 원하는 시리얼 포트에 유효한 데이터가 수신되었는지 확인한다. 유효한 데이터가 수신되면 ArrayBuffer 오브젝트를 string 으로 변환해 textArea에 추가한다.

Test


Chrome 브라우져 설정에서 'Developer mode'를 활성화 한 다음 'Load unpacked extension...'을 클릭하면 Chrome app을 테스트 할 수 있다.


앱을 포함하고 있는 폴더를 선택하면 거기에 있는 앱이 Chrome에 로드되어 실행할 수 있게 된다.

어플리케이션을 배포하고 싶으면 'Pack extension...' 버튼으로 installable package를 만들 수 있다. 또는 Chrome Developer program에 가입한 후 chrome web store에 업로드 할 수도 있다.




2016년 7월 27일 수요일

라즈베리 파이용 외부 워치독 타이머 (External Watchdog Timer for Raspberry Pi)

컴퓨터를 끄지 않고 오랫동안 계속 사용하다 보면 예상하지 못하게 먹통이 되는 경우가 발생할 수 있다. 데스크탑이나 노트북의 경우 사용자가 사용을 하고 있으니 문제가 생기면 전원을 껐다가 다시 켜거나 리셋을 시켜줄 수 있는데 라즈베리 파이로 만든 장치를 원격지에 놔 두고 장시간 동작을 시켜야 하는 경우 이런 상황은 매우 치명적이다.

라즈베리 파이에도 내장 워치독 타이머가 있지만 매우 불안정해서 악명이 높다. 그래서 해결책으로 외부에 간단한 워치독 타이머를 붙여주는 방법이 있다.

물론 전원을 모니터링 해 주는 전용 칩도 있지만 여기서는 가장 일반적으로 쉽게 구할 수 있는 555 타이머를 사용한다.


위의 회로에서 Hi Pulse 핀은 라즈베리 파이의 GPIO핀 중에 사용하지 않는 핀들 중에 하나에 연결해 주면 된다. 하지만 문제는 40핀 커넥터에는 칩 리셋핀이 없다.



아래는 라즈베리 파이2의 회로도 일부분이다.

회로도처럼 리셋핀은 별도의 커넥터로 나와 있어 위 회로도에서 P6의 두 핀을 쇼트시키면 라즈베리 파이가 리셋이 된다. 그러므로 위의 회로에서 오른쪽의 RESET 핀을 P6의 1번 핀에 연결시켜 주면 된다.

리셋핀이 나온 커넥터는 PCB에 RUN이라고 써 있어 쉽게 구분할 수 있다. 다만 라즈베리 버젼마다 위치가 다르므로 자신이 가지고 있는 라즈베리 파이 기판을 확인해 보면 된다.

라즈베리 파이 2는 아래 사진과 같이 DISPLAY 커넥터 옆쪽에 있다.


라즈베리 파이 3는 USB 커넥터 옆쪽에 있다. 커넥터에 두 핀 중에 네모난 모양의 패드가 1번 핀이라 여기에 리셋 신호를 연결해주면 된다.

위와 같이 회로를 구성해 주면 소프트웨어는 매우 간단하다. 회로 왼쪽의 Hi Pulse 라고 쓰여진 핀에 몇초에 한번씩 L->H 펄스를 만들어 주면 된다. 만일 약 60초 이내에 펄스가 없으면 555 타이머의 3번 핀이 Low가 된다. 이 핀이 캐패시터를 통해 라즈베리 파이의 리셋 핀에 연결되어 라즈베리 파이를 리셋시키게 된다.

만일 60초의 시간을 줄이고 싶으면 R1(1 Mohm)의 값을 줄여주거나, 또는 C1(100 uF)의 값을 줄여주면 된다.

LED는 H 펄스가 공급될 때 마다 깜빡여서 사용자에게 모든것이 정상이라는걸 눈으로 확인할 수 있게 해 준다.

리셋될 때 까지 걸리는 시간을 60초 이상으로 설정한 이유는 라즈베리 파이가 부팅하는데 약 30초 이상 걸리기 때문이다.


2016년 7월 21일 목요일

Firmata를 사용해 라즈베리 파이에서 아두이노 제어하기 (Controlling Arduino from Raspberry Py using Firmata)


아두이노와 라즈베리 파이를 시리얼 포트롤 통해 연결하면 firmata를 사용해 라즈베리 파이에서 아두이노의 핀들을 제어할 수 있다. 아두이노와 라즈베리 파이를 시리얼 포트로 연결하는 방법은 이전 포스트(라즈베리 파이와 아두이노를 시리얼 포트로 연결하는 방법들 )를 참고하면 된다.

먼저 아두이노를 설정 해 준다.

Firmata를 사용해 라즈베리 파이에서 아두이노를 제어하려면 아두이노에도 firmata 소프트웨어가 설치되어 있어야 한다.

메뉴의 File -> Examples -> Firmata 에서 StandardFirmata를 오픈해 자신이 사용하는 아두이노에 업로드 해 주면 된다.

다음은 라즈베리 파이에 pyfirmata를 설치해야 한다.

터미널 창에서 아래의 명령을 입력해 주면 된다. 기존에 이미 pip와 pyserial이 설치되어 있다면 첫번째 줄은 건너 뛰어도 된다.

$ sudo apt-get install python-pip python-serial
$ sudo pip install pyfirmata

이제 아두이노를 USB케이블을 사용해 라즈베리 파이에 연결해 주면 /dev 디렉토리에 ttyUSB0 디바이스가 만들어진다. 이 디바이스 이름을 알고 있어야 한다.

만일 라즈베리 파이에 허브를 연결한 다음 여러대의 아두이노를 연결해 주면 각각 /dev/ttyUSB0, /dev/ttyUSB1, /dev/ttyUSB2, .... 식으로 이름이 부여된다.

이제 실제로 라즈베리 파이와 아두이노를 firmata를 사용해 연결해 준다.

$ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pyfirmata import Arduino, util

>>> board = Arduino('/dev/ttyUSB0')
>>>

위와 같이 에러가 없이 진행되었다면 연결이 성공한 것이다.

이제 아두이노의 디지털 포트는 board.digital[] 리스트를 사용해 제어할 수 있다.

즉 13번핀의 LED를 on/off하고 싶으면 다음과 같이 하면 된다.

>>> board.digital[13].write(1)
>>> board.digital[13].write(0)
>>>

핀의 상태를 읽을 때는 다음과 같다.

>>> print board.digital[3].read()
 0
>>>

그런데 핀을 반복적으로 사용해야 하는 경우 매번 board.digital[...] 이렇게 쓰는건 귀찮다. 그 대신 board.get_pin() 함수를 사용해 핀의 reference를 얻어 올 수 있다. 함수의 파라미터 부분에 "[a|d]:[pin#]:[i:o:p:s]" 형태의 스트링을 넘겨줘야 하는데 파라미터는 3개의섹션으로 되어 있고 각 섹션은 콜론(':')으로 구분한다.

첫번째 섹션은 핀이 아날로그(a)인지 디지털(d)인지를 지정한다. 두번째 섹션은 사용할 핀 번호가 된다. 즉 아두이노 우노의 경우 아날로그면 0~5, 디지털이면 0~13 사이의 값이 올 수 있다. 세번째 섹션은 핀 모드를 설정한다. 'i'면 입력, 'o'면 출력, 'p'면 PWM, 's'면 서보가 된다.

이 함수의 리턴값을 변수에 넣어 추후 read, write에 사용하면 된다.

>>> pin13 = board.get_pin('d:13:o')
>>> pin13.write(1)
>>>
>>> pin2 = board.get_pin('d:2:i')
>>> pin2.read()
0
>>>

아날로그 핀에서 값을 읽을 때는 먼저 analog value reporting을 활성화 시켜줘야만 한다. 하지만 그렇게 하면 아두이노가 라즈베리 파이에게 지속적으로 값을 보내게 된다. 라즈베리 파이에서 값을 계속 읽어내지 않으면 시리얼 통신을 막아버려 스크립트가 정상적으로 동작하지 못하게 만들어 버린다. 그러므로 정상적으로 값을 읽기 위해서는 iterator 스레드를 사용하는 것이 유용하다.

>>> it = util.Iterator(board)
>>> it.start()
>>> board.analog[0].enable_reporting()
>>> board.analog[0].read()
>>> it.start()
>>>

아날로그 값 리포팅을 멈추게 하려면 disable_reporting() 메소드를 호출하면 된다.






라즈베리 파이와 아두이노를 시리얼 포트로 연결하는 방법들 (Methods of connecting Raspberry Pi and Arduino using serial port)

라즈베리 파이와 아두이노를 시리얼 포트로 통신을 할 수 있도록 연결하는 방법을 소개한다.

가장 쉬운 방법은 라즈베리 파이의 USB 포트에 아두이노를 USB케이블로 연결하는 것이다.


이 경우는 라즈베리 파이에서 아두이노 IDE로 스케치를 작성해 아두이노로 바로 다운로드도 가능하다. 그리고 라즈베리 파이의 시리얼 포트 디바이스명은 '/dev/ttyUSB0'가 된다. 즉 라즈베리 파이에서 시리얼 포트로 데이터를 보내려면 아래와 같은 식으로 해야 한다.

$ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial

>>> ser = serial.Serial('/dev/ttyUSB0', 115200)
>>> ser.open()
>>> ser.write("Hello")
>>> ser.close()
>>> 

두번째로는 라즈베리 파이의 Tx/Rx핀과 아두이노의 Tx/Rx핀을 직접 연결해 주는 것이다.

Rx/Tx를 서로 크로스로 연결해주면 되는데 단 주의해야 하는 것은 라즈베리 파이의 I/O 핀들은 5V tolerant 하지 않다는 것이다. (즉 라즈베리 파이의 I/O핀에 5V 전압을 가하면 포트가 죽어버릴 수 있다) 그러므로 라즈베리 파이의 Tx -> 아두이노의 Rx 연결(위의 그림에서 노란색 케이블)은 그냥 직접 연결해 줘도 되지만, 아두이노의 Tx -> 라즈베리 파이의 Rx는 신호 레벨을 5V에서 3.3V로 변환해 주는 회로가 필요하다. 전용 level shifter IC를 사용할 수 있지만 여기서는 그냥 가장 간단하게 저항을 사용해 전압 분배회로를 만들어 연결해 줬다. 위의 그림에서 브레드보드에 있는 두개의 저항이 전압 분배 회로이다. 여기서는 1.5K, 3.3K 저항을 사용했다.

이 경우 라즈베리 파이의 시리얼 포트 디바이스명은 '/dev/ttyAMA0'가 된다. 즉 사용하려면 /dev/ttyAMA0 디바이스를 오픈해야만 한다.

$ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial

>>> ser = serial.Serial('/dev/ttyAMA0', 115200)
>>> ser.open()
>>> ser.write("Hello")
>>> ser.close()
>>>

브레드 보드 대신 만능기판에 작은 컨버터 보드를 만들어 사용하면 편하다.





세번째로는 라즈베리는 Tx/Rx핀을 사용하고 아두이노는 소프트웨어 시리얼을 사용해 연결해 줄 수도 있다. 아두이노 우노의 경우 하드웨어 시리얼 포트가 한개밖에 없어 시리얼 포트를 다른 용도로 사용해야만 하는 경우에는 이런 방법을 쓰면 된다.


위의 두번째 그림과 동일하고 단지 아두이노쪽의 핀 번호가 Rx(0), Tx(1) 대신 Rx(6), Tx(7)로 바뀐 것 뿐이다.

이렇게 하는 경우 스케치에서 달라져야 하는 부분은 다음과 같다.

먼저 하드웨어 시리얼을 사용해 아두이노가 라즈베리 파이에게 1초에 한번씩 "Hello"라는 글자를 보내는 경우의 스케치이다.

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.writeln("Hello");
  delay(1000);
}

다음은 소프트웨어 시리얼을 쓰는 경우의 스케치이다.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(6, 7); // RX, TX


void setup()
{
  mySerial.begin(9600);
}

void loop()
{
  mySerial.writeln("Hello");
  delay(1000);
}

추가되어야 하는 부분은 빨간색, 변경되어야 하는 부분은 파란색으로 표시해 놓았다.

마지막으로는 USB-to-serial 모듈을 사용해 연결하는 방법이다.


라즈베리 파이에도 하드웨어 시리얼 포트는 한개밖에 없는데 다른 용도로 사용해야 하는 경우 위와 같이 별도의 USB-to-serial 모듈을 사용해 연결해 줄 수도 있다. 위의 그림에 있는 USB-to-serial 모듈의 I/O핀은 5V tolerant하기 때문에 아두이노의 Tx/Rx에 별도의 레벨 컨버팅 회로 없이 바로 연결할 수 있지만 다른 제품의 경우는 I/O핀이 5V tolerant한지 확인하고 연결해 줘야만 한다. 

라즈베리 파이에 USB-to-serial 모듈을 여러개 연결해 줄 수도 있고 그 경우 각각의 시리얼 포트는 /dev/ttyUSB0, /dev/ttyUSB1, ...식으로 사용하면 된다.

pi@raspberrypi ~ $ ls /dev/tty*
tty    tty12  tty17  tty21  tty26  tty30  tty35  tty4   tty44  tty49  tty53  tty58  tty62  ttyAMA0
tty0   tty13  tty18  tty22  tty27  tty31  tty36  tty40  tty45  tty5   tty54  tty59  tty63  ttyprintk
tty1   tty14  tty19  tty23  tty28  tty32  tty37  tty41  tty46  tty50  tty55  tty6   tty7
tty10  tty15  tty2   tty24  tty29  tty33  tty38  tty42  tty47  tty51  tty56  tty60  tty8
tty11  tty16  tty20  tty25  tty3   tty34  tty39  tty43  tty48  tty52  tty57  tty61  tty9

첫번재 USB-to-serial 모듈을 꼽은 다음 다시 동일한 명령을 입력해 보면 다음과 같이 ttyUSB0가 추가된 걸 확인할 수 있다.

pi@raspberrypi ~ $ ls /dev/tty*
tty    tty12  tty17  tty21  tty26  tty30  tty35  tty4   tty44  tty49  tty53  tty58  tty62  ttyAMA0
tty0   tty13  tty18  tty22  tty27  tty31  tty36  tty40  tty45  tty5   tty54  tty59  tty63  ttyprintk
tty1   tty14  tty19  tty23  tty28  tty32  tty37  tty41  tty46  tty50  tty55  tty6   tty7  ttyUSB0
tty10  tty15  tty2   tty24  tty29  tty33  tty38  tty42  tty47  tty51  tty56  tty60  tty8
tty11  tty16  tty20  tty25  tty3   tty34  tty39  tty43  tty48  tty52  tty57  tty61  tty9

두번째 USB-to-serial 모듈을 꼽고 다시 실행해 본 결과이다.

pi@raspberrypi ~ $ ls /dev/tty*
tty    tty12  tty17  tty21  tty26  tty30  tty35  tty4   tty44  tty49  tty53  tty58  tty62  ttyAMA0
tty0   tty13  tty18  tty22  tty27  tty31  tty36  tty40  tty45  tty5   tty54  tty59  tty63  ttyprintk
tty1   tty14  tty19  tty23  tty28  tty32  tty37  tty41  tty46  tty50  tty55  tty6   tty7  ttyUSB0
tty10  tty15  tty2   tty24  tty29  tty33  tty38  tty42  tty47  tty51  tty56  tty60  tty8  ttyUSB1
tty11  tty16  tty20  tty25  tty3   tty34  tty39  tty43  tty48  tty52  tty57  tty61  tty9

2016년 7월 8일 금요일

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 3 - 가시광선(빛)

IoT 디바이스에 초기 설정 정보를 넘겨주는 방법으로 이전 포스트들에서 설명한 방법 이외에 다른 방법으로 가시광선(빛)을 사용하는 방법도 있다.

이 방식을 사용하는 제품으로 실제 나와 있는걸로는 Quirky의 Nimbus가 있다.


Nimbus의 뒤쪽에는 빛을 감지하는 광센서가 들어 있어 스마트 폰에서 공유기 정보(SSID, password)를 입력하고 시작 버튼을 누르면 스마트폰 전체 화면이 번쩍이며 SSID와 password 정보를 전송한다. 그러면 Nimbus의 광센서를 통해 데이터를 수신하게 된다.

Nimbus를 연결시킬 공유기의 정보(SSID, password)를 입력한다.


Nimbus의 뒤쪽에 센서가 있어 스마트폰 화면을 저 센서에 가까이 가져다 대 주면 된다.



준비가 다 되었으면 스마트폰 화면의 Start Countdown 버튼을 눌러주면 3초 후 부터 화면이 깜빡이며 데이터 전송을 시작한다.


데이터 전송이 끝나면 스마트폰은 Nimbus가 전송된 정보를 사용해 공유기에 접속한 다음 접속완료 메시지를 보내주길 기다린다.



--

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선 랜 AP모드 활용 

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 2 - 초음파

2016년 7월 6일 수요일

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 2 - 초음파

이전 포스트 (IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선랜 AP 모드 활용)에서 설명했던 것 처럼 IoT 디바이스를 무선랜에 접속하도록 하기 위해서는 접속할 공유기의 SSID, password를 넘겨줘야만 한다.

두번째 방법으로는 초음파를 사용해 SSID, password를 전송하는 것이다. 스마트폰에 있는 스피커는 가청 범위의 주파수 뿐 아니고 사람이 들을 수 없는 초음파도 재생이 가능하다. 그러므로 SSID, password를 FSK등의 방식으로 변조(modulation)하여 스피커로 플레이 하면 된다.

예전에 모뎀을 써 봤거나 팩스를 써 보면 삐~찌지지직~ 하는 소리를 들어 본 적이 있을 것이다. 그렇게 소리를 만드는데 그 소리의 주파수를 좀 더 높게 해서 사람 귀에는 안 들리는 소리로 만들어 플레이하는 것이다.



이 방식을 사용하는 디바이스로 아마존의 Dash 버튼이 있다. 아이폰의 화면에서 dash 버튼을 접속시킬 공유기의 SSID, password를 입력 받은 후 dash 버튼을 설정 모드로 만들어 주면 dash 버튼은 마이크를 통해 초음파 신호를 받아들여 소리를 복조(demodulation)하여 SSID, password를 알아낼 수 있다.

- 스마트 폰에서 공유기 정보를 입력


- Dash 버튼을 설정 모드로 변경한 후 아이폰의 스피커와 dash 버튼의 마이크를 일직선이 되게 가까이 가져다 놓는다. 그러면 아이폰이 스피커를 통해 변조된 신호를 출력하고 dash 버튼은 마이크를 통해 그 소리를 받아 공유기 설정정보를 얻게 된다.

정상적으로 공유기 설정정보를 얻으면 dash 버튼은 그 정보로 공유기에 접속한 다음 아이폰에 성공 메지시를 전송해 준다.

--

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선 랜 AP모드 활용

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 3 - 가시광선(빛)

2016년 7월 1일 금요일

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 1 - 무선랜 AP 모드 활용

무선랜을 사용해야 하는 경우 가장 먼저 해야 할 일은 무선랜 단말기(스마트폰, 노트북 등등)을 무선랜 AP(공유기)에 연결시켜 주는 것이다. 연결을 위해서는 먼저 공유기의 SSID, password를 알아야 한다. 그러면 무선랜 설정 화면으로 가서 자신이 연결하고자 하는 공유기의 SSID를 선택하고, 보안 설정이 되어 있으면 암호를 넣어줘야만 한다.

 그런데 이 과정이 노트북이나 스마트폰같이 화면과 키보드가 있으면 아무 문제가 안되지만 대부분의 IoT 기기들은 화면이나 키보드, 또는 둘 다 없는 경우가 많다.

그래서 장치의 무선랜 설정 UI로 여러가지 방법을 사용하고 있다. 이번에 소개하는 방법은 장치가 먼저 무선랜 공유기가 되어 SSID, password를 받아오는 방식이다.

이 방식을 사용한 샤오미의 스마트 플러그이다.




중국용이다 보니 플러그가 메롱한 모양이라 국내에서 사용하려면 일종의 돼지코(?)가 필요하다.




설정 목표는 아래 그림과 같이 스마트 플러그를 NewGateway라는 SSID를 가지고 있는 공유기에 연결시키는 것이다. 하지만 초기에 스마트 플러그는 NewGateway, test12345라는 정보를 모르기에 공유기에 접속할 수가 없다.



이제 이 플러그를 콘센트에 처음 꼽으면 플러그 위쪽면에 노란색 불이 깜빡인다.


노란불이 깜빡인다는건 스마트플러그가 AP모드(공유기처럼 동작)라는 의미이다. 'chuangmi-plug-m1_miapac...'이라는 SSID에 암호는 없다.

스마트폰에서 새오미 앱을 실행시켜 스마트 플러그를 추가하는 메뉴를 선택한다.



친절하게 노란색 불이 깜빡이는지 확인하라고 알려준다. 노란색 불이 깜빡이므로 아래쪽의 'Yellow light flashing'을 체크하면 Next 버튼이 활성화 되므로 버튼을 눌러준다.

여기에서 스마트 플러그를 접속시키고자 하는 공유기의 SSID와 암호를 넣어준다. 위 그림에서 공유기의 SSID는 'NewGateway', 암호는 'test12345'가 된다.




이제 스마트폰을 스마트 플러그 AP에 연결하라는 안내화면이 나온다. 현재 스마트폰 역시 NewGateway 공유기에 연결되어 있는 상태이다. 여기서 아래쪽의 'Go to set Wi-Fi' 버튼을 눌러준다.


무선랜 설정 화면으로 이동하게 된다. 무선 네트웍 목록에 보면 'chuangmi-plug-m1_,iapac...' 이라는 항목이 보일 것이다. 이 무선랜을 선택해 연결해 주면 된다. 아래 그림에서 볼 수 있는것처럼 이름 옆쪽에 자물쇠 그림이 없으므로 보안설정이 따로 되어 있지 않아 암호를 물어보지 않고 바로 연결한다.


연결이 확인 되었으면 다시 MiHome 앱(샤오미 앱)으로 돌아간다.




그러면 화면이 아래와 같이 바뀌고 스마트 플러그는 파란색 불빛이 깜빡인다. 이 단계에서 스마트폰이 스마트 플러그와 통신을 해 공유기의 정보를 넘겨주게 된다.




잠시 기다리면 아래와 같이 연결을 성공했다는 화면이 나오게 된다. 이제 스마트 플러그가 단말기 모드로 공유기에 연결된 것이다.










--

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 2 - 초음파

IoT 디바이스에 공유기 설정정보를 넘겨주는 방법 3 - 가시광선(빛)