Перейти к основному содержимому
Все записи блога

Знакомьтесь, Yagi: язык программирования для радио

Опишите сигнал один раз, и Yagi создаст приёмник, тестовые сигналы и детектор. Вот почему мы его разрабатываем.

Yagi представляет собой язык программирования для радиочастотных систем, разработанный 291 Group. Он назван в честь антенны Yagi-Uda, которую изобрели Hidetsugu Yagi и Shintaro Uda в 1926 году, а его идея умещается в одну строку: опишите сигнал один раз.

Программы для радио пишут трижды

Сегодня новую радиофункцию обычно пишут трижды: сначала на Python, чтобы проверить идею, затем на C++, чтобы она работала быстро, и ещё раз на языке описания аппаратуры, чтобы перенести её на специализированное оборудование. Частоты дискретизации и единицы измерения живут в комментариях и в голове инженера, поэтому любое несоответствие незаметно порождает мусорные данные вместо ошибки. Каждый новый сигнал означает вручную собранный демодулятор, отдельный генератор тестов и отдельную логику обнаружения.

Опишите сигнал один раз

В Yagi сигнал описывается один раз: как он модулирован, с какой скоростью поступают его символы, как строятся и проверяются его кадры. По этому единственному описанию Yagi генерирует приёмник, тестовые сигналы и детектор и запускает одну и ту же программу на ноутбуке или полевом датчике, в реальном времени с радиоприёмника или из записи.

Вот короткая программа, которая настраивает радио на 433.92 MHz и декодирует сигнал метеодатчика:

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))

Язык, который знает, что такое частота

Радио встроено в сам язык. Частоты, частоты дискретизации и физические единицы являются типами, как и ограничения реальных радиоустройств. Запросите у приёмника частоту, на которую он не может настроиться, или соедините два блока с разными частотами дискретизации, и Yagi остановит вас ещё при компиляции программы, а не в полевых условиях.

Краткие описания, реальные результаты

  • Описание LoRa длиной 28 строк декодирует 196 из 205 общедоступных записей, больше, чем 187, декодированных эталонным декодером на C++ объёмом 2 100 строк.
  • Его библиотека устройств описывает 95 устройств, каждое из которых проверено на общедоступном тестовом наборе реальных записей.
  • Он уже декодирует датчики на 433 MHz, авиационные транспондеры (ADS-B), широковещательные пакеты Bluetooth Low Energy и голосовую радиосвязь push-to-talk.

Он работает с распространёнными программно-определяемыми радиосистемами, такими как HackRF и RTL-SDR.

Следите за Yagi

Дом Yagi находится на GitHub: github.com/yagi-lang. Подпишитесь на него там, чтобы увидеть его первыми.