Paso 5: El código
Puede controlar el brazo con o sin el nunchuk. Nunca pude encontrar un programa que utiliza todas las cosas en el nunchuk (el joystick, los botones y el acelerómetro) así que quería hacer seguro de que había un programa que tenía todo en él y era bastante fácil de entender por lo que la gente podía hacer lo que querían con el wiimote y nunchuk. Para lograr esto me aseguré que cada botón o el sensor o el accesorio fue utilizado para que la gente puede personalizarlo para sus propios fines. Por esta razón, algunos del código pueden parecer redundantes, pero hay una razón detrás de él. Lo único que no usé fueron el altavoz (no se puede conseguir que funcione todavía) y el sensor de infrarrojos.
No dude en tomar este código y utilizarlo en cualquier forma que desee!
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ''' Primero tenemos que importar algunos archivos (estos archivos contienen todos los comandos necesarios para nuestro programa) #Give nuestro robot brazo un nombre fácil de modo que sólo necesitamos especificar toda la basura necesaria para la conexión de usb una vez #Set nuestro brazo transferencia protocolo a través del usb y definir un valor que podemos cambiar para controlar el brazo #Create variable de retraso que podemos utilizar (segundos) #Start movimiento #Stop movimiento
# | T| A| Y| L| O| R| | B| O| A| R| D| M| A| N| | | | R| P| I| | A| R| M|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Tenemos usb.core y usb.util - estos se utilizan para controlar el puerto usb de nuestro brazo
A continuación tenemos cwiid que se comunica con el wiimote
Y tenemos la biblioteca de tiempo que permite retardar o detener las cosas '''
importación de usb.core, usb.util, cwiid, tiempo
imprimir 'Asegúrese de que el brazo está listo para ir.'
imprimir ''
Armc = 1750
Brazo = ninguno
mientras que (brazo == None):
#This se conecta al usb
Brazo = usb.core.find (idVendor = 0x1267, idProduct = 0 x 0000)
#This a esperar a un segundo, y luego si el programa no se pudo conectar, nos dice e intenta otra vez
Armc = Armc + 1
Si (Armc == 2000):
imprimir «No se pudo conectar al brazo, comprobar sus conexiones.»
imprimir 'Programa continuará cuando se establece conexión...'
Imprimir "'
Armc = Armc/2000
continuar
Duración = 1
ArmLight = 0
Retardo =.1
Contador = 9999
DEF ArmMove (duración, ArmCmd):
ARM.ctrl_transfer(0x40,6,0x100,0,ArmCmd,1000)
Time.Sleep(Duration)
ArmCmd = [0,0, ArmLight]
ARM.ctrl_transfer(0x40,6,0x100,0,ArmCmd,1000)
#Establish una conexión con el wiimote
imprimir 'Conectado al brazo con éxito.'
Imprimir "'
imprimir 'Presione 1 y 2 en el wiimote al mismo tiempo.
#Connect para mote y si no conecta entonces lo nos dice e intenta otra vez
Time.Sleep(3)
imprimir ''
Imprimir "estableciendo conexión... 5'
Time.Sleep(1)
Imprimir "estableciendo conexión... 4'
Time.Sleep(1)
Imprimir "estableciendo conexión... 3'
Wii = ninguno
mientras que (Wii == None):
tratar de:
Wii = cwiid. Wiimote()
excepción RuntimeError:
imprimir 'Error al conectarse el wiimote, pulse 1 y 2.'
Imprimir "estableciendo conexión... 2'
Time.Sleep(1)
Imprimir "estableciendo conexión... 1'
Time.Sleep(1)
imprimir ''
#Once una conexión se ha establecido con los dos dispositivos que el resto del programa seguirá; de lo contrario, se mantenga tratando de conectar los dos dispositivos
#Rumble para indicar la conexión y enciende el LED
Wii.Rumble = 1 #1 = encendido, 0 = off
imprimir 'Conexión establecida'.
imprimir 'Pulse cualquier tecla para continuar...'
imprimir ''
''' Cada número gira en diodos LED en el wiimote
ex) if Wii.led = 1, entonces 1 LED
2 = LED 3 2 = LED 3 4 = LED 4
5 = LED 1, 3 6 = LED 2, 3 7 = LED 1,2,3
8 = LED 4 9 = LED 1, 4 10 = LED 2,4
11 = LED 12 1,2,4 = LED 13 3,4 = LED 1,3,4
14 = LED 15 2,3,4 = LED 1,2,3,4
Cuenta en binario a 15'' '
Time.Sleep(1)
Wii.Rumble = 0
Wii.LED = 15
# Fijar por lo que podemos decir cuándo y qué botones se empujan y hacen que se puede leer la entrada de acelerómetro
Wii.rpt_mode = cwiid. RPT_BTN | cwiid. RPT_ACC | cwiid. RPT_EXT
Wii.State
Aunque la verdad:
#This se ocupa con el acelerometro
''' crea una variable que contiene el valor del acelerómetro x
(cambia si mote es convertido o chasquear a izquierda o derecha)
plana o invertida = 120, si: 90 grados cc = 95, 90 grados c = 145'' '
Accx = (Wii.state['acc'][cwiid. X])
''' crea una variable que contiene el valor del acelerómetro y
(cambios cuando mote es señalado o chasquear hacia arriba o hacia abajo)
plano = 120, IR hacia arriba = 95, IR hacia abajo = 145'' '
Accy de la presión = (Wii.state['acc'][cwiid. Y])
''' crea una variable que contiene el valor del acelerómetro z
(Cambios con la rotación de motas de polvo, o cuando se tiró de espalda o encendió para arriba/abajo)
plano = 145, 90 grados cc o c o 90 grados arriba y abajo = 120, boca abajo = 95'' '
Accz = (Wii.state['acc'][cwiid. Z])
#This trata de los botones, le decimos a cada botón lo que queremos
botones = 'Wii.state['buttons]
#Get batería (como un porcentaje de 100):
#Just eliminar el frente de inn de signo de número
#print Wii.state['battery']*100/cwiid. BATTERY_MAX
# Si se pulsa el botón Inicio luego rumble y dejar de fumar, además de cerrar programa
Si (botones y cwiid. BTN_HOME):
imprimir ''
imprimir 'Cerrar conexión...'
ArmLight = 0
ArmMove(.1,[0,0,0])
Wii.Rumble = 1
Time.Sleep(.5)
Wii.Rumble = 0
Wii.LED = 0
Exit(Wii)
''' Brazo comandos definidos por ArmMove son
[0.1.0] Base gira hacia la derecha
[0,2,0] Gire Base izquierdas
[64,0,0] hombro para arriba
[128,0,0] hombro hacia abajo
[16,0,0] codo arriba
[32,0,0] codo abajo
[4,0,0] muñeca hasta
[8,0,0] muñeca hacia abajo
[2,0,0] agarre abierto
[1,0,0] agarre cerca
Luz [0,0,1]
Luz [0,0,0]
ex) ArmMove (duración en seconds,[0,0,0])
En este ejemplo sería detener todo movimiento y apagar el LED'' '
#Check para ver si se presiona otro botón
Si (botones y cwiid. BTN_A):
imprimir un prensado
Time.Sleep(Delay)
ArmMove(.1,[1,0,ArmLight])
Si (botones y cwiid. BTN_B):
imprimir 'Presiona B'
Time.Sleep(Delay)
ArmMove(.1,[2,0,ArmLight])
Si (botones y cwiid. BTN_1):
imprimir '1 presiona'
ArmMove(.1,[16,0,ArmLight])
Si (botones y cwiid. BTN_2):
imprimir 'Pulse 2'
ArmMove(.1,[32,0,ArmLight])
Si (botones y cwiid. BTN_MINUS):
Imprimir "menos presionado"
ArmMove(.1,[8,0,ArmLight])
Si (botones y cwiid. BTN_PLUS):
Imprimir "más presionado'
ArmMove(.1,[4,0,ArmLight])
Si (botones y cwiid. BTN_UP):
imprimir 'Up prensada'
ArmMove(.1,[64,0,ArmLight])
Si (botones y cwiid. BTN_DOWN):
imprimir 'abajo 'presionado
ArmMove(.1,[128,0,ArmLight])
Si (botones y cwiid. BTN_LEFT):
imprimir 'Izquierda presionado'
ArmMove(.1,[0,2,ArmLight])
Si (botones y cwiid. BTN_RIGHT):
imprimir 'Derecha presiona'
ArmMove(.1,[0,1,ArmLight])
#Here manejamos el nunchuk, junto con el joystick y los botones
while(1):
Si Wii.state.has_key('nunchuk'):
tratar de:
#Here son los datos para el stick del nunchuk:
#X axis:LeftMax = 25, media = 125, RightMax = 225
NunchukStickX = (Wii.state['nunchuk']['stick'][cwiid. X])
#Y eje: DownMax = 30, media = 125, UpMax = 225
NunchukStickY = (Wii.state['nunchuk']['stick'][cwiid. Y])
#The 'NunchukStickX' y las variables 'NunchukStickY' ahora almacenan los valores de palo
#Here que nos encargamos de todos nuestros datos para el acelerómetro
#The nunchuk tiene un acelerómetro que registra de manera similar para el wiimote, pero el rango de los números es diferente
#The X es: if 70 inclinado 90 grados hacia la izquierda y 175 if inclinado 90 grados hacia la derecha
NAccx = Wii.state['nunchuk']['acc'][cwiid. X]
#The Y rango es: if 70 inclinado 90 grados hacia abajo (los botones hacia abajo), y 175 if inclinado 90 grados (botones hacia arriba)
NAccy = Wii.state['nunchuk']['acc'][cwiid. Y]
#I todavía no entienden el eje z totalmente (en el wiimote y el nunchuk), pero lo puedo decir es el principal cambio proviene directamente tirando hacia arriba la Mota sin inclinarla
NAccz = Wii.state['nunchuk']['acc'][cwiid. Z]
#Make lo que podemos controlar el brazo con el joystick
Si (NunchukStickX < 60):
ArmMove(.1,[0,2,ArmLight])
Impresión izquierda' mover'
Si (NunchukStickX > 190):
ArmMove(.1,[0,1,ArmLight])
Derecho de mudanza de impresión
Si (NunchukStickY < 60):
ArmMove(.1,[128,0,ArmLight])
imprimir 'Mover hacia abajo'
Si (NunchukStickY > 190):
ArmMove(.1,[64,0,ArmLight])
imprimir 'Movimiento Up'
#Make lo que podemos controlar el brazo con funciones de inclinación
#Left a derecha
Si (Accx < 100 y NAccx < 90):
ArmMove(.1,[0,2,ArmLight])
Impresión izquierda' mover'
Si (Accx > 135 y NAccx > 150):
ArmMove(.1,[0,1,ArmLight])
Derecho de mudanza de impresión
#Up y abajo
Si (Accy de la presión < 100 y NAccy < 90):
ArmMove(.1,[64,0,0])
imprimir 'Movimiento Up'
Si (Accy de la presión > 135 y NAccy > 150):
ArmMove(.1,[128,0,0])
imprimir 'Mover hacia abajo'
#Here creamos una variable para almacenar el nunchuck el botón datos
#0 no = ningún botón pulsado
#1 = Z se presiona
#2 = C se presiona
#3 = ambos C y Z se presionan
ChukBtn = 'Wii.state['nunchuk']['buttons]
Si (ChukBtn == 1):
imprimir 'Z presionado'
ArmLight = 0
ArmMove(.1,[0,0,ArmLight])
Si (ChukBtn == 2):
imprimir 'Presiona C'
ArmLight = 1
ArmMove(.1,[0,0,ArmLight])
#If son presionado el led parpadea
Si (ChukBtn == 3):
imprimir 'presionan C y Z'
ArmMove(.1,[0,0,0])
Time.Sleep(.25)
ArmMove(.1,[0,0,1])
Time.Sleep(.25)
ArmMove(.1,[0,0,0])
Time.Sleep(.25)
ArmMove(.1,[0,0,1])
Time.Sleep(.25)
ArmMove(.1,[0,0,0])
Time.Sleep(.25)
ArmMove(.1,[0,0,1])
Time.Sleep(.25)
ArmMove(.1,[0,0,0])
#Any otras acciones que requieren el uso del Nunchuk de ninguna manera se deben poner aquí para que el manejo de errores funcionar correctamente
rotura
#This abajo abajo es la parte que nos dice si el wiimote no se conecta nunchuk
salvo error:
no imprimir 'nunchuk detectado'.
otra cosa:
Si (ArmLight == 0):
Si (Accz > 179 o Accz < 50):
ArmLight = 1
ArmMove(.1,[0,0,ArmLight])
Time.Sleep(.5)
Elif (ArmLight == 1):
Si (Accz > 179 o Accz < 50):
ArmLight = 0
ArmMove(.1,[0,0,ArmLight])
Time.Sleep(.5)
Si (contador == 10000):
no imprimir 'nunchuk detectado'.
Contador = contador/10000
rotura
Contador = contador + 1
rotura
Copie el código en un editor de python y luego guardarlo hacia fuera. Si el editor está todavía abierto a continuación, puede ejecutar el programa con F5. También puede ejecutar abriendo una terminal, navegar a la ubicación del programa y escribe: sudo python filename.py
Simplemente reemplace el nombre del archivo con el nombre real del archivo (todavía tienes que copiar el código en el editor y luego grabarla).
La foto de muestra: sudo Nunchuk_W_Arm.py, pero se olvidó de añadir el python allí. Que se supone que es: sudo python Nunchuk_W_Arm.py
Ahora estoy trabajando en una versión del programa que cuenta con una interfaz real con botones para controlar el brazo y esas cosas que muestran las golosinas del wiimote. Todavía puede utilizar el wiimote para controlar el brazo; sólo un programa más visual.