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:
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
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
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.
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.