Seite 1 von 1

cwiid Nunchuck auslesen

Verfasst: Samstag 2. März 2013, 19:20
von xam090
Hallo.
Ich versuche gerade mit dem Modul cwiid das Wii Nunchuk auszulesen. Wenn ich mir alle Daten anzeigen lasse bekomme ich folgendes zurück:

Code: Alles auswählen

{'led': 0, 'rpt_mode': 18, 'ext_type': 1, 'buttons': 0, 'rumble': 0, 'error': 0, 'nunchuk': {'acc': (254, 128, 128), 'buttons': 1, 'stick': (0, 0)}, 'battery': 112}
Aber da ich nur die Daten vom Joystick auf dem Nunchuk haben will habe ich es schon mit:

Code: Alles auswählen

print(wii.state['nunchuk']) 
versucht. Da kommt aber folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "nunchuk.py", line 27, in <module>
    print(wii.state['nunchuk'])
KeyError: 'nunchuk'
Kennt sich irgendjemand mit dem Modul cwiid aus?

:K MVG xam090

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 02:35
von Leonidas
Hallo xam090, willkommen im Forum,

Führe mal ein

Code: Alles auswählen

print(wii.state)
aus

Wenn da ein Key namens 'nunchuk' dargestellt wird, solltest du auch darauf zugrefen können.

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 11:07
von xam090
Hallo und Danke.

Wenn ich

Code: Alles auswählen

print(wii.state)
ausführe bekomme ich folgendes zurück:

Code: Alles auswählen

{'led': 0, 'rpt_mode': 18, 'ext_type': 1, 'buttons': 0, 'rumble': 0, 'error': 0, 'nunchuk': {'acc': (254, 128, 128), 'buttons': 1, 'stick': (0, 0)}, 'battery': 112}
Das ist mein aktueller Quellcode:

Code: Alles auswählen

import cwiid
import time
 
print 'Press 1 + 2 on your Wii Remote now ...'
time.sleep(1)
 
# Connect to the Wii Remote. If it times out
# then quit.
try:
	wii=cwiid.Wiimote()
except RuntimeError:
	print "Error opening wiimote connection"
	quit()
 
print 'Wii Remote connected...\n'
print 'Press PLUS and MINUS together to disconnect and quit.\n'
 
wii.rpt_mode = cwiid.RPT_NUNCHUK | cwiid.RPT_BTN
 
while True:
	if (wii.state['buttons'] - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0):
		print '\nClosing connection ...'
    		wii.rumble = 1
    		time.sleep(1)
    		wii.rumble = 0
    		exit(wii)
	print(wii.state)
	time.sleep(1)

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 11:22
von BlackJack
@xam090: Laut Ausgabe gibt es den Schlüssel 'nunchuk'. Allerdings wird im Quelltext nirgends auf diesen Schlüssel zugegriffen, das heisst selbst wenn es ihn nicht gäbe, könnte kein `KeyError` deswegen kommen.

Ist `wii.state` ein normales `dict`-Objekt oder hat das einen anderen Typ?

Abgesehen von eigentlichen Problem: Du solltest weder `quit()` noch `exit()` verwenden, sondern `sys.exit()`. Die beiden anderen Funktionen sind nicht dokumentiert, also kann man sich auch nicht darauf verlassen, dass es sie gibt.

``print`` ist in der von Dir verwendeten Python-Version keine Funktion sondern eine Anweisung. Also sollte man es auch nicht so schreiben das es aussieht als wäre es eine Funktion. Die Klammern bei der ``if``-Bedingung sind ebenfalls überflüssig, beziehungsweise falsch gesetzt wenn es um die Verdeutlichung der Auswertungsreihenfolge geht. Ich hätte da auch eher auf Bitverknüpfungen statt auf Subtraktion gesetzt.

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 12:12
von xam090
Tschuldigung hab den falschen Quellcode hochgeladen.
Hier ist noch mal der aktuelle:

Code: Alles auswählen

import cwiid
import time
import sys
 
print 'Press 1 + 2 on your Wii Remote now ...'
time.sleep(1)
 
# Connect to the Wii Remote. If it times out
# then quit.
try:
	wii=cwiid.Wiimote()
except RuntimeError:
	print "Error opening wiimote connection"
	sys.exit()
 
print 'Wii Remote connected...\n'
print 'Press PLUS and MINUS together to disconnect and quit.\n'
 
wii.rpt_mode = cwiid.RPT_NUNCHUK | cwiid.RPT_BTN
 
while True:
	if wii.state['buttons'] - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0:
		print '\nClosing connection ...'
    		wii.rumble = 1
    		time.sleep(1)
    		wii.rumble = 0
    		sys.exit()
	print wii.state["nunchuk"]
	time.sleep(1)
Trotzdem erhalte ich noch immer folgende Fehler Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "nunchuk.py", line 28, in <module>
    print wii.state["nunchuk"]
KeyError: 'nunchuk'
Ich glaube schon das wii.state ein normales Dictonary ist.

MVG xam090

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 13:13
von BlackJack
@xam090: Ersetze den Glauben durch Wissen — mit der `type()`-Funktion. Am besten änderst Du die Ausgabe von ``print wii.state["nunchuk"]`` zu

Code: Alles auswählen

    state = wii.state
    print type(state)
    print state
    print state['nunchuk']
und schaust mal was da vor dem Stacktrace an Ausgaben stehen.

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 16:08
von xam090
Es kommt noch immer eine Fehler Meldung:

Code: Alles auswählen

<type 'dict'>
{'led': 0, 'rpt_mode': 18, 'ext_type': 0, 'buttons': 0, 'rumble': 0, 'error': 0, 'battery': 112}
Traceback (most recent call last):
  File "nunchuk.py", line 25, in <module>
    print (type(state["nunchuk"]))
KeyError: 'nunchuk'

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 16:15
von BlackJack
@xam090: Was ja auch nicht weiter verwunderlich ist wenn man sich die Ausgabe des Wörterbuchs darüber anschaut: Der Schlüssel ist ja ganz offentlich nicht enthalten. Also was hast Du anders gemacht als der in der Ausgabe noch enthalten war?

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 16:27
von xam090
Danke.
Ich habe eine Website gefunden wo der Fehler erklärt wurde.
Ich poste gleich nochmal den gesamten Quelltext. :idea:
http://wiki.python.org/moin/KeyError

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 16:29
von xam090
Hier ist der fertige Quellcode:

Code: Alles auswählen

import cwiid
import time
import sys
 
print 'Press 1 + 2 on your Wii Remote now ...'
time.sleep(1)
 
# Connect to the Wii Remote. If it times out
# then quit.
try:
	wii=cwiid.Wiimote()
except RuntimeError:
	print "Error opening wiimote connection"
	sys.exit()
 
print 'Wii Remote connected...\n'
print 'Press PLUS and MINUS together to disconnect and quit.\n'
 
wii.rpt_mode = cwiid.RPT_NUNCHUK | cwiid.RPT_BTN
 
while True:
	time.sleep(1)
	if wii.state['buttons'] - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0:
		print '\nClosing connection ...'
    		wii.rumble = 1
    		time.sleep(1)
    		wii.rumble = 0
    		sys.exit()
	nunchuk = wii.state.get("nunchuk")
	acc = nunchuk.get("acc")#
	print(acc[1], acc[2])

Re: cwiid Nunchuck auslesen

Verfasst: Sonntag 3. März 2013, 16:52
von BlackJack
@xam090: Den `KeyError` hätte man auch in der Python-Dokumentation nachschlagen können.

Beim neuen Quelltext wirst Du einfach nur einen anderen Fehler bekommen, nämlich einen `AttributeError` weil `None` keine `get()`-Methode hat.