Stap 12: Bonus versnellingsmeter!
We waren vrij dicht met onze opdrachten, lijkt het alsof wij slechts 10 bytes moet lezen. Ook lijkt het alsof de gegevens niet echt veel met uitzondering van een beetje verder naar beneden verandert...
De 7' th byte verandert veel recht nadat we het die bRequest 0x31 (motor beweging sturen). Dat betekent dat deze gegevens lezen een of andere manier beïnvloed wordt door de motor, eventueel een byte motor feedback?
Controleren van een traan-down van het apparaat (van iFixit) zien we dat er een 'inclinometer' / versnellingsmeter (Kionix KXSD9). Het gegevensblad aangeeft dat wordt gebruikt voor de stabilisatie van het beeld, en het heeft 3 assen (X, Y en Z) met 10 bits aan gegevens per as.
Laat die gegevens voortdurend te lezen
usb.core importeren
usb.util importeren
importeren van sys
importeren
# find onze apparaat
dev = usb.core.find (idVendor = 0x045e, idProduct = 0x02B0)
# was het gevonden?
als dev geen:
verhogen van de ValueError ('apparaat niet gevonden')
dev.set_configuration()
terwijl juist:
# Haal gegevens van brequest 0x32
RET = dev.ctrl_transfer (0xC0, 0x32, 0x0, 0x0, 10)
Print kaart (hex, ret)
De Kinect schudden tijdens het uitvoeren van het script zie je duidelijk dat de gegevens worden gewijzigd met beweging.
Ter identificatie van de versnellingsmeter assen, maar op één manier tegelijk draaien en noteer welke veranderingen. U kunt ook zien hoe deze gegevens wordt uitgedrukt in bytes, maar de versnellingsmeter-gegevens moet dat een ondertekende woord omdat er draait van 0xfff7 om 0x0007 die op een negatief naar positief conversie wijzen.
We kunnen twee bytes naar een ondertekende waarde gegoten door 'hand' (in C dit een beetje makkelijker is, we weten)
usb.core importeren
usb.util importeren
importeren van sys
importeren
# find onze apparaat
dev = usb.core.find (idVendor = 0x045e, idProduct = 0x02B0)
# was het gevonden?
als dev geen:
verhogen van de ValueError ('apparaat niet gevonden')
dev.set_configuration()
terwijl juist:
# Haal gegevens van brequest 0x32
RET = dev.ctrl_transfer (0xC0, 0x32, 0x0, 0x0, 10)
#print kaart (hex, ret)
x = (ret [2] << 8) | RET [3]
x = (x + 2 ** 15) % 2 ** 16 - 2 ** 15 # converteren naar ondertekende 16b
y = (ret [4] << 8) | RET [5]
y = (y + 2 ** 15) % 2 ** 16 - 2 ** 15 # converteren naar ondertekende 16b
z = (ret [6] << 8) | RET [7]
z = (z + 2 ** 15) % 2 ** 16 - 2 ** 15 # converteren naar ondertekende 16b
Print x, y, "\t", "\t", z
Nu wanneer u het script uitvoert u ziet de ondertekende gegevens correct worden weergegeven