Saltar al contenido principal
Todas las publicaciones del blog

Conozca Yagi: un lenguaje de programación para radio

Describa una señal una sola vez y Yagi construye el receptor, las señales de prueba y el detector. Aquí le explicamos por qué lo estamos desarrollando.

Yagi es un lenguaje de programación para sistemas de radiofrecuencia, creado por 291 Group. Su nombre proviene de la antena Yagi-Uda, inventada por Hidetsugu Yagi y Shintaro Uda en 1926, y su idea cabe en una línea: describir la señal una sola vez.

El software de radio se escribe tres veces

Hoy en día, una nueva capacidad de radio suele escribirse tres veces: una en Python para probar la idea, otra en C++ para hacerla rápida y una más en un lenguaje de hardware para llevarla a hardware especializado. Las tasas de muestreo y las unidades viven en los comentarios y en la cabeza del ingeniero, así que una discrepancia produce basura silenciosa en lugar de un error. Cada nueva señal implica un demodulador hecho a mano, un generador de pruebas aparte y una lógica de detección aparte.

Describa la señal una sola vez

En Yagi, usted describe una señal una sola vez: cómo se modula, a qué velocidad llegan sus símbolos, cómo se construyen y verifican sus tramas. A partir de esa única descripción, Yagi genera el receptor, las señales de prueba y el detector, y ejecuta el mismo programa en una computadora portátil o en un sensor de campo, en vivo desde una radio o desde una grabación.

Este es un programa breve que sintoniza una radio en 433.92 MHz y decodifica un sensor meteorológico:

radio sdr = hackrf("one") {
  rx.freq = 433.92 MHz
  rx.rate = 2 Msps
}

signal WeatherSensor {
  modulation:  ook
  symbol_rate: 2.4 kbaud
  coding:      nrz
  frame:       preamble(0xAAAA) ++ sync(0x2DD4)
            ++ payload(bytes[8]) ++ crc16(poly: 0x1021)
}

sdr.rx
  |> lowpass(cutoff: 100 kHz)
  |> decimate(10)
  |> WeatherSensor.demod()
  |> each(frame => log(frame.payload))

Un lenguaje que sabe qué es una frecuencia

La radio está integrada en el lenguaje. Las frecuencias, las tasas de muestreo y las unidades físicas son tipos, al igual que los límites de las radios reales. Pídale a un receptor una frecuencia que no puede sintonizar, o conecte dos bloques que funcionan a tasas de muestreo diferentes, y Yagi lo detiene al compilar el programa, no en el campo.

Descripciones breves, resultados reales

  • Una descripción de LoRa de 28 líneas decodifica 196 de 205 grabaciones públicas, más que las 187 que decodifica un decodificador de referencia de 2 100 líneas escrito en C++.
  • Su biblioteca de dispositivos describe 95 dispositivos, cada uno verificado con una colección pública de pruebas compuesta por grabaciones reales.
  • Ya decodifica sensores de 433 MHz, transpondedores de aeronaves (ADS-B), anuncios de Bluetooth Low Energy y radio de voz push-to-talk.

Funciona con radios definidas por software comunes, como HackRF y RTL-SDR.

Siga a Yagi

Yagi tiene su casa en GitHub, en github.com/yagi-lang. Sígalo allí para verlo antes que nadie.