Go Down

Topic: Sketch para calcular posibilidades hexadecimales. PRONTO ->HEX. IR Remote CANON WL-V5 (Read 8245 times) previous topic - next topic

noter

Puedes poner un switch case dentro del for, y dejar la ejecución "normal" dentro de default:

Code: [Select]


for(unsigned n=0; n<256; n++){
switch n {
             case 0x25:
             case 0x88:
             // de la misma forma todos los códigos a excluir: case n:
           
             break;
             default:
                {
numero_prueba.cifra[0] = (byte)n;
numero_prueba.cifra[1] = (byte)~n;
irsend.sendNEC(numero_prueba.code, 32);
Serial.println(numero_prueba.code,HEX);
while(!Serial.available());
                }
}



Rokiee

De momento he encontrado muchos códigos:

He encontrado:

APAGAR/ENCENDER
ENFOCAR/DESENFOCAR
MOVIMIENTOS (tengo que ver cuales concretamente)
ENTRADA MENU
SALIDA MENU
BRILLO
REGRESO DE CAMARA A CENTRO (cuando la has movido y quieres llevarla a su lugar original).

Me ha costado la misma vida llegar a meter el IF dentro del FOR:

if (numero_prueba.code,HEX != 0x8160F00F || numero_prueba.code,HEX != 0x816028D7)

He sudado tinta con la (,HEX)

surbyte, lo que puede parecer evidente a mi me supone exprimirme el cerebro, pero así aprendo.

De esa forma voy a evitar que cuando llegue a los códigos de encender y apagar, los lance a la cámara y así puedo seguir viendo todos los códigos. Luego lo cambiaré para que cuando entre en el menú, ya no salga y así ver todas las opciones del menú.



Rokiee

Noter , me he exprimido para conseguir averiguar lo del IF, pero veo que con el SWITCH también era posible.

Creo que tendría que invitaros a unas cañas por Madrid.

Rokiee

Vale, no entró en menú pero se apagó la cámara.

La condición OR (||) ha hecho su función, mi cabeza no.

La cambio por AND (&&) para que ni entre en menú ni se apague.

Vaya tarde !!


Rokiee

Puedes poner un switch case dentro del for, y dejar la ejecución "normal" dentro de default:

Code: [Select]


for(unsigned n=0; n<256; n++){
switch n {
             case 0x25:
             case 0x88:
             // de la misma forma todos los códigos a excluir: case n:
           
             break;
             default:
                {
numero_prueba.cifra[0] = (byte)n;
numero_prueba.cifra[1] = (byte)~n;
irsend.sendNEC(numero_prueba.code, 32);
Serial.println(numero_prueba.code,HEX);
while(!Serial.available());
                }
}



Vale me mudo definitivamente al switch case, porque con el IF, si le meto más de dos && el tercero ya no lo comprueba.

 if (numero_prueba.code,HEX != 0x8160F00F && numero_prueba.code,HEX != 0x816028D7 && numero_prueba.code,HEX != 0x8160D827) {

Cuando llega a 0x8160D827 me apaga la cámara.

Se ve que sólo comprueba entre 2 condiciones.

Me mudo al SWITCH CASE.

Esto cada vez engancha más !!

surbyte

ve poniendo los codigos que descubres a ver si tienen un patrón

noter

En los case sólo pon dos dígitos hexadecimales. La penúltima pareja del comando.
Ejemplo: 0x8160D827
Solo pon 0xD8

Rokiee

Surbyte , ahora mismo tengo los códigos con los que ha reaccionado la cámara, algunos se ve claramente (ej. Movimientos, zoom) pero no estoy seguro de si han reaccionado levemente o no.

Como he evitado entrar en el menú, hay códigos que todavía me faltan , como por ejemplo, aquellos de arriba, abajo , izquierda y derecha dentro del menú.

Ahora voy a iniciar la fase 2, que va a ser modificar el Sketch, creando un array que contenga todos los códigos encontrados. Luego, cuando agraces del serial monitor introduzco la posición del array para que envíe ese código a la cámara. Así puefo enviarlo manualmente cuantas veces quiera y comprobar que dicho código hace exactamente lo que se supone.

De esa forma, tendré claro a que se corresponden.

He notado una cosa, y es que parece que las posiciones inversas (EJ. 81601EA5 y 8160A51E) en algún caso han reaccionado similar.

Cuando acabe la fase 2, volveré al Sketch anterior, omitiendo los codigos conocidos , accediendo al menú, e intentando averiguar los códigos que funcionen en el menú, para así tenerlos todos. Hay que tener en cuenta que el mando tiene números 0-9 y esos todavía no los he encontrado porque no he actuado dentro del menú.

Noter, gracias por el consejo de los case, ahora mismo había metido el hexadecimal entero, solo eran 3, pero con lo que pretendo hacer esa forma me simplificará mucho la tarea.

Si descubrimos la totalidad, seremos los primeros en internet en dejar el WL-V5 al descubierto y en hexadecimal.

Habrá créditos para todos, jajaja.



surbyte


Rokiee

Serás tu con ayuda de Noter
Tú por lo menos has estado aquí, te has molestado en buscarme mucha información, echarme alguna que otra bronca, y acompañarme en este viaje. Así que estoy muy agradecido.

Pero tranquilo que esto no ha acabado, jaja.

noter

Lo que dices sobre que la cámara reacciona igual a los comandos inversos no es descabellado (tiene cierta explicación "lógica"), y reduciría el número de opciones a buscar de 0 a 127 (la mitad), aunque tal vez exista la posibilidad de que se reciba mejor con el número "alto" (>7F) en primer o segundo lugar. Además, también es muy probable que los códigos válidos sean consecutivos, así que busca concienzudamente por los "alrededores" de los códigos que halles.

Rokiee

noter, perdona que te de la brasa.

Estoy un poco rallado intentando hacer una cosa, aunque tal vez mi planteamiento no sea el correcto.

Quiero meter en un ARRAY todos los códigos que sé que funcionan y los que "puede que funcionen"

La finalidad es que cuando meta un número a través del serial monitor, el Sketch coja el valor del número introducido, lo guarde en una variable, y luego lance la función IRSEND, llamando al array y cogiendo el código de dentro de sus valores y que corresponda al número introducido por el serial monitor.

Lo que quiero es poder probar de una forma fácil y cuantas veces quiera, cada uno de los códigos. Es decir, simular el mando, pero desde el serial monitor.

Tengo varios problemas por mi novatez con la programación.

- ¿Puedo crear un array ´unsigned long´ con los códigos hexadecimales directamente o por el contrario debo convertirlo a binario y almacenarlo en un array de tipo int para luego convertir su valor en otra variable?

unsigned long codigos[32]{HEX1, HEX2, HEX3,......};


- una vez que asocio a una variable el valor introducido por el serial monitor (resultado=serial.read() ) Se podría utilizar irsend.sendNEC(códigos[resultado], 32); ??????

Hay unas cosas en el código que me dijistes que no entiendo, no sé si tienes tiempo y ganas para explicarmelas.

Mira, este es mi Sketch con tu código:

#include <IRremote.h>

IRsend irsend;
#define LED 3
// #define REPEAT_TX  5

void setup() {
   union {                  <-- ¿Es esto una función llamada union? Veo que dentro creas el array, cifra de 4 elementos, pero nunca llamas a esta funcion. No entiendo el motivo de meterlo dentro de union si podría ir sin llaves directamente.
      byte cifra[4];
      unsigned long code; // Prefijamos los cuatro primeros dígitos (dos bytes)
   }
        numero_prueba;
   numero_prueba.code=0x81600000; El .code que hace exactamente? es otra variable o le pasa algún dato a la variable anterior?
   Serial.begin(9600);
   for(unsigned n=0; n<256; n++) {
        numero_prueba.cifra[0] = (byte)n; Aquí me pasa igual, me gustaría comprender exactamente la teoría del " . ".
   numero_prueba.cifra[1] = (byte)~n;
        unsigned n = numero_prueba.code;
          switch (n) {
            case 0x8160D728:
              break;
            case 0x8160D827:
               break;
            case 0x816028D7:
               break;
            default:
   irsend.sendNEC(numero_prueba.code, 32);
        irsend.sendNEC(numero_prueba.code, 32);
        delay(500);
        irsend.sendNEC(numero_prueba.code, 32);
        irsend.sendNEC(numero_prueba.code, 32);
        delay(500);
        irsend.sendNEC(numero_prueba.code, 32);
        irsend.sendNEC(numero_prueba.code, 32);
        Serial.println(numero_prueba.code,HEX);
        while(!Serial.available());
        Serial.read();
               

 
 }
}
}

void loop() {
}




noter

Bueno. Vamos por partes.

Un unsigned long (y cualquier tipo numérico) se almacena de igual forma en la memoria del arduino, independientemente de la forma en que se lo proporciones. Resumiendo: nosotros se lo podemos proporcionar al compilador de la forma que nos resulte más cómoda, pero el número es el mismo si decimos
unsigned long pepe = 0xFFFF que si decimos unsigned long pepe = 65535. El decimal, octal o hexadecimal son formas cómodas de expresar números para nosotros, pero el arduino realmente trabaja en binario.
Retomando tu pregunta, claro que puedes crear un array de unsigned long y asignarle directamente los códigos en hexadecimal. No obstante, tal como te dije, todos los códigos se pueden "resumir" en un solo byte, pues los dos primeros son fijos (id de dispositivo) y el último se puede calcular a partir del penúltimo (o viceversa). Así que yo utilizaría un array de bytes y construiría el número completo antes de enviar. Incluso sería factible enviar el byte de comando en hexadecimal (dos caracteres) o en decimal (tres caracteres) por puerto serie.

En cuanto a las preguntas sobre union, deberías echar un vistazo a algún manual de C/C++ y leer sobre las estructuras y uniones. Como resumen, te digo que una unión es una forma de hacer referencia a un espacio de memoria entendiéndolo como distinto tipo de variable. En este caso, puedo entenderlo como un unsigned long o como un array de cuatro bytes, y así puedo hacer referencia al unsigned int (numero_prueba.code) o a cualquiera de los cuatro bytes que lo componen (numero_prueba.cifra[0-3]).

Rokiee

Gracias noter. Ya he conseguido hacer el sketch para ir probando todos los códigos conseguidos hasta ahora.

Cuando tenga resultados, iré publicando para que quede en este post como historia.

Respecto al tema de union, volveré a revisarlo todo porque claro no me queda, pero por ahora, sigo con mi Sketch que ya me queda poquito.

Saludos y mil gracias!

Go Up