• Autor de la entrada:
  • Tiempo de lectura:12 minutos de lectura

Procesado de una señal de radiofrecuencia para extraer el mensaje codificado en ella. Decodificación de la señal de un transmisor NICE FLORETM utilizando Octave.

Tipos de transmisores

Una parte muy cercana a la vida cotidiana del espectro electromagnético se encuentra en torno a los 433MHz. En Europa multitud de aplicaciones se apoyan en esta frecuencia: mandos de garaje, llaves de coche, estaciones meteorológicas, sensores inalámbricos…

Transmisores 433MHz
Transmisores 433MHz para accionamientos
Bosch TPMS
Sensor de presión para neumáticos de Bosch®

El funcionamiento de estos dispositivos es muy sencillo y suele ser el siguiente:

  1. Se produce un evento, ya sea la pulsación de un botón o el avance de un tiempo determinado.
  2. Un microcontrolador codifica el evento en un mensaje puramente digital, que será una sucesión de un número determinado de bits.
  3. Mediante un generador de señal y una antena se emite el mensaje. Dependiendo del generador encontramos típicamente dos modulaciones en este tipo de dispositivos: ASK y FSK.
  4. Cualquier receptor sintonizado a esta frecuencia recibirá la transmisión, pero dicho receptor solo atenderá aquellas que le interesen. Para evitar suplantaciones de identidad o escuchas no deseadas, el transmisor podrá encriptar total o parcialmente la transmisión.

Transmisor NICE FLORE

Transmisor NICE FLORE

Este mando de garaje es un transmisor muy simple desde el punto de vista hardware. Consta de:

  • MCU: Microcontrolador de Microchip PIC16F526.
  • Generador RF: Circuito analógico que genera una señal de 433MHz, se activa mediante una señal digital.
  • Antena de bucle: Perímetro entre ~70mm y ~80mm.

Generador RF

Generador RF transmisor NICE FLORE

El generador de radiofrecuencia es un circuito que oscila a ~433MHz, pudiéndose activar y desactivar mediante una salida digital del MCU.

No es posible averiguar el valor de varios componentes SMD (tampoco aportaría nada). Por otro lado, será importante conocer la topología para saber donde y como capturar señales, de este circuito es posible esperar una modulación ASK, ya que simplemente se trata de activar o no el circuito, sin posibilidad de variar la frecuencia o sincronizar fase.

Finalmente, siempre es interesante conocer circuitos ya comercializados y (en principio) testados.

Antena de bucle NICE FLORE

El transmisor declara el uso de 433,92MHz en su carcasa. En su interior se encuentra una antena de bucle, cuyo perímetro corresponde a 1/8λ y un factor de velocidad entre 0,82 y 0,92.

Componentes transmisor NICE-Flore
Componentes transmisor NICE-Flore

Capturar datos

Para capturar datos es posible utilizar alguno de los siguientes métodos:

  • Receptor de 433MHz ASK, existen multitud listos para conectar a un un pin digital de una tarjeta de desarrollo.
  • Receptor SDR genérico, uno de los más populares es el RTL-SDR, y es también una de las formas más baratas de iniciarse en el mundo de la radiofrecuencia.
  • Capturar con el osciloscopio la señal emitida en el lado digital, antes del circuito RF.

Esta vez se utilizarán datos obtenidos con el último método, dejando para el futuro cómo utilizar datos generados por el RTL-SDR.

Al accionar el pulsador del NICE FLORE en el circuito generador de radiofrecuencia se observan varios grupos de señales. Cada grupo corresponde a un mensaje que será el que debe decodificarse. De las características del transmisor se espera un mensaje de 52 bits.

Transmision NICE-FLORE
Transmisión al pulsar el botón del NICE-FLORE

Para este ejemplo se ha utilizado el osciloscopio Smartscope de LabNation, el cual permite guardar los datos capturados a un fichero ‘.csv‘ sobre el que se trabajará posteriormente.

En paralelo también se ha capturado esta transmisión con un RTL-SDR Blog V4, y así comparar la decodificación mediante otro método.

Transmision NICE FLORE decodificada con SDR-RTL y Universal Radio Hacker
Transmision NICE FLORE decodificada con RTL-SDR y Universal Radio Hacker

El mensaje decodificado mediante el software «Universal Radio Hacker» es:

0x02BBD5E41D124

Script decodificador

Del CSV a memoria

Primero es necesario leer el archivo ‘.csv‘, existen varios métodos para leer un archivo de este tipo en Octave, se utiliza la instrucción «csv2cell(_path, _separator)» por su flexibilidad para extraer determinadas filas y columnas en muy pocos comandos.

data_path = 'DataTest/NICE_Cloned.csv';

csv_data = csv2cell(data_path, ';');

%Get Channel A LabNation Smartscope data
sampled_data = csv_data(2:end,6);
sample_time = csv_data(2,4);

%Clear memory
clear csv_data;

%Replace coma ',' by dot '.'
sampled_data = strrep(sampled_data, ',', '.');
sample_time = strrep(sample_time, ',', '.');

%Convert string to double
sampled_data = str2double(sampled_data);
sample_time = str2double(sample_time)

Analizando la transmisión

El primer procesado será una normalización de la señal respecto a la tensión, una vez hecho esto se plotea para poder inspeccionarla.

%Normalize data
sampled_data = sampled_data / max(sampled_data);

%Plot signal
t = (0:length(sampled_data) - 1) * sample_time;
plot(t, sampled_data)
xlabel("Time (s)");
ylabel("Signal (normalized)");
title("NICE FLOR transmit signal");

Del primer mensaje transmitido se extrae la siguiente información.

NICE FLORE Transmision explanation
Análisis de la transmisión de un NICE FLORE
  1. Los mensajes comienzan con un pulso de ~1460µS seguido de una pausa de igual duración.
  2. Un bit igual a ‘0’ será un pulso de ~470µS seguido de una pausa de ~990µS.
  3. Un bit igual a ‘1’ será un pulso de ~990µS seguido de una pausa de ~470µS.
  4. El mensaje finaliza con un pulso de ~1460µS.

Decodificando la transmisión

Teniendo toda la información necesaria, se analizan todas las muestras capturadas con una máquina de estados hecha script de Octave como el siguiente.

prev_bit_state = 0;
t0 = 0;
preamble = 0;
msg_started = 0;
message = int64(0);
message_length = 0;
pulse_high = 0;
pulse_low = 0;

for i = 1:length(sampled_data)
  %Transition to high
  if(sampled_data(i) > 0.5 && prev_bit_state == 0)
    prev_bit_state = 1;
    pulse_low = (t(i) - t0);
    t0 = t(i);
  endif

  %Transition to low
  if(sampled_data(i) < 0.5 && prev_bit_state == 1)
    prev_bit_state = 0;
    pulse_high = (t(i) - t0);
    t0 = t(i);
  endif

  %Pulse high more than 20ms is preamble
  if(preamble == 0 && pulse_high > 0.02)
    preamble = pulse_high
    pulse_high = 0;
    pulse_low = 0;
  endif

  %End of message
  if(msg_started == 1 && pulse_high > 0.0012)
    pulse_high = 0;
    msg_started = 0;
    printf("%X\n", message)
  endif

  %Message start
  if(pulse_high > 0.0012)
    msg_started = 1;
    message_length = 0;
    message = 0;
    pulse_high = 0;
    pulse_low = 0;
  endif

  %Process message
  if(msg_started == 1)

    %Bit = 0
    if(pulse_high < 0.0006 &&
       pulse_high > 0.0003 &&
       pulse_low < 0.0011 &&
       pulse_low > 0.0007)

      message_length = message_length + 1;
      pulse_high = 0;
      pulse_low = 0;
    endif

    %Bit = 1
    if(pulse_high < 0.0011 &&
       pulse_high > 0.0007 &&
       pulse_low < 0.0006 &&
       pulse_low > 0.0003)

      message_length = message_length + 1;
      message = bitset(message, message_length);
      pulse_high = 0;
      pulse_low = 0;
    endif

  endif
endfor

Conclusiones

Al ejecutar el script se obtiene el mismo mensaje que el obtenido con el software «Universal Radio Hacker«.

Transmisión NICE-FLORE decodificada mediante Octave
Transmisión NICE-FLORE decodificada mediante Octave

Referencias

Silicon Labs – AN639 – Design of printed trace differential loop antenna.