Làm cách nào tôi có thể kết nối Wiimote với máy tính để điều khiển trình phát âm thanh?


9

Tôi muốn kết nối Wiimote. Tôi đang chạy tự nhiên và muốn điều khiển trình phát âm thanh bằng Wiimote của mình. Điều đó có thể không?

Câu trả lời:


11

Chỉnh sửa : Rinzwind đã cho tôi biết về một dự án launchpad có tên là " wiican ". Rõ ràng nó được triển khai như một applet chỉ báo và cho phép tùy chỉnh các hành động wii của bạn. Bạn có thể liên kết ví dụ amarok -tvới một wiibutton.


Bạn đang gặp may, và bạn thậm chí không biết bao nhiêu. Phải mất một thời gian và một chút nghiên cứu nhưng: Tôi đã viết một kịch bản để làm điều đó một thời gian trước. Nó hoạt động với Amarok và Totem, mặc dù nó có thể dễ dàng được sửa đổi để kiểm soát những người chơi khác (miễn là họ có giao diện dòng lệnh). Hãy cho tôi một vài phút để viết một vài bình luận cùng nhau. Sau đó tôi sẽ chỉnh sửa câu trả lời này và đăng nó.

  • Đặc trưng:
    • Kiểm tra trạng thái pin của Wiimote.
    • Chuyển một đèn led trên Wiimote.
    • Bắt đầu Amarok.
    • Tạm dừng / tiếp tục chơi.
    • Bỏ qua bài hát tiếp theo / cuối cùng.
    • Kiểm soát âm lượng hệ thống qua alsamixer

Bạn sẽ cần python và python-cwiid Cài đặt python-cwiid / sudo apt-get install python-cwiidcài đặt. Bạn có thể làm điều đó trong khi chờ đợi.

Dưới đây là kịch bản. Chỉ cần chạy nó trong một thiết bị đầu cuối.

#!/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()

Ồ Cảm ơn rất nhiều. Bạn là kẻ giết người! Một GUI cũng sẽ rất tốt nhưng đừng bận tâm. Thật hoàn hảo.
jordann normalform

Vui vì bạn thích nó. Một gui sẽ là quá mức cần thiết cho việc bật đèn led và truy vấn trạng thái pin. Nhưng hãy tự mình viết nó.
con-f-sử dụng

1

Ngoài ra còn có một chương trình GUI nằm trên khay hệ thống, được gọi là " Wiican ". Tôi đã từng sử dụng trên các phiên bản trước của Ubuntu trước ngày 11.04 (Natty) nhưng bây giờ tôi dường như không thể biết cách cài đặt nó với PPA được tìm thấy tại https://launchpad.net/wiican

Nó chỉ kết nối và cấu hình các nút như bạn muốn, chưa hoàn hảo nhưng tôi sẽ gọi nó là tuyệt vời

sẽ cập nhật bài viết khi tôi tìm hiểu cách cài đặt.

Chỉnh sửa: Tôi đã có thể tìm thấy một gói tại liên kết này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.