Wie kann ich eine Wiimote an meinen Computer anschließen, um einen Audio-Player zu steuern?


9

Ich möchte eine Wiimote verbinden. Ich laufe natty und möchte einen Audio-Player mit meiner Wiimote steuern. Ist das möglich?

Antworten:


11

Edit : Rinzwind hat mich auf ein Launchpad-Projekt namens " wiican " hingewiesen . Anscheinend ist es als Indikator-Applet implementiert und ermöglicht das Anpassen Ihrer Wii-Aktionen. Sie könnten zB amarok -tan einen Wiibutton binden .


Sie haben Glück und wissen nicht einmal, wie viel. Ich habe eine Weile gebraucht und ein bisschen recherchiert, aber: Ich habe vor einiger Zeit ein Skript geschrieben, um genau das zu tun. Es funktioniert mit Amarok und Totem, kann jedoch leicht geändert werden, um andere Spieler zu steuern (vorausgesetzt, sie verfügen über eine Befehlszeilenschnittstelle). Geben Sie mir ein paar Minuten, um ein paar Kommentare zusammen zu schreiben. Dann werde ich diese Antwort bearbeiten und veröffentlichen.

  • Eigenschaften:
    • Überprüfen Sie den Batteriestatus der Wiimote.
    • Schalten Sie eine LED auf der Wiimote.
    • Starten Sie Amarok.
    • Pause / Fortsetzung des Spielens.
    • Zum nächsten / letzten Titel springen.
    • Steuern Sie die Systemlautstärke über alsamixer

Sie benötigen Python und Python-CWID Installieren Sie python-cwiid / sudo apt-get install python-cwiidinstalliert. Sie können das tun, während Sie warten.

Unten ist das Skript. Führen Sie es einfach in einem Terminal aus.

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

Wow. Vielen Dank. Du bist der Mörder! Eine GUI wäre auch nett gewesen, aber egal. Es ist perfekt.
jordannormalform

Froh, dass Sie es mögen. Eine GUI wäre übertrieben, wenn man nur eine LED umschaltet und den Batteriestatus abfragt. Aber zögern Sie nicht, es selbst zu schreiben.
con-f-use

1

Es gibt auch ein GUI-Programm namens " Wiican " in der Taskleiste . Ich habe vor 11.04 (Natty) auf früheren Versionen von Ubuntu verwendet, aber jetzt kann ich anscheinend nicht wissen, wie ich es mit der PPA installieren soll, die unter https://launchpad.net/wiican zu finden ist

Es verbindet und konfiguriert nur Tasten, wie Sie es wünschen, aber nicht perfekt, aber ich würde es großartig nennen

Ich werde den Beitrag aktualisieren, sobald ich herausgefunden habe, wie ich ihn installieren soll.

Bearbeiten: Ich konnte ein Paket unter diesem Link finden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.