Passa al contingut principal

Clonar mando de un toldo Bauhaus E3430-GBR con arduino y RTL-SDR. Parte 1.

Parte 1, captura de señal con SDR.


Hoy os explico cómo he clonado un mando de un toldo con un arduino, su módulo de RF a 433 y un sintonizador SDR.


Partimos de que hace unos años compré un toldo motorizado para el patio en el Bauhaus.
El fabricante del toldo tal como aparece en el manual es depot18.de
https://www.bauhaus.se/media/pdf/Halvkassett.pdf
Este toldo incluye un mando a 433Mhz y en su momento intenté clonarlo por varios métodos, un mando específico para copiar otros mandos

 o un arduino con un módulo receptor de 433Mhz y un sketch diseñado para dicho propósito.

Las pruebas acabaron todas tal como empezaron, independientemente de la proximidad del mando, la longitud de la antena receptora, ...
Así que simplemente pensé que el mando realmente no emitía en la frecuencia de 433,92Mhz, seguramente la emisión estaría desplazada y por eso no lo pude clonar.

Pero hace un mes aproximadamente escuché en el podcast de programarfacil.com (el mejor sitio para empezar con arduino y el mundo maker) donde hablaban de SDR (Software Defined Radio) y salió también la palabra toldo (el podcaster también está interesado al tener una copia de su mando del toldo).

Solo faltaba ligar cabos y pedir una tarjeta DVB-T USB que sea compatible con SDR y con el sintonizador R820T2, a mí me han enviado una con el chip FC0012, a pesar de que la descripción decía R820T2.
Cosas de comprar en aliexpress y no leer los comentarios (no soy lo primero que le pasa).
El sintonizador R820T2 es mejor porque opera en un rango espectral superior al FC0012, pero los dos operan en la banda de 433.9Mhz que es donde emite el mando del toldo, suficiente para las pruebas que quería hacer.
En un principio lo que quería era averiguar si realmente emite en esa frecuencia o por el contrario la frecuencia de emisión está desplazada, pero las herramientas para SDR nos abren un mundo de posibilidades.
Especialmente el Universal Radio Hacker (urh) que permite capturar y analizar la señal capturada.
No os explico cómo instalar este software dado que en la red podréis encontrar varias formas de hacerlo. Yo lo he instalado en un Xubuntu Linux con pip (realmente he creado un entorno virtual de python, pero esto no es necesario)
Una vez instalado el urh (doy por supuesto que tenéis los controladores instalados y funcionando) lo primero que hay que hacer es ver en qué frecuencia capturaremos nuestra muestra. Hay que iniciar el analizador desde "File -> Spectrum Analizer":


Tenemos que ir pulsando el botón del mando cerca del dispositivo SDR para ver en la imagen en qué frecuencia central emite y seleccionar esta.
En mi caso, como mi tarjeta no parece gestionar demasiado bien la ganancia y el ruido es muy elevado, lo que he hecho es desconectar la antena y acercar el mando a la sintonitzadora.
Si tenéis mucho de ruido será más difícil trabajar con la señal y es posible que obtengáis valores incorrectos en la hora de procesarla (aquí el parámetro noise que veremos adelante nos puede salvar).
Bien pues, ya tenemos la frecuencia central de la señal, la ganancia, el ancho de banda ..., ahora hay que grabar la señal que emite nuestro mando, cerramos esta ventana y seleccionamos «File-> Record Signal»


Si nos damos cuenta, ya tenemos la frecuencia, ancho de banda y la ganancia que hemos seleccionado en la ventana anterior.
Le hacemos clic en el botón «Start» y empezamos a grabar, en mi caso tal como podéis observar en la imagen he pulsado el botón del mando del toldo 3 veces.
Procedemos a guardar el archivo que hemos grabado y cerramos la ventana.
Automáticamente nos aparecerá en la ventana principal la señal grabada para analizarla.


A pesar de que en la grabación hemos capturado las 3 veces que hemos pulsado el botón del mando, es muy importante tratarlas por separado para ver si realmente coinciden. Se puede copiar y pegar en un nuevo archivo sin problemas.
La modulación que emplea el mando de mi toldo es OOK (Donde-Off Keying) basada en modulación por amplitud.
La autodetección de parámetros va bastante bien y es un buen punto de partida, pero siempre es mejor acabar de ajustar los parámetros.
Si os fijáis en la imagen anterior la amplitud de la pulsación detectada es de 300, pero si ampliamos hasta ver las pulsaciones y la seleccionamos veremos que está alrededor de 350 (354 selected), tal y como se puede apreciar en la siguiente imagen.


Ajustamos este parámetro con el valor de noise, seguramente hará falta subirlo un poco para que no detecte el ruido como un valor 1 y ya tendremos la señal descodificada.
Los valores obtenidos para cada pulsación son:

  1111111111111100001101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101001001001100111111111111110000110100110110100110100110100100100100100110110100100110100110110110100110100110100110100100100110100100100110100100100110011111111111111000011010011011010011010011010010010010010011011010010011010011011011010011010011010011010010010011010010010011010010010011001111111111111100001101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101001001001100111111111111110000110100110110100110100110100100100100100110110100100110100110110110100110100110100110100100100110100100100110110110110100011111111111111000011010011011010011010011010010010010010011011010010011010011011011010011010011010011010010010011010010010011011011011010001111111111111100001101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101101101101
Cómo podemos apreciar hay 7 preámbulos y por tanto se envían 7 tramas de datos diferentes donde cada trama está formada por los valores agrupados de 110 y 100 que equivalen al uno y cero lógico. Esta codificación se aprecia bastante bien en la imagen anterior donde se ven pulsaciones largas y cortas y espacios largos y cortos.
1101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101001001001100
1101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101001001001100
1101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101001001001100
1101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101001001001100
1101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101101101101000
1101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101101101101000
1101001101101001101001101001001001001001101101001001101001101101101001101001101001101001001001101001001001101101101101
Si observamos detenidamente podemos ver que al final de cada trama hay un cero de más (1000 cuando tendría que ser 100) o le faltan ceros (1 cuando tendría que ser 100) debido a la interpretación que hace el programa. Corregimos pues estos valores y sustituimos el 110 por 1 y el 100 por 0 de forma que queda:

1011010100000110010111010101000100010001 HEX: B5065D5111
1011010100000110010111010101000100010001 HEX: B5065D5111
1011010100000110010111010101000100010001 HEX: B5065D5111
1011010100000110010111010101000100010001 HEX: B5065D5111
1011010100000110010111010101000100011110 HEX: B5065D511E
1011010100000110010111010101000100011110 HEX: B5065D511E
1011010100000110010111010101000100011110 HEX: B5065D511E
O sea, el que emite cada pulsación del mando es:
4 * (PREÁMBULO + B5065D5111) + 3 * (PREÁMBULO + B5065D511E)

Tenemos que hacer el mismo procedimiento para cada botón de nuestro dispositivo, es una tarea tediosa pero necesaria.
El siguiente paso es hacer la prueba práctica en nuestro arduino y el módulo RF de 433Mhz y enviar estas señales, pero esto ya es otra historia.

Comentaris