2015년 1월 24일 토요일

OSC(Open Sound Control) in Intel Edison - part 2

이전 포스트(OSC(Open Sound Control) in Intel Edison - part 1)에서 에디슨에서 OSC를 사용하기 위해 필요한 liblo, pyliblo를 설치하는 방법을 설명했다.

이제 실제로 OSC를 통해 메시지를 주고받아 보겠다. 여기서는 TouchOSC를 사용했는데 다른 OSC 클라이언트(mrmr 등)를 사용해도 상관없다.


TouchOSC를 실행하면 아래와 같은 설정화면이 뜨게 된다.


여러개의 샘플 레이아웃이 들어있지만 여기서는 Simple 을 사용한다. Connections의 OSC: ... 부분을 클릭해 OSC 서버의 네트웍 정보 (여기서는 에디슨의 네트웍 정보)를 넣어줘야 한다.


에디슨의 Host 에는 무선랜 IP 주소를, Port (outgoing)에는 에디슨에서 실행한 OSC 서버 프로그램 포트번호를 넣어주고 Enable을 On으로 해 주면 된다. 설정을 다 입력했으면 왼쪽 위의 '< TouchOSC' 를 눌러 초기화면으로 돌아간다.


이제 모든 설정이 끝났으니 오른쪽 위의 'Done'을 눌러 Simple 레이아웃 화면으로 넘어간다.

현재 화면에는 5개의 슬라이더(또는 fader)와 4개의 토글 버튼이 있다. 슬라이더를 움직여 값을 바꾸거나 (0.0~1.0), 토글 버튼을 눌러 값을 0.0 또는 1.0으로 바꿔 줄 수 있다. 값에 변화가 생길 때 마다 지정된 OSC 서버에 OSC 메시지가 전송되게 된다.


각 UI들에 해당하는 path는 위와 같이 되어 있다. 즉 왼쪽 아래 버튼을 누르면 '/1/toggle1 1.0', 또 한번 더 누르면  '/1/toggle1 0.0'이란 메시지가 전달된다.

이제 실제 메시지를 확인해 보도록 하겠다. Liblo가 설치되었다면 다음 명령을 실행하고 TouchOSC 화면의 슬라이더를 움직이거나 버튼을 눌러보면 전달되는 메시지가 화면에 출력된다.

# oscdump 9001
/1/fader1 f 0.004219
/1/fader1 f 0.012658
...
/1/fader1 f 0.109705
/1/fader1 f 0.109705
/1/toggle2 f 1.000000
/1/toggle4 f 1.000000
/1/toggle1 f 1.000000
/1/fader5 f 0.011152
...
/1/fader5 f 0.107807
^C


이제 동작하는게 확인되었으니 pyliblo를 사용해 간단한 서버 프로그램을 만들어본다.

# cat svrsimple.py
#!/usr/bin/env python

import liblo, sys

try:
    server = liblo.Server(9001)
except liblo.ServerError, err:
    print str(err)
    sys.exit()

def slide_cb(path, args):
    f = args[0]
    id = int(path.split('fader')[1])
    print "Slider%d moved to %f" % (id, f)
#    print "received message '%s' with arguments '%f'" % (path, f)

def sw_cb(path, args):
    f = args[0]
    sid = int(path.split('toggle')[1])
    if f == 0.0:
      print "SW%d turned OFF" % sid
    else:
      print "SW%d turned ON" % sid

def fallback(path, args, types, src):
    print "got unknown message '%s' from '%s'" % (path, src.url)
    for a, t in zip(args, types):
        print "argument of type '%s': %s" % (t, a)

# register method taking an int and a float
server.add_method("/1/fader1", 'f', slide_cb)
server.add_method("/1/fader2", 'f', slide_cb)
server.add_method("/1/fader3", 'f', slide_cb)
server.add_method("/1/fader4", 'f', slide_cb)
server.add_method("/1/fader5", 'f', slide_cb)

server.add_method("/1/toggle1", 'f', sw_cb)
server.add_method("/1/toggle2", 'f', sw_cb)
server.add_method("/1/toggle3", 'f', sw_cb)
server.add_method("/1/toggle4", 'f', sw_cb)
# register a fallback for unhandled messages
server.add_method(None, None, fallback)

# loop and dispatch messages every 100ms
while True:

    server.recv(100)
# chmod +x svrsimple.py
# ./svrsimple.py
Slider1 moved to 0.831224
Slider1 moved to 0.789030
Slider1 moved to 0.767932
...
SW1 turned ON
SW4 turned ON
SW3 turned ON
SW2 turned ON
SW3 turned OFF
Slider5 moved to 0.724907
Slider5 moved to 0.736059
Slider5 moved to 0.747212
^C
#

이제 mraa 라이브러리를 사용하고 slide_cb, sw_cb의 코드를 수정하면 에디슨에 연결된 LED의 밝기나 모터의 속도 제어, 가전제품의 ON/OFF 등을 스마트폰에서 바로 제어가 가능해진다.



댓글 없음:

댓글 쓰기