Estoy tratando de construir un simple basado en Arduino control remoto IR para un hoteles de juguete IR-helicóptero controlado (igual que este - que se llama "Diamond Gyro" o "Diamante de la Fuerza"). He decodificado el IR protocolo , excepto para el último par de bits. Estos últimos bits parecen ser un cheque o CRC, pero no he sido capaz de "crack".
Es bastante fácil de simplemente repetir un grabado de paquetes, pero quiero controlar totalmente el helicóptero. Eso significa que la ingeniería inversa de los bits de comprobación.
(Debo añadir que yo software por día, pero la electrónica es una a veces-afición, así que a lo mejor me estoy perdiendo algo muy básico.)
Los detalles del protocolo en la pregunta y la respuesta, pero estas son las bases:
- 32 bits de paquetes que abarcan múltiples valores individuales/comandos de longitud variable (más 1 bit de inicio/preámbulo, que no cuenta como datos)
- Los valores son "little endian" (MSB primero)
- Estoy seguro de que tenemos las primeras 22 bits asignada...
- ... pero los siguientes 4 bits son un poco misterioso, aunque sé que la finalidad de, al menos 2 de ellos.
- El pasado 6 bits no parecen ser una verificación de CRC o de algún tipo
He aquí un diagrama de
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
--+---------------------------+-----------+---+---+-+-+-----------
P| Yaw | Throttle | Pitch | T | C |X|X| CRC?
P: Preamble (always 1), T: Trim, C: Channel,
X: Either part of the channel data or the checksum.
Primero de todo, no estoy seguro de si el X
bits son parte del valor del canal, parte de la verificación, o algo más. Que siempre siga el canal de valor, aunque, por lo que es probable que el valor del canal es de 3 a 4 bits de ancho, aunque los 2 bits sería suficiente para los 3 posibles valores de canal.
En segundo lugar, no son los últimos 6 bits (marcado CRC?
anteriormente), los cuales son claramente algún tipo de verificación (y, de hecho, el helicóptero no responde si puedo cambiar cualquiera de los bits).
Así que, básicamente, hay un paquete de 24 al 26 de bits de datos, seguido por 6-8 bits de comprobación. Y realmente me gustaría calcular los bits de comprobación para que yo pueda componer paquetes de mí mismo.
A continuación, hay un montón de muestras de los datos binarios que estoy consiguiendo. El preámbulo "1" está siempre presente, y no creo que se considera como parte de los datos, pero he incluido todos modos, sólo en caso de que la clave de todo.
De nuevo, no sé si el X
bits son parte de los datos o la verificación. Dependiendo de la forma en que la verificación se calcula, podría ser que los primeros 1 a 2 bits de la verificación acaba de pasar para seguir el canal de valor. Pero es muy posible también que el valor del canal es de 4 bits de longitud, la incorporación de la X
bits. O se está en el medio con un X
bits de la parte de la canal, y el otro es parte de la verificación. No sé.
Si alguien sabe lo que la verificación es, o cómo se podría ir sobre la búsqueda de fuera, me encantaría saber. Me imagino que puedo fuerza bruta, pero incluso si esa es la única opción, me gustaría saber algunos consejos de cómo hacer mejor que.
El helicóptero es muy barato, así que dudo que haya algo realmente de lujo pasando.
Channel A
P Yaw Throttle Pitch Tr Ch XX Check Description
--------------------------------------------------------------
1 000100 10000100 000000 00 01 01 000101 Left Mid + throttle
1 000000 10000110 010001 00 01 01 010010 Left Max + throttle
1 100001 10000110 000000 00 01 01 100010 Right Mid + throttle
1 100100 10000100 010001 00 01 01 110100 Right Max + throttle
1 010001 00000000 001011 00 01 01 011111 Forward Min
1 010001 00000000 000000 00 01 01 010100 Forward Max
1 010001 00000000 011000 00 01 01 001100 Back Min
1 010001 00000000 100101 00 01 01 110001 Back Max
1 010001 00000000 010001 01 01 01 010101 Left Trim
1 010001 00000000 010001 10 01 01 100101 Right Trim
1 010001 00000011 010001 00 01 01 000110 Throttle 01 (min)
1 010001 00010110 010001 00 01 01 010011 Throttle 02
1 010001 00011111 010001 00 01 01 011010 Throttle 03
1 010001 00101111 010001 00 01 01 101010 Throttle 04
1 010001 00111110 010001 00 01 01 111011 Throttle 05
1 010001 01010101 010001 00 01 01 010000 Throttle 06
1 010001 01011111 010001 00 01 01 011010 Throttle 07
1 010001 01101100 010001 00 01 01 101001 Throttle 08
1 010001 01111010 010001 00 01 01 111111 Throttle 09
1 010001 10000101 010001 00 01 01 000000 Throttle 10 (max)
Channel B
P Yaw Throttle Pitch Tr Ch XX Check Description
--------------------------------------------------------------
1 000000 10000110 010001 00 00 10 010101 Left Max + throttle
1 100100 10000110 010001 00 00 10 110001 Right Max + throttle
1 010001 00000000 001001 00 00 10 011010 Forward Min
1 010001 00000000 000000 00 00 10 010011 Forward Max
1 010001 00000000 010111 00 00 10 000100 Back Min
1 010001 00000000 100110 00 00 10 110101 Back Max
1 010001 00000000 010001 01 00 10 010010 Left Trim
1 010001 00000000 010001 10 00 10 100010 Right Trim
1 010001 00000001 010001 00 00 10 000011 Throttle Min
1 010001 00110100 010001 00 00 10 110110 Throttle Mid
1 010001 01100111 010001 00 00 10 100101 Throttle High
1 010001 10001111 010001 00 00 10 001101 Throttle Max
Channel C
P Yaw Throttle Pitch Tr Ch XX Check Description
--------------------------------------------------------------
1 000000 10000101 010001 00 10 00 011100 Left Max + throttle
1 100100 10000101 010001 00 10 00 111000 Right Max + throttle
1 010001 00000000 001010 00 10 00 010011 Forward Min
1 010001 00000000 000000 00 10 00 011001 Forward Max
1 010001 00000000 010111 00 10 00 001110 Back Min
1 010001 00000000 100110 00 10 00 111111 Back Max
1 010001 00000000 010001 01 10 00 011000 Left Trim
1 010001 00000000 010001 10 10 00 101000 Right Trim
1 010001 00000001 010001 00 10 00 001001 Throttle Min
1 010001 00110100 010001 00 10 00 111100 Throttle Mid
1 010001 01100110 010001 00 10 00 101110 Throttle High
1 010001 10000101 010001 00 10 00 001101 Throttle Max