Paso 12: Acelerómetro bono!
Estuvimos muy cercanas con nuestros comandos, parece que nos deberíamos estar leyendo sólo 10 bytes. También parece que los datos realmente no cambian mucho excepto un poco más abajo...
El byte 7' th cambia un derecho mucho después de enviar eso bRequest 0x31 (movimiento del motor). ¿Eso implica que estos datos leer de alguna manera se ve afectados por el motor, posiblemente un byte de respuesta motor?
Extracción de un desmontaje del dispositivo (de iFixit) vemos que hay un 'Inclinómetro' / acelerómetro (Kionix KXSD9). La hoja de datos indica que se utiliza para la estabilización de la imagen, y tiene 3 ejes (X, Y y Z) con 10 bits de datos por eje.
Permite leer continuamente que los datos
importación usb.core
importación usb.util
Import sys
tiempo de importación
# encontrar nuestro dispositivo
dev = usb.core.find (idVendor = 0x045e, idProduct = 0x02B0)
¿# fue encontrado?
Si dev ninguno:
elevar ValueError ('dispositivo no encontrado')
dev.set_configuration()
Aunque la verdad:
# Obtener datos de brequest 0x32
RET = dev.ctrl_transfer (0xC0, 0x32, 0 x 0, 0 x 0, 10)
imprimir mapa (hexagonal, ret)
Sacudiendo el Kinect mientras se ejecuta el script verá claramente los cambios en los datos con el movimiento.
Para identificar los ejes de acelerómetro, girarla sólo de una manera en un momento y observe lo que cambia. También se puede ver cómo estos datos estan en bytes, pero los datos del acelerómetro deben ser que una palabra firmada porque hay gira de 0xfff7 a 0x0007 lo que indicaría un resultado negativo a la conversión positiva.
Podemos echar dos bytes en un valor firmado de 'mano' (en C es un poco más fácil, lo sabemos)
importación usb.core
importación usb.util
Import sys
tiempo de importación
# encontrar nuestro dispositivo
dev = usb.core.find (idVendor = 0x045e, idProduct = 0x02B0)
¿# fue encontrado?
Si dev ninguno:
elevar ValueError ('dispositivo no encontrado')
dev.set_configuration()
Aunque la verdad:
# Obtener datos de brequest 0x32
RET = dev.ctrl_transfer (0xC0, 0x32, 0 x 0, 0 x 0, 10)
#print mapa (hexagonal, ret)
x = (ret [2] << 8) | RET [3]
x = (x + 2 ** 15) % 2 ** 16 - 2 ** 15 # convertir a 16b firmado
y = (ret [4] << 8) | RET [5]
y = (y + 2 ** 15) % 2 ** 16 - 2 ** 15 # convertir a 16b firmado
z = (ret [6] << 8) | RET [7]
z = (z + 2 ** 15) % 2 ** 16 - 2 ** 15 # convertir a 16b firmado
imprimir x, "\t", "\t", y, z
Ahora al ejecutar la secuencia de comandos verás los datos firmados aparecen correctamente