레이블이 liblo인 게시물을 표시합니다. 모든 게시물 표시
레이블이 liblo인 게시물을 표시합니다. 모든 게시물 표시

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 등을 스마트폰에서 바로 제어가 가능해진다.



2015년 1월 21일 수요일

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

인텔 에디슨을 OSC 프로토콜을 사용해 스마트폰이나 PC, 또는 다른 에디슨에서 제어해 보도록 하겠다. 스마트폰에서는 Mrmr, TouchOSC, Control (OSC+MIDI)같은 앱을 사용하면 된다.

먼저 에디슨에 OSC 라이브러리를 설치한다. 여러 종류가 있지만 여기서는 liblo를 사용한다.  Liblo는 Steve Harris가 만든 경량 OSC 라이브러리로 LGPL을 따르기 때문에 추후 제품 개발에 사용하더라도 저작권 문제가 없다.

http://liblo.sourceforge.net/

먼저 liblo를 다운받는다. 여러가지 방법이 있지만 git를 사용해 클론을 하는게 편하다.

# git clone git://liblo.git.sourceforge.net/gitroot/liblo/liblo
Cloning into 'liblo'...
remote: Counting objects: 2561, done.
remote: Compressing objects: 100% (1218/1218), done.
remote: Total 2561 (delta 2001), reused 1657 (delta 1341)
Receiving objects: 100% (2561/2561), 663.60 KiB | 104.00 KiB/s, done.
Resolving deltas: 100% (2001/2001), done.
Checking connectivity... done.
#

만일 위와 같은 출력 대신 git가 설치되어 있지 않다는 에러가 나오면 (초기 상태는 git가 설치되어 있지 않음) 먼저 아래 명령으로 git를 설치하고 다시 위의 명령을 입력해 주면 된다.

# opkg install git

git clone이 정상적으로 실행되었으면 현재 디렉토리에 liblo라는 디렉토리가 만들어 졌을 것이다. 소스코드 다운로드가 된 것이므로 라이브러리를 빌드한다.

# cd liblo
# ./autogen.sh
'README' -> 'README.MD'
...
Now type 'make' to compile.
# make
...
# make install
...


여기까지 에러가 없이 진행되었다면 라이브러리가 빌드되어 정상적으로 설치 된 것이다. 다만 라이브러리가 설치된 위치가 /usr/lib가 아니고 /usr/local/lib이므로 라이브러리를 검색할 디렉토리를 설정해 주는것이 편하다. 먼저 텍스트 에디터로 /etc/ld.so.conf 파일을 열어보면 파일 내용이 비어있는데 아래의 내용을 추가하고 저장한다.

# vi /etc/ld.so.conf

/lib
/usr/lib
/usr/local/lib

ld.so.conf 파일을 수정했으면 다음의 명령을 입력해 준다.

# ldconfig

이것으로 liblo 라이브러리 설치가 완전히 끝났다. 라이브러리 뿐 아니고 이 라이브러리를 사용하는 기본 툴(oscdump, oscsend)도 함께 설치되어 있어 이 툴들을 이용하면 임의의 OSC 메시지를 보내거나 메시지를 받아 내용을 화면에 출력할 수 있다.

# oscdump
oscdump version 0.28
Copyright (C) 2008 Kentaro Fukuchi

Usage: oscdump <port>
or     oscdump <url>
Receive OpenSound Control messages and dump to standard output.

Description
port    : specifies the listening port number.
url     : specifies the server parameters using a liblo URL.
          e.g. UDP        "osc.udp://:9000"
               Multicast  "osc.udp://224.0.1.9:9000"
               TCP        "osc.tcp://:9000"

# oscsend
oscsend version 0.28
Copyright (C) 2008 Kentaro Fukuchi

Usage: oscsend hostname port address types values...
or     oscsend url address types values...
Send OpenSound Control message via UDP.

Description
hostname: specifies the remote host's name.
port    : specifies the port number to connect to the remote host.
url     : specifies the destination parameters using a liblo URL.
          e.g. UDP        "osc.udp://localhost:9000"
               Multicast  "osc.udp://224.0.1.9:9000"
               TCP        "osc.tcp://localhost:9000"

address : the OSC address where the message to be sent.
types   : specifies the types of the following values.
          i - 32bit integer
          h - 64bit integer
          f - 32bit floating point number
          d - 64bit (double) floating point number
          s - string
          S - symbol
          c - char
          m - 4 byte midi packet (8 digits hexadecimal)
          T - TRUE (no value required)
          F - FALSE (no value required)
          N - NIL (no value required)
          I - INFINITUM (no value required)
values  : space separated values.

Example
$ oscsend localhost 7777 /sample/address iTfs 1 3.14 hello
#

examples 디렉토리에는 이 라이브러리를 사용한 c와 c++ 예제 프로그램들을 찾아볼 수 있다.

C나 C++로 개발을 하는 경우는 이걸로 충분하고 파이선을 사용하고 싶으면 python wrapper를 설치해줘야 한다. 여기서는 pyliblo를 사용한다.

# wget http://das.nasophon.de/download/pyliblo-0.9.2.tar.gz
--2015-01-21 00:42:04--  http://das.nasophon.de/download/pyliblo-0.9.2.tar.gz
Resolving das.nasophon.de... 83.151.28.113
Connecting to das.nasophon.de|83.151.28.113|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 100079 (98K) [application/x-gzip]
Saving to: 'pyliblo-0.9.2.tar.gz'

100%[======================================>] 100,079     43.4KB/s   in 2.3s

2015-01-21 00:42:08 (43.4 KB/s) - 'pyliblo-0.9.2.tar.gz' saved [100079/100079]

# tar zxvf pyliblo-0.9.2.tar.gz
pyliblo-0.9.2/
...
pyliblo-0.9.2/COPYING
# cd pyliblo-0.9.2
# ./setup.py build
...
# ./setup.py install
...

여기까지 에러 없이 진행되면 pyliblo도 정상 설치가 된 것이다. Pyliblo를 사용한 간단한 예제 코드는 홈페이지(http://das.nasophon.de/pyliblo/examples.html)에서 찾을 수 있다. 

다음번에는 실제로 스마트폰에서 OSC 프로토콜을 사용해 에디슨의 하드웨어를 직접 제어하도록 해 보겠다.

OSC in Intel Edison - Part 2