Знакомьтесь, 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. Подпишитесь на него там, чтобы увидеть его первыми.