Bagaimana saya bisa menghubungkan Wiimote ke komputer saya untuk mengontrol pemutar audio?

9

Saya ingin menghubungkan Wiimote. Saya menjalankan rapi dan ingin mengontrol pemutar audio dengan Wiimote saya. Apakah itu mungkin?

bentuk jordannormal
sumber

Jawaban:

11

Sunting : Rinzwind memberi tahu saya tentang proyek launchpad yang disebut " wiican ". Tampaknya itu diimplementasikan sebagai applet indikator dan memungkinkan untuk menyesuaikan tindakan wii Anda. Anda bisa mengikat misalnya amarok -tke wiibutton.


Anda beruntung, dan Anda bahkan tidak tahu berapa banyak. Butuh beberapa saat dan sedikit riset tetapi: Saya menulis naskah untuk melakukannya beberapa waktu lalu. Ini bekerja dengan Amarok dan Totem, meskipun dapat dengan mudah dimodifikasi untuk mengontrol pemain lain (asalkan mereka memiliki antarmuka baris perintah). Beri saya beberapa menit untuk menulis beberapa komentar bersama. Kemudian saya akan mengedit jawaban ini dan mempostingnya.

  • Fitur:
    • Periksa status baterai Wiimote.
    • Alihkan led pada Wiimote.
    • Mulai Amarok.
    • Jeda / terus bermain.
    • Lewati ke trek berikutnya / terakhir.
    • Kontrol volume sistem melalui alsamixer

Anda membutuhkan python dan python-cwiid Instal python-cwiid / sudo apt-get install python-cwiiddiinstal. Anda bisa melakukannya sambil menunggu.

Di bawah ini adalah skripnya. Jalankan saja di terminal.

#!/usr/bin/python
# indent-mode: spaces, indentsize: 4, encoding: utf-8
# © 2011 [email protected].
# 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()
membingungkan
sumber
Wow. Terima kasih banyak. Kamu pembunuhnya! GUI pasti menyenangkan juga, tetapi tidak pernah. Itu sempurna.
jordannormalform
Senang kamu menyukainya. Gui akan membutuhkan banyak tenaga hanya untuk mengganti led dan menanyakan status baterai. Tapi jangan ragu untuk menulisnya sendiri.
gunakan con
1

Ada juga program GUI yang berada di system tray, yang disebut " Wiican ". Saya dulu menggunakan versi ubuntu sebelumnya sebelum 11.04 (Natty) tetapi sekarang saya tidak bisa tahu cara menginstalnya dengan PPA yang ditemukan di https://launchpad.net/wiican

Itu hanya menghubungkan dan mengkonfigurasi tombol yang Anda inginkan, namun tidak sempurna tetapi saya akan menyebutnya hebat

akan memperbarui posting setelah saya mengetahui cara menginstal.

Sunting: Saya dapat menemukan paket di tautan ini

Julio
sumber