오디오 플레이어를 제어하기 위해 Wiimote를 컴퓨터에 어떻게 연결합니까?


9

Wiimote를 연결하고 싶습니다. Natty를 실행 중이며 Wiimote로 오디오 플레이어를 제어하고 싶습니다. 가능합니까?

답변:


11

편집 : Rinzwind 는 " wiican " 이라는 런치 패드 프로젝트에서 나를 소개했습니다 . 분명히 그것은 애플릿 표시기로 구현되며 Wii 동작을 사용자 정의 할 수 있습니다. 예 amarok -t를 들어 wiibutton에 바인딩 할 수 있습니다.


당신은 운이 좋으며, 심지어 얼마를 모릅니다. 시간이 조금 걸렸지 만 약간의 연구가 필요했습니다. Amarok 및 Totem과 함께 작동하지만 다른 플레이어를 제어하기 위해 쉽게 수정할 수 있지만 (명령 줄 인터페이스가있는 경우). 몇 가지 의견을 함께 쓸 시간을주세요. 그런 다음이 답변을 편집하여 게시하겠습니다.

  • 풍모:
    • Wiimote의 배터리 상태를 확인하십시오.
    • Wiimote의 LED를 켭니다.
    • 아마록을 시작하십시오.
    • 재생 일시 정지 / 계속
    • 다음 / 마지막 트랙으로 건너 뜁니다.
    • Alsamixer를 통한 시스템 볼륨 제어

당신은 파이썬과 필요 파이썬 cwiid python-cwiid 설치 / sudo apt-get install python-cwiid설치. 기다리는 동안 할 수 있습니다.

아래는 스크립트입니다. 터미널에서 실행하십시오.

#!/usr/bin/python
# indent-mode: spaces, indentsize: 4, encoding: utf-8
# © 2011 con-f-use@gmx.net.
# Use permitted under MIT license:
# http://www.opensource.org/licenses/mit-license.php (NO WARRANTY IMPLIED)
"""A Wiimote script to control totem and amarok under Ubuntu.

Provides a rudimentary interface to:
-Check battery status of the Wiimote.
-Switch an led on the Wiimote.
-Start Amarok.
-Pause/contiue playing.
-Skip to next/last track.
-Control the system volume over pulseaudio

Needs the package 'python-cwiid', 'amarok' and or 'totem' to be installed.

Globals:

wiimote -- the wiimote object
led -- the status of the led (on/off)

"""

import cwiid
import sys
import os

def main():
    """PC-side interface handles interaction between pc and user.

    b -- battery status
    l -- toggle led
    q -- quit
    h -- print help
    """
    global wiimote
    connect_wiimote()

    #Print help text ont startup
    print 'Confirm each command with ENTER.'
    hlpmsg =    'Press q to quit\n'\
                'b for battery status\n'\
                'l to toggle the led on/off\n'\
                'h or any other key to display this message.'
    print hlpmsg

    #Main loop for user interaction
    doLoop = True
    while doLoop:
        c = sys.stdin.read(1)
        if c == 'b':    # battery status
            state = wiimote.state
            bat = int(100.0 * state['battery'] / cwiid.BATTERY_MAX)
            print bat
        elif c == 'l':  # toggle led
            toggle_led()
        elif c == 'q':  # exit program
            doLoop = False
        elif c == '\n': # ignore newlines
            pass
        else:           # print help message when no valid command is issued
            print hlpmsg

    #Close connection and exit
    wiimote.close()

def connect_wiimote():
    """Connets your computer to a Wiimote."""
    print 'Put Wiimote in discoverable mode now (press 1+2)...'
    global wiimote
    while True:
        try:
            wiimote = cwiid.Wiimote(#add address of Wiimote here for speedup)
            break
        except:
            continue
    wiimote.mesg_callback = callback
    #Set Wiimote options
    global led
    led = True
    wiimote.led = cwiid.LED1_ON
    wiimote.rpt_mode = cwiid.RPT_BTN
    wiimote.enable(cwiid.FLAG_MESG_IFC)

def callback(mesg_list, time):
    """Handels the interaction between Wiimote and user.

    A and B together    -- toggle led
    A                   -- play/pause
    up / down           -- fast forward / backward
    right / left        -- next / previous trakc
    + / -               -- increase / decreas volume

    """
    for mesg in mesg_list:
        # Handle Buttonpresses - add hex-values for simultaneous presses
        # Buttons not listed: 0x4 - B, 0x1 - 2, 0x2 - 1 | just babytown frolics
        if mesg[0] == cwiid.MESG_BTN:
            if mesg[1] == 0x8:      # A botton
                player_control('playpause')
            elif mesg[1] == 0xC:    # A and B together
                toggle_led()
            elif mesg[1] == 0x800:  # Up botton
                player_control('ffwd')
            elif mesg[1] == 0x100:  # Left botton
                player_control('lasttrack')
            elif mesg[1] == 0x200:  # Right botton
                player_control('nexttrack')
            elif mesg[1] == 0x400:  # Down botton
                player_control('fbwd')
            elif mesg[1] == 0x10:   # Minus botton
                change_volume(-1)
            elif mesg[1] == 0x1000: # Plus botton
                change_volume(1)
            elif mesg[1] == 0x80:   # home botton
                shut_down()
        # Handle errormessages
        elif mesg[0] == cwiid.MESG_ERROR:
            global wiimote
            wiimote.close()
            connect_wiimote()

def change_volume(change):
    """Changes system's master volume."""
    cmd = "amixer get Master | grep 'Front Left' | grep -oP '(?<=Playback\ )\d+'"
    fin,fout = os.popen4(cmd)
    currVol = int( fout.read() )
    newVol = currVol + change
    os.system( "amixer set Master "+str(newVol) )

def toggle_led():
    """Toggles first led on Wiimote on/off."""
    global led
    if led == True:
        led = False
        wiimote.led = 0
    else:
        led = True
        wiimote.led = cwiid.LED1_ON

def player_control(action):
    """Controls Amarok or Totem - depending on wich one is running.

    Totem takes precedence over Amarok if running. If none is running, Amarok
    will be started ant take the command.

    """
    print action
    # Check if totem is running
    cmd = "ps -A | grep -oP 'totem'"
    fin,fout = os.popen4(cmd)
    isTotem = fout.read()
    isTotem = isTotem.find('totem') != -1
    # Do the actual player action
    if action == 'nexttrack':
        if isTotem:
            cmd = "totem --next"
        else:
            cmd = "amarok -f"
    elif action == 'lasttrack':
        if isTotem:
            cmd = "totem --previous"
        else:
            cmd = "amarok -r"
    elif action == 'playpause':
        if isTotem:
            cmd = "totem --play-pause"
        else:
            cmd = "amarok -t"
    elif action == 'ffwd':
        if isTotem:
            cmd = "totem --seek-fwd"
    elif action == 'fbwd':
        if isTotem:
            cmd = "totem --seek-bwd"
    os.system(cmd)

main()

와. 고마워 당신은 살인자입니다! GUI도 좋았지 만 신경 쓰지 않았을 것입니다. 그것은 완벽.
jordannormalform

당신이 그것을 좋아해서 다행입니다. gui는 led를 토글하고 배터리 상태를 쿼리하는 것으로 과도합니다. 그러나 자유롭게 작성하십시오.
con-f-use

1

시스템 트레이에 " Wiican " 이라는 GUI 프로그램도 있습니다 . 11.04 (Natty) 이전의 이전 버전의 우분투에서 사용했지만 지금은 https://launchpad.net/wiican에 있는 PPA로 설치하는 방법을 알 수없는 것 같습니다.

원하는대로 버튼을 연결하고 구성하지만 완벽하지는 않지만 훌륭하다고 부릅니다.

설치 방법을 찾으면 게시물을 업데이트합니다.

편집 :이 링크 에서 패키지를 찾을 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.