Sdr приемник что это такое
Software Defined Radio — как это работает? Часть 1
Продолжая цикл статей про радио, есть смысл рассказать про последние достижения в этой области — Software Defined Radio. Я не знаю адекватного перевода термина на русский, поэтому оставим так, да и термин SDR уже прижился в технических и радиолюбительских кругах.
За последние 100 лет радио изменилось настолько, что вряд ли тогдашний инженер вообще понял бы, как это работает.
Мы все же попробуем разобраться.
История
Идея software defined radio базируется на двух китах:
Назвать точную дату, когда в продаже появились первые SDR-приемники, довольно сложно. Сама идея оцифровки радиосигналов звуковой картой существовала довольно давно — так например, декодировали RTTY или пейджинговые сообщения, но не было подходящих алгоритмов, чтобы объединить все это вместе.
Первая версия Winrad датируется 2007 годом, и выглядела она примерно так (можно обратить внимание на системные требования 🙂
Как можно видеть, интерфейс весьма минималистичный, но программа уже умела воспроизводить AM, FM, USB и LSB, и показывать спектр сигнала. По сравнению с шириной полосы обычного выхода для наушников любого приемника это был… ну почти прорыв. Разумеется, в проф. системах панорамные приставки существовали и раньше, но «простым смертным» оно было практически недоступно, а звуковая карта у каждого в ПК и так есть.
Типичным бюджетным решением для радиолюбителей были приемники Softrock — однодиапазонные приемники, содержащие переключаемый кварц, смеситель и выход на звуковую карту.
Разумеется, это было только начало. Появились приемники с перестраиваемой частотой, а всего за 2 года Winrad заметно эволюционировал, и в 2010 году выглядел уже так:
Стали появляться и профессиональные решения, тогда же в 2010 появился Perseus SDR — приемник с 14-битным DDC АЦП, частотным диапазоном 10КГц-30МГц и шириной полосы пропускания 1.6МГц (в принципе, параметры вполне достаточные и на сегодня).
Цена приемника составляла 825Евро, что для тех лет было не так уж мало.
Кстати, страница http://microtelecom.it/perseus/ существует до сих пор, и на ней также висят скриншоты под XP, хотя продается приемник или нет, непонятно.
Начало было положено, дальше уже как говорится, дело техники — стали появляться разные модели, чипы стали дешеветь и так далее. Следующим прорывом в любительской технике стало появление приемника на чипе rtl-sdr. Сообщение с форума radioscanner за 2012 год можно процитировать дословно, как говорится, не убавить, не прибавить:
Оказалось, что DVB донглы на базе чипа Realtek RTL2832U, рекламируемые иногда также как поддерживающие FM, DAB(+), способны передавать на компьютер поток 8ми битных квадратур при частоте дискретизации около 3-х MSPS.
Принимаемый диапазон ограничивается использованным в определенной модели донгла тюнером, например у Elonics E4000 от 64 до 1700 МГц. Этот тюнер используется также в FunCube донгле, только с дополнительным МШУ.
По этому поводу основан проект. Уже успешно были приняты TETRA (
430 МГц) и сигналы спутника Турaйя (
1550 МГц), что для 8-ми битных квадратур весьма и весьма неплохо.
В общем, как оказалось, дешевые USB-ТВ приемники ценой 10-20$ после замены драйвера могут отдавать IQ-поток, что позволяет использовать их с уже существующим программным обеспечением для SDR. Сами приемники выглядели вот так:
Первые 1-2 года толку от rtl-sdr было довольно мало — под них просто не было интересного софта. Потом появился SDR#, разные плагины, стало расти сообщество энтузиастов, и сейчас rtl-sdr наверное самый популярный (прежде всего, в силу цены) SDR-приемник. Современные версии RTL SDR V3 умеют принимать уже и КВ (хотя и с небольшой чувствительностью и динамикой), но при цене в 30$ и это весьма неплохо. Как работает RTL SDR на КВ, можно посмотреть на видео.
Виды SDR
Существующие SDR можно разделить на 3 вида:
— Уже устаревшие модели на базе звуковой карты — оцифровка сигнала в них происходит в ПК, а сигнал передается на линейный вход по аудиокабелю. Сейчас они давно сняты с производства, но иногда могут появиться на барахолке. Брать по большому счету, смысла никакого, разве что отдадут даром — цена хорошей звуковой карты превысит цену самого SDR. Интересующиеся «цифровой археологией» могут почитать сообщения на cqham за 2010 год о выборе звуковой карты для SDR.
— SDR, имеющие встроенный АЦП и передающие сигналы в ПК в цифровом формате. Это большинство современных устройств среднего ценового диапазона. Они построены по принципу гетеродинного приема, только после переноса частоты вместо НЧ-блока стоит АЦП. Такие приемники имеют ширину полосы пропускания от 2 до 10МГц, есть разные модели на разные частоты и диапазоны (rtl sdr, SDRPlay, Airspy). Недостаток любого супергетеродинного приемника — наличие зеркальных каналов приема — поскольку фильтры неидеальны, станции принимаются там где реально их нет. Даже если фильтры более-менее неплохие, сигналы мощных станций все равно могут «пролезать» и воспроизводиться в виде помех.
— DDC (direct down conversion) SDR. Это самая современная технология на сегодняшний день. Суть в том, что гетеродин здесь не нужен — сверхбыстрый АЦП с частотой оцифровки порядка 100млн семплов/с оцифровывает непосредственно входной сигнал с эфира, что позволяет (согласно теореме Котельникова/Шеннона) иметь прием до частоты, равной половине частоты дискретизации, т.е. в нашем примере до 50МГц. Битовый поток желающие могут прикинуть самостоятельно — на компьютер оно разумеется, не передается, а обрабатывается в быстродействующей ПЛИС прямо на плате, и нужная полоса (обычно до 6МГц) передается в компьютер. Такой приемник не имеет зеркальных каналов, и в нем все хорошо (кроме цены:).
Верхний предел частоты DDC-приемников обычно ограничен 30-50МГц, т.к. более быстродействующих АЦП в продаже либо нет, либо они стоят космических денег (кстати, сверхбыстрые АЦП вроде попадают в американские ограничения по поставке высокотехнологичных электронных компонентов в страны третьего мира, но это не точно). Их самого топового, что доводилось видеть в прайсах — Flex 6600 с 16bit 245.76Msps АЦП стоит порядка 4000$, т.е. им можно принимать в режиме DDC до частоты 122МГц. Вряд ли мы в скором времени увидим DDC-приемники до гигагерца, хотя хотелось бы. Есть ли что-то быстрее, например для военки — наверно есть, кто знает, напишите в комментариях.
Другой важный параметр — тип подключения. Большинство SDR подключаются по USB, но есть модели и с LAN-портом (Afedri, Colibri):
Это может быть удобно для организации удаленного приема или передачи — приемник или трансивер можно разместить на даче/в деревне, и использовать его из города. KiwiSDR делает даже готовые устройства, зайти на которое можно непосредственно через web-интерфейс. Свой приемник владельцы KiwiSDR даже могут «расшарить» другим, посмотреть список доступных устройств можно на https://sdr.hu.
Последний, но не менее важный параметр — разрядность АЦП. Дешевые RTL SDR имеют всего 8бит АЦП, и этого мало, приемник легко перегружается сильными сигналами, ему крайне желателен аттенюатор и преселектор. SDRPlay имеют 12-бит АЦП, более дорогие модели имеют 14-бит, что достаточно для большинства случаев. Топовыми являются 16-бит АЦП, и в принципе, не каждая антенна способна выдавать диапазон сигналов, способных перегрузить такой приемник.
И наконец, о ценах. Их диапазон весьма варьируется, от 30$ за RTL SDR v3, 150$ за SDRPlay RSP2 до 600$ за ELAD FDM-S2. SDR-трансиверы (способные работать не только на прием, но и на передачу) дороже, SunSDR2 стоит порядка 1500$, FLEX-6400 стоит 2000$.
Отдельно стоит упомянуть платы для цифровой обработки сигналов. Это например, HackRF, LimeSDR, USRP, Red Pitaya. Эти устройства изначально предназначались для опытов с радиосигналами в пределах «рабочего стола», и на дальний прием просто не рассчитаны — ни регулируемого усилителя, ни аттенюатора, ни фильтров в схеме зачастую просто нет. Ловить что-то они будут, но весьма плохо, либо потребуется «доработка напильником». Они также могут работать на передачу, но с мощностью порядка 100мВт (где «м» это милли а не мега;), и зачастую никакого софта кроме пары DLL и SDK для них просто нет.
О том зачем все это нужно, преимуществах и недостатках SDR, и о том, как получить данные из SDR с помощью Python, будет рассказано во второй части.
Software Defined Radio — как это работает? Часть 2
В первой части были описаны основные виды SDR-устройств и кратко были приведены их характеристики. Во второй части я расскажу подробнее о плюсах и минусах SDR, также будут приведены примеры использования этой технологии.
Продолжение под катом (осторожно, траффик).
Если кто пропустил первую часть, желательно начать с нее, чтобы лучше понимать о чем речь.
Преимущества SDR
Для начала поговорим о преимуществах SDR, о том, что они дают пользователю. Понятно, что приоритеты у всех разные, поэтому разные пункты собраны в перемешку. Какой из них «более главный» сказать сложно, да наверное и невозможно, каждый решит для себя сам.
Панорамный обзор эфира
Первое, и самое очевидное — SDR показывает панораму радиоэфира «как есть».
Это достаточно удобно, как в плане наглядности, так и в плане поиска новых сигналов. На экране сразу видно например, что какая-то станция работает справа на 100КГц выше по частоте, видны различные помехи, новые и особенно короткие сигналы, и пр. Сигналы с быстроизменяющейся частотой например, на обычном «классическом» приемнике или трансивере просто не видны, и человек даже не догадается об их присутствии.
Посмотреть как это выглядит и послушать что творится в эфире, может любой, открыв web-панораму на голландском SDR. Как пример картинки оттуда, хорошо видна работа ППРЧ (но это не точно).
Регулируемые цифровые фильтры и звуковые эффекты
Радиолюбители со стажем наверное помнят времена, когда узкополосные кварцевые фильтры докупались к радиостанциям отдельно, и стоили не таких уж малых денег. Еще хуже ситуация в дешевых бытовых приемниках — фильтры там попроще, и настроены вообще никак китайским рандомом, как повезет. Да и настроек в таких приемниках обычно только две — Wide и Narrow. В SDR все фильтры выполняются математически, поэтому любую ширину фильтра можно просто выбрать «мышкой» или задать в настройках. Прямоугольность фильтров тоже может быть практически идеальная — математически можно выбрать любой порядок фильтров, все ограничено лишь алгоритмом.
Аналогично могут задаваться настройки шумоподавления, коэффициенты АРУ и пр.
Кстати, некоторые аудиофилы считают что «обычные» аналоговые фильтры звучат теплее и ламповее лучше, мне сказать сложно. Возможно, вид цифровых фильтров и влияет на восприятие звучания, тут тоже есть поле для экспериментов.
Возможность измерений
SDR это довольно-таки точный измерительный прибор. Начиная от банального отображения уровней разных станций в децибелах, до оценки помех, качества сигнала и пр. Все недостатки своего или чужого сигнала отлично видны на спектре.
Для примера, на картинке виден сигнал FM-станций. Сразу видно кто где вещает, с каким уровнем, какие станции мешают друг другу.
Также можно использовать SDR как анализатор спектра.
Широкополосная обработка
Прием сигнала сразу широкой полосой в несколько мегагерц открывает удивительные возможности для обработки сигналов. Любители азбуки Морзе и радиосоревнований, например, могут декодировать позывные сразу в широкой полосе (хотя, по-моему, это неспортивно, но это другой вопрос).
Также можно создавать неограниченное количество «виртуальных приемников» в пределах полосы пропускания. Для примера показано декодирование радиолюбительских сигналов WSPR сразу на двух диапазонах с одного физического приемника.
С помощью SDR и Virtual Audio Cable пользователи с раздвоением личности могут слушать сразу две станции, одну в правое ухо, другую в левое 😉
Можно предположить, что в проф. устройствах обработка широкой полосы дает большие возможности по поиску, классификации, обнаружению и подавлению различных сигналов. Вероятно, технология активно используется в радарах и прочих устройствах.
Прием и передача практически любых видов модуляции
Обработка сигналов делается на ПК, поэтому вычислительные возможности ограничены лишь наличием нужных декодеров. AM, FM, WFM, DRM, DAB+, TETRA и много других страшных слов — практически для всех современных открытых протоколов можно найти декодер.
Что пока «не по зубам» SDR, это пожалуй GSM и WiFi, хотя и тут какие-то подвижки есть (Open BTS, WiFi Analyzer).
Что касается передачи, то владельцы URRP или LimeSDR могут, например, поэкспериментировать с DAB+.
Широкополосная запись и воспроизведение
Т.к. в SDR все данные пишутся изначально в цифре, нет проблем записать всю полосу сразу целиком, чтобы прослушать или проанализировать потом. В одной записи может содержаться сразу несколько радиостанций, которые можно прослушать точно также, как с реального приемника. Это чем-то похоже на RAW-файл с фотокамеры, где постобработку (баланс белого и пр) можно сделать уже после съемки.
По ссылке приведен пример записи с шириной полосы 760КГц, панорама которой выглядит вот так:
В записи можно найти сразу много чего — маяк точного времени, телеметрию, приводные маяки, вещательные станции. Открыть ее можно в Matlab бесплатной программе HDSDR. Недостаток здесь только один, это большой размер. Одна минута записи при таком битрейте занимает 350Мбайт. Но разумеется, при реальных записях нет смысла писать все подряд, можно выбрать ширину полосы в зависимости от задач.
Удаленная работа
Еще одно активно развивающееся направление. Некоторые SDR приемники и трансиверы имеют возможность удаленной работы — т.к. приемник доступен по IP-адресу, то нет принципиальной разницы, стоит он рядом на столе или в 100км на даче (разумеется, битрейт передачи нужно настроить в соответствии с шириной интернет-канала). Учитывая, что помех в городах все больше и больше, это может стать весьма актуальным.
Инженерные и исследовательские задачи
Разумеется, при наличии широкополосной записи и воспроизведения, открываются большие возможности для отладки разных сигналов, протоколов, тестирования методов ЦОС и пр. Специализированные девайсы для исследовательских целей (USRP) позволяют работать full duplex, также могут иметь несколько входов и возможность синхронизации, что позволяет тестировать такие алгоритмы как direction finding.
С помощью GNU Radio можно создавать и тестировать сложные системы обработки сигналов, используя большое количество готовых блоков.
Преимущества надеюсь, понятны, поговорим о недостатках.
Недостатки SDR
Только стационарная работа
Главный недостаток для большинства пользователей — SDR это фактически стационарный настольный прибор, брать его с собой весьма неудобно и некомфортно. В городах, увы, уровень помех зачастую зашкаливает, а портативных приемников с SDR и IQ-записью пока практически нет.
В последние годы стали появляться приемники и трансиверы, сделанные по SDR-технологии, но компактного и легкого устройства, которое можно было бы просто взять с собой, пока на рынке так и нет. Конечно, при желании можно взять с собой ноутбук, SDR, антенну, провода, адаптеры, powerbank, но все это достаточно громоздко и неудобно. Рынка портативных SDR-устройств пока де-факто не существует. Из исключений разве что RDR-Pocket, но его цена порядка 1500Евро, и он выпускается только под заказ. Современные технологии вполне позволяют делать такие устройства, но на них просто нет платежеспособного спроса.
Как очевидно из описания, хороший SDR — это достаточно дорогостоящий прибор. Сверхбыстрые АЦП и ПЛИС, малошумящие каскады на входе, многослойные печатные платы, качественные фильтры и пр — цена хороших DDC SDR начинается от 500$ и выше, и дешево такое никак не сделать. Профессиональные приемники (USRP, Winradio) стоят от 1500$ и выше.
Впрочем, подвижки тут тоже есть. Вполне неплохие приемники SDRPlay с диапазоном от 10КГц до 2ГГц продаются за 150$, и хотя это не DDC и АЦП всего 12бит, но для большинства задач приема его хватает. «Свистки» RTL-SDR за 30$ уже наверное есть у каждого радиолюбителя. Для любителей УКВ и обработки сигналов есть недорогие LimeSDR, которые при цене в 200-300$ покрывают диапазон до 6ГГц.
Сложная алгоритмическая часть
Понятно, что за внешней простотой и удобством «скрываются» серьезные алгоритмы цифровой обработки сигналов. За последние лет 10 создано большое количество разнообразного софта для SDR, и скорее всего обычному пользователю и не придется ничего дописывать. Но при желании что-то исправить или создать свое, это не так просто сделать, «порог входа» достаточно большой.
Энергопотребление и процессорные требования
Также очевидно, что ток потребления довольно высок, как и требования к CPU и видеокарте. Обычный «классический» радиоприемник может работать месяц от батареек, DDC SDR будет потреблять не менее 1-2А во время работы.
Заключение
В предыдущей части некоторые задавались вопросом, зачем это вообще нужно, надеюсь отчасти удалось ответить этот на вопрос.
Все что планировалось, в одну статью опять не влезло. В следующей части будет рассмотрен программный интерфес к SDR-приемнику на языке Python, и возможно, немного работы с GNU Radio.
Software Defined Radio руками шестнадцатилетнего подростка
SDR, или программно-определяемая радиосистема – это устройство для работы с радио, в котором работает мини-компьютер со специальным программным обеспечением. Он заменяет традиционные аппаратные компоненты: фильтры, усилители, модуляторы и демоуляторы. Это позволяет создать радиоприемник, работающий с самыми разными протоколами. Вообразите себе радиолу, которая кроме «ХитFM» может принимать аналоговое и цифровое телевидение, связываться по Wi-Fi, Bluetooth и GPS, а также засекать излучение пульсаров.
А теперь представьте себе американского девятиклассника, который решил сделать такую радиолу, заказал через интернет ПЛИС, радиомодуль, развёл шестислойную плату, а потом своими руками смонтировал на неё почти 300 компонентов. И через три ревизии это всё у него заработало!
Что такое SDR
Кому может понадобиться такая радиола? Радиолюбителям, которые здорово эволюционировали! Двадцать лет назад увлеченный человек покупал сложный приёмник и часами сидел в наушниках, вращая частоты в поисках интересных сигналов. В современном мире радиоэфир переполнен информацией, но вся она цифровая. Слушать в наушниках пакеты Wi-Fi не представляет никакого интереса. Сегодня радиолюбитель находит в эфире интересные цифровые радиостанции, а потом подбирает софт, который разбирает протокол передачи и преобразует информацию. К примеру, можно принимать данные телеметрии гражданской авиации – на основе такого рода информации от множества радиолюбителей по всему миру сайт flightradar публикует данные о воздушных судах.
Вы можете прямо сейчас своими глазами увидеть работу Software Defined Radio. Университет Твенте содержит увлекательный проект онлайн SDR-приёмника, который принимает сразу кусок спектра шириной в 29MHz, после чего радиолюбители могут параллельно прослушивать различные несущие этого диапазона. Каталог подобных радиопроектов собран на сайте
Большую роль в популярности любительского SDR играет небольшая стоимость минимального комплекта оборудования. Обнаружились недорогие TV-тюнеры, реализованные на Software-Defined Radio, и в интернете немедленно появились инструкции о том, как использовать такие тюнеры, чтобы прослушивать с их помощью не только телевизионный сигнал. Специализированный комплект на китайском рынке стоит всего 35$ правда, он приходит разобранным (в необходимости предварительно спаять и заключается его шарм) и поддерживает диапазон только 100KHz-1.7GHz. Конечно, аппетит приходит во время еды, и очень скоро радиолюбитель начинает смотреть в сторону оборудования, которое может принимать широкие частотные диапазоны на высокой скорости. Давайте рассмотрим, какие серьёзные приборы сейчас наиболее популярны.
Название | Диапазон | Макс. ширина канала | ADC Sample Rate | Цена |
---|---|---|---|---|
hackRF One | 1MHz — 6GHz | 20MHz | 20MSPS | $299 |
bladeRF x40 | 300MHz — 3.8GHz | 28MHz | 38.4MSPS | $420 |
USRP B205mini-i | 70 MHz — 6 GHz | 56MHz | 61.44MSPS | $750 |
LimeSDR (coming soon) | 100 kHz — 3.8 GHz | 61.44MHz | 61.44MSPS | $299 |
RTL-SDR (receive only) | 22 MHz — 3.8 GHz (24 – 1766 MHz для R820T2) | 3.2MHz | 3.2MSPS | $10 |
Per Vices Crimson | 0 MHz — 6 GHz | 1200MHz | 370MSPS | $6500 |
В двух словах: начинать знакомство с SDR можно с дешёвых вариантов типа RTL-SDR. Когда аппетит исследователя превысит небольшие возможности устройства, придётся искать замену подороже. Устройства типа Per Vices Crimson используются очень серьёзными специалистами, чьи компьютеры достаточно производительны для обработки таких потоков информации. LimeSDR на данный момент только-только закончил сбор средств на Kickstarter. Выглядит очень заманчиво: частота семплирования максимальна для USB3.0, а ширина канала достаточна для поднятия шести 10MHz сот LTE.
«Да что эти американские школьники себе позволяют!» — кричат в комментариях к статье Лукаса. Люди годами совершенствуют своё мастерство, а этот мальчишка сделал всё между уроками! Мы решили, что так это оставлять нельзя, и связались с Лукасом. В этой серии статей мы рассмотрим все аспекты создания подобного устройства, чтобы российские школьники перенимали опыт и делали не менее восхитительные вещи. Начнём с перевода на русский язык дневника Лукаса, в котором можно пронаблюдать ход проекта и его переживания в связи с ним. Затем мы разберём выбранные решения и попробуем изготовить такое устройство в российских условиях.
Разработка аппаратной части
Из дневника Лукаса Лао Байер
FreeSRP – доступная программно-определяемая радиосистема. Я ее разработал, потому что не нашел устройств с более высокой пропускной способностью, чем HackRF за 300$, но дешевле более производительной USRP за 700$. Некоторые компоненты еще требуют доработки, но система будет полностью соответствовать философии Open Source.
FreeSRP основана на трансивере Analog Devices AD9364. Ключевые возможности:
Несмотря на то, что есть другие альтернативы типа LimeSDR, я считаю, что FreeSRP будет востребован. Разработка, как и ожидалось, была невероятно познавательной.
Я начал работу над системой два года назад, летом 2014, когда мне было 16. На тот момент у меня не было опыта серьезной работы с железом, не считая низкопроизводительных плат для моего проекта High Altitude Balloon. Поэтому я понимал, что разработка FreeSRP будет непростой во всех аспектах: скоростные шины (100MHz), USB3.0, сигнальные дорожки с производительностью до 6GHz, сложные схемы питания с семью различными напряжениями… Очень хотелось собрать компактную систему на современных компонентах, так что пришлось познакомиться с такими компонентами, как BGA или QFN.
Сравните мою предыдущую плату и нынешнюю
Что и говорить, амбициозность проекта колоссальна. Однако, меня это нисколько не пугало, и я начал с чистого листа, исходя лишь из того, что я точно буду использовать трансивер AD9346, а мост между трансивером и USB3.0 реализую на ПЛИС. Недолгие поиски привели меня к Xilinx Artix 7 и контроллеру Cypress EZ-USB FX3. Эти игрушки показались мне оптимальными рещениями в плане цены.
На основе даташитов и референсных дизайнов я постепенно подготовил принципиальную схему, в которой решил вопросы по всем остальным компонентам. Для разработки я использовал Altium Designer. Хотя он и не open source, для меня это был наиболее интуитивно понятный пакет дизайна печатных плат. Многие его прекрасные функции весьма помогли мне в разработке: жизнь становится гораздо проще, если у тебя есть инструменты для отрисовки параллельных шин или дорожек с конкретным сопротивлением. Впрочем, когда я закончу устранение недочётов в дизайне, я перерисую всё в KiCad, чтобы большему числу людей было удобнее пользоваться моими разработками.
От дизайна к прототипу
Когда схема готова, пора выпускать шаблон платы. Для прототипа очень важна цена изготовления, и в мой бюджет еле-еле умещалась четырёхслойная плата от нашего американского сервиса OSH Park, который славится низким ценником на штучные заказы. Пусть у них есть только четырёхслойки, параметры изготовления весьма хороши — дорожки 5 mil с такими же промежутками, 10 mil для отверстий, а также прекрасный субстрат Isola FR408, от качества которого зависит радиосигнал.
Самое важное в разработке платы — удобно расположить компоненты. Я старался сделать так, чтобы соединения между компонентами были как можно меньше. Конечно, я изо всех сил стремился сделать плату минимального размера, что сильно влияет на цену. Я начал рисовать прохождения сигнала с одной стороны — от USB — и постепенно добавлял компоненты по ходу этого пути, пока не дошёл до радиоинтерфейса. Компоненты вне этого пути (регуляторы напряжения) были добавлены в оставшиеся свободные места на плате.
С первого раза, разумеется, вышло не идеально, и довольно долго я увлеченно переделывал плату, пока наконец не понял, что уже всё хорошо. Самая сильная боль наступила, когда я начал разводить BGA на своей четырёхслойной плате. Тем не менее, я справился. Дизайн прошёл все проверки, и я ещё на несколько раз проверил всё вручную. Совершенно не хотелось рвать на себе волосы после изготовления платы с ошибкой, потому что это, конечно, было бы уже никак не исправить.
Изготовление прототипа
После долгих треволнений, я всё же заказал три платы, и в январе 2015 они — УРА! — приехали. Я намеревался самостоятельно собирать плату, поэтому дополнительно заказал шаблон монтажа на пленке для паяльной пасты. Для монтажа я использовал галогеновую печку и контроллер собственной разработки.
Так как FreeSRP основан на двухсторонней плате, я сначала монтировал нижний слой. В дизайне я расположил снизу только маленькие компоненты: когда я буду запекать плату второй раз при монтаже верхнего слоя, маленькие компоненты удержатся на плате даже вверх ногами.
Частичная сборка
У меня было три печатные платы, поэтому я сначала собрал прототип лишь частично. На одной плате установил только регуляторы напряжения, и благодаря этому обнаружил проблему с регулятором на 1.8В. Ничего страшного, я заменил его внешним источником питания. А вот проблему с регулятором на 1.3В я устранить не смог, потому что здесь уже проблема заключалась в ошибке проектирования, так что в первой ревизии я не смог запустить радио.
На второй плате я собрал всю цифровую часть: USB и FPGA. Впервые мне довелось монтировать BGA, и я делал это вручную. После долгих часов напряжённого и кропотливого монтажа дорогущих компонентов без права на ошибку, я дрожащими руками аккуратно положил плату в печь. Ожидание было мучительным, и как же я ликовал, когда всё прошло идеально!
Первое включение
Конечно, я невероятно страшился первого включения платы. Хотя цепи питания были проверены на первой плате, я всё равно не исключал, что сейчас мои драгоценные компонентики вспыхнут синим пламенем. Возможно есть какой-то безопасный способ включать не тестированную плату. Мне ничего лучше не пришло в голову, как плавно повышать ток на блоке питания, и молиться, чтобы нигде не пошёл дым.
Тест на дым был пройден успешно, и лампочки загорелись. Ни ПЛИС, ни USB на ощупь не нагревались. Я подключил USB в компьютер, и операционка обнаружила чип Cypress. Затем я запустил приложения Xilinx, и они подключились к ПЛИС через JTAG. Похоже, всё заработало! Рассмотрев детальней, я конечно нашёл ошибку: криво развёл разьём USB3.0, так что заработала только вторая версия. Ничего страшного, начнём тестировать в таком виде, и исправим проблему позже.
Вторая ревизия
Во второй ревизии мне понадобилось устранить проблемы с питанием и разводкой USB3.0. В результате, я получил полностью рабочую цифровую часть платы, и пора было переходить к радиочасти.
Сначала я не стал трогать трансивер, и собрал все остальные компоненты. Параллельно, началась разработка программной части проекта. До этого я никогда не программировал ПЛИС, поэтому мне пришлось изучать Verilog с нуля. На этом этапе я решил реализовать параллельный интерфейс к USB-контроллеру. Хотя все части проекта были не тривиальны, разработка ПЛИС для меня стала самой жуткой частью проекта. Очень сложно найти документацию для чайников по использованию инструментов и IP-блоков. Сообщения, которые писала Vivado Design Suite, были для меня китайской грамотой, а включение готовых IP-блоков приводило к сотням непонятных уведомлений. Скорее всего, я просто не умею пока правильно готовить на этой кухне.Даже самые минимальные изменения в дизайне требовали мучительно долгого обсчёта программой, поэтому всё необходимо симулировать — а это еще больше усложняет вход в чудесный мир ПЛИС. А отладка! Без Integrated Logic Analyzer отлаживать что-либо совершенно невозможно, а он стал бесплатным только в 2016 году– до этого прайс был очень высоким. Поэтому пришлось при отладке передавать часть тестовой информации морганием диода, а часть — на ножки GPIO и смотреть сигнал осциллоскопом.
В вопрос по тактированию я вник до конца не сразу – только к третьей попытке пришло осознание, что тактовый сигнал трансивера нужно было обязательно завернуть в clock-inputs на ПЛИС.
Наигравшись с Verilog, я решил, что самое время впаивать трансивер. Я взял третью плату, вновь установил на неё три сотни компонентов, как и ранее, начав с нижней стороны. Но когда я паял верхнюю сторону, контроллер моей печки объявил забастовку и не выключил печь. Я не мог получать показания по температуре в печи, а контролировать агрегат удавалось только включая-выключая его или открывая дверцу. Никакие мои молитвы не помогли: на дорожках появилось КЗ. Я попытался починить, но тщетно: при включении ПЛИС нагревался. Увы, я только что сжег в печи четыре сотни баксов, и этот факт совсем не придавал мне уверенности.
Тем не менее, я был решительно настроен закончить проект, поэтому разбил копилку, вновь заказал компоненты и через несколько недель предпринял еще одну попытку всё собрать. Вы не представляете, как я потел в этот раз, словно в финале турнира по покеру! К счастью, всё прошло без сюрпризов.
Цифровая часть в новом прототипе работала идеально. А вот трансивер работать не хотел, его конфигурационный порт просто не отвечал. Потом я заметил, что трансивер на ощупь горячий. Почему он так нагрелся, было непонятно, ведь он должен спать без конфигурации. Я безуспешно пытался найти проблемы в питания. Излазил все схемы, перепроверил все на сто раз. И потом я обнаружил следующую вещь.
Оказывается, я по ошибке последовательно включил два резистора — 698Ом и 536ОМ (в сумме 1234Ом) вместо 14.3 килоомного резистора из документации! Я заменил резисторы, и чип перестал греться, но он всё равно не работал. Похоже, я его спалил.
В общем, в этот момент я решил, что сделано уже достаточно много для такого юного специалиста без глубоких знаний электроники, и пора проект отложить. Но у меня осталась работающая ПЛИС, поэтому я стал развлекаться с ней.
В результате долгих экспериментов, я прикрутил драйвер трансивера и справился с генерацией тестовых сигналов. У меня заработала цепочка передачи сигнала от ПЛИС к USB, так что дальше я мог управлять своей SDR с компьютера с помощью библиотеки на более знакомом мне C++. Затем я реализовал совместимость моей платы с GNURadio, так что теперь с этой платой могли работать все полезные программы, реализованные на базе GNURadio.
Третья ревизия
В какой-то момент я нашёл силы на ещё один рывок и сделал третью ревизию. Я исправил досадную ошибку с 14.3 килоомным резистором, соединил clock-inputs с FPGA, и заменил осциллятор трансивера на кристалл, чтобы упростить раздачу тактового сигнала и исключить дальнейшие проблемы.
Конечно, проект вышел за рамки срока и бюджета, но сейчас мне уже кажется, что иметь всего три ревизии до работающей платы — это совсем неплохо!
Также на этой ревизии я перешёл на шестислойную печатную плату. Прототипы стали стоить дороже, но расстояние между сигнальными дорожками значительно увеличились, и я достиг максимальной тактовой частоты в шинах.
Кроме того, я купил отличные шаблоны из нержавейки, которые, в отличие от каптоновых, гораздо проще использовать.
Раз софт у меня уже был готов, я сразу смог запустить трансивер на прием, и вот они долгожданные первые сэмплы в GNURadio!
Наконец-то вся тяжелая работа дала свои плоды. Еще через несколько недель я смог запустить передатчик, и убедился, что полнодуплексный режим у меня взлетел, пусть и не в полную ширину. И тут я нашёл новую проблему с усилком на передаче, поэтому сигнал получился очень слабым.
В любом случае, у меня есть полнофункциональная SDR-плата, ребята! Да, ещё много нужно доделать. Я хочу тщательно измерить производительность приемника и передатчика. Очень хочется запустить мелкосерийное производство, но перед этим мне нужно ещё немного оптимизировать дизайн и быть на 100% уверенным, что я не оставил в плате ещё каких-то сюрпризов.
Постановка задачи
Большое спасибо Лукасу за его подробный отчёт, а сейчас давайте рассмотрим его решения.
Итак, Лукас хотел сделать широкополосную программно-определяемую радиосистему с характеристиками лучше, чем у hackRF, и дешевле USRP. Давайте рассмотрим, как устроено оборудование конкурентов.
USRP
hackRF
Последнее изображение выглядит наиболее лаконично, однако все три устройства имеют одинаковую архитектуру: сигнал принимается из эфира, оцифровывается и передаётся в USB. Есть различия в деталях. В hackRF радиочасть реализована в виде нескольких компонент: сигнал после приёма с помощью миксера сдвигается в промежуточную частоту диапазона 2.3-2.7GHz, затем преобразуется в синфазную и квадратурную составляющую сигнала, которая уже оцифровывется. Другие устройства решают эту задачу одним компонентом — трансивером. Преобразование цифрового сигнала для передачи в USB, а также управление радиотрактом, осуществляется при помощи ПЛИС (FPGA) либо микроконтроллера.
Проектируя систему сверху вниз, мы разделим её на три части: RF, FPGA и USB, и сначала проработаем каждый блок по отдельности, а затем разберёмся, как связать их вместе.
RF-часть
Радиомодуль в такой системе — самое хрупкое дело. Дискретные биты должны превратиться в волну и с нужной мощностью полететь в антенну. Для этого раньше требовалась целая россыпь восхитительных штучек: фильтры, интерполяторы, дециматоры, цифро-аналоговые преобразователи, синтезаторы, миксеры и различные усилители. До сих пор существует класс людей, предпочитающих самостоятельно контролировать каждый аспект их радиомодуля и собирающих их из маленьких кусочков. Какое же решение предпочтёт школьник? Конечно, он будет рад, если один суперчип решит для него все эти проблемы. Вот какие есть варианты:
Как в hackRF
Майкл Оссманн, кстати говоря, тоже радиолюбитель, а не радиопрофессионал, и единственная причина, почему он не решил радиочасть в своём проекте в виде одного умного кусочка кремния — это доллары, которые для этого потребовались бы. Майкл выбрал компромисс: он использует три кусочка кремния и экономит примерно половину стоимости, что делает hackRF таким доступным по цене. Радиосигнал в hackRF приходит на RFFC5071, который понижает частоту до
2.5GHz (это называется LO-синтез), затем этот сигнал попадает в узкополосный трансивер MAX2837, превращается в baseband и в таком виде идёт в MAX5864 — это как раз цифро-аналоговый (и обратно) преобразователь.
AD9364
Analog Devices выпускают отличные трансиверы, которые часто используются в различных SDR-проектах. Выше на схеме видно, что такой чип, к примеру, комфортно себя чувствует на устройствах USRP. У производителя можно купить чип на демонстрационной плате AD-FMCOMMS4-EBZ, которая в принципе является готовой примитивной SDR.
LMS6002D
Чипы Lime Micro используются во множестве систем (bladeRF, например), в том числе и в российской SDR-разработке umTRX, а в этом году они замахнулись на собственную SDR-систему и успешно собрали на Kickstarter средства для запуска LimeSDR в продакшн. В целом, Лукас вполне имел право использовать этот чип в своей работе, он прекрасен, и главный его недостаток — диапазон принимаемых частот вполовину уже, чем у AD9364.
Поэтому в итоге Лукас выбрал вариант с AD9364, и немедленно заказал его.
Выбор FPGA
Самое сложное при выборе ПЛИС — это определиться Altera или Xilinx. Эти компании словно Sony и Nintendo производят одинаково крутое железо, и дьявол лишь в деталях. Какая же разница между Altera и Xilinx?
Altera славится очень долгой поддержкой своих микросхем. Среда разработки Xilinx Vivado работает только с последней (седьмой) серией микросхем, тогда как Altera’s Quartus поддерживает даже Flex 10K, которому пятнадцать лет исполнилось с момента первого выпуска. На момент старта проекта, софт для отладки Xilinx стоил 700$ (и стал бесплатным только в этом году), а у Altera он бесплатен. IP-блоки (готовые программные библиотеки) в Altera можно попробовать во время демо-периода с ограничениями. В итоге, для новичка-любителя Altera выглядит предпочтительней. Зато в Xilinx умнее DSP часть, в ней есть не только умножение (как в Altera), но и предсложение с аккумулятором, что уменьшает количество необходимых логических блоков для решения задачи.
Но Лукаc выбрал Xilinx. Он утверждает, что из-за цены, но я думаю, что наугад (сравните, Xilinx Aritx-7 и Altera Cyclone V).
Как выбрать конкретную модель микросхемы у Xilinx? Два года назад выбор стоял между Spartan-6 и Artix-7, которые считаются low-cost предложением Xilinx. Spartan-6 отпадает, потому что его не поддерживает программное обеспечение Vivado.
Все BGA семейства Artix-7 совместимы что называется pin-to-pin, поэтому дальше Лукас просто ткнул в модель 50T, решив определиться с конкретной моделью, когда софт будет готов и точно определятся требования к производительности микросхемы.
Какие FPGA используют в других аналогичных проектах?
SDR | Модель FPGA | Logic Cells |
---|---|---|
USRP B200 | Xilinx Spartan 6 LX150 | 150k |
USRP B210 | Xilinx Spartan 6 LX75 | 75k |
bladeRF x40 | Altera Cyclone 4 | 40k |
bladeRF x115 | Altera Cyclone 4 | 115k |
hackRF | CPLD | xx |
Автор hackRF не стал ставить FPGA, а выбрал более дешёвую технологию — CPLD, что является, скажем так, упрощённой версией FPGA. В результате, он практически ничего полезного не может в ней делать и вообще планирует исключить ПЛИС из своего дизайна, переведя управление трансивером на чип USB-контроллера.
USB3.0
Осталось определиться с решением для USB3.0. Самое популярное решение здесь — микроконтроллер Cypress FX3, и сложно придумать причины не использовать его. Тем не менее, рассмотрим альтернативы.
Первым на ум приходит FTDI FT60x — микроконтроллер в корпусе QFN. Компания FTDI знаменита тем, что любит выпускать драйвера, которые намеренно убивают твой чип, если он является подделкой. Если для USB2.0 чипы этой компании считались стандартом де-факто, то в USB3.0 они, к сожалению, упустили свой рынок таким странным отношением к оборудованию конечного пользователя и низким качеством софта.
Другой вариант — взять трансивер от Texas Instruments TUSB1310A, а MAC-уровень реализовать в ПЛИС. Трансивер стоит на 20$ дешевле, чем микроконтроллер от Cypress FX3, и я затрудняюсь прокомментировать, почему Лукас не сделал именно так.
Изготовление печатной платы
Если вам больше хочется программировать, чем развлекаться с паяльником, я бы рекомендовал делать прототип на готовой плате. Хороший список готовых плат на разных ПЛИС можно найти на специальном сайте. Для этого конкретного проекта есть идеальный вариант готовой платы с USB3.0 и FPGA Artix 7 остаётся только скоммутировать трансивер и можно немедленно приступать к экспериментам.
Однако, Лукасу в этом проекте были интересны все этапы. Более того, он даже монтировать плату хотел сам. Прототипы Лукас изготовил в OSH Park — это очень популярный сервис среди американских студентов. Цена у них идёт от площади платы (10$ за квадратный дюйм), и с учётом расположения в США вся процедура занимает весьма короткий промежуток времени. Однако, сейчас, когда на плату есть заказы и её нужно изготавливать десятками, имеет смысл поискать самый оптимальный вариант для её изготовления. Ниже в таблице я привёл сравнение российских и зарубежных сервисов по изготовлению плат без монтажа на них.
Сравнение цен на изготовление печатной платы. Требования:
Предприятие | Стоимость за пять штук шестислойки | Пять штук четырёхслойки |
---|---|---|
OSH Park | Шестислойную не делают | 123$ за три штуки, опт — от 150 квадратных дюймов |
PCB tech | 614$ | — |
Резонит | 153$ | — |
EasyEDA | 284$ | — |
seeedstudio.com | 158$ | — |
pcbwing | 348$ | 299$ |
PCB Offshore | 280$ / 4pcs | 140$ / 4pcs |
PCBCart | 191$ | 93$ |
Часть российских заводов ответили отказом или выставили заградительные цены: не хотят связываться с мелкосерийным заказом. Хочу обратить внимание, что при текущем курсе доллара услуги российской компании Резонит оказываются даже предпочтительней китацев. Плюс, они готовы сами смонтировать платы, если вы предоставите им комплектующие. На данный момент, из этого списка я лично работал только с EasyEDA, и нареканий нет. Цены Резонита приятно удивили Лукаса, и сейчас мы планируем разместить там заказ платы по его проекту. Когда у нас всё получится, я обязательно расскажу вам детали взаимодействия с заводом, а также подготовлю статью о процессе проектирования печатной платы и подготовке проекта к изготовлению.
Пишем ПО
Из дневника Лукаса Лао Байер
Чтобы эта плата начала приносить пользу, необходимо разработать несколько компонент:
Для персонального компьютера я написал C++ библиотеку на основе libusb. Однако, чтобы не изобретать велосипед, я решил интегрироваться в какой-нибудь популярный фреймворк, и очевидным выбором была GNU Radio.
Сначала я собирался просто написать собственный блок для GNU Radio, но затем я натолкнулся на проект gr-osmosdr, который осуществляет поддержку многих популярных SDR. В комплекте с ним идёт анализатор спектра, генератора сигнала. Плюс, эта библиотека уже используется другими приложениями (например, Gqrx, AirProbe/gr-gsm). Соответственно, если я сделаю патч в этот проект, то моя плата автоматически появится в этих приложениях.
Потому я скопировал себе актуальную версию gr-osmosdr, и дальше просто смотрел какие правки делались для поддержки других SDR. В итоге, потребовались очень небольшие правки, чтобы библиотека увидела мою плату. Дальше появились функции для настройки частоты, ширины спектра и т.д. Ключевая функция — work — производит или потребляет данные из потока GNU Radio. Сначала я реализовал простую очередь, чтобы как можно быстрее начать играть с платой, но, конечно, это неэффективно. Сейчас я обновил алгоритм и сделал, как делают все папы: через обратные вызовы и синхронизацию с помощью условных переменных
В общем, теперь для работы с моей платой через gr-osmosdr нужно просто указать аргумент freesrp.
Проверяем корректность потока данных
Я начал баловаться с GNU Radio начиная со второй ревизии моей платы, когда трансивер ещё не очень-то работал. Я просто посылал сигнал и разворачивал его обратно в приёмный тракт. Так я мог проверить, что в цифровой части платы ничего не искажается.
Чтобы проверить частоту дискретизации платы, я гнал сигнал из блока GNU Radio «probe rate», а на ПЛИС собрал простой счётчик:
Сигнал генерируется в ПЛИС и принимается в GNU Radio. Частота дискретизации вбита прямо в код. Получаемая частота дискретизации выводится в отладочное окно.
Дальше тестировал цепь передачи сигнала. Теперь сигнал генерируется в GNU Radio и сливается в (sink block).
Теперь проверяем, что ПЛИС правильно декодирует данные: драйвер должен возвращать 32-битное слово, в котором будет два 12-битных сэмпла (I и Q) и выравнивающая пустота. С помощью программы Integrated Logic Analyzer я мог получить доступ к 12-битным сэмплам в ПЛИС и сравнить их с тем, что я вижу на моём компьютере.
I и Q сигналы на конце цепочки передачи данных в ПЛИС.
GNU Radio генерировал синусы и косинусы, но данные где-то портились. В итоге оказалось, что ошибка была в моей библиотеке freesrp, она неправильно форматировала данные. Когда я её починил, то собрал петлю в ПЛИС:
И всё почти работало. Только некоторые сэмплы терялись и заменялись на нули. На следующей картинке мы видим сгенерированный синий сигнал I, красный Q и сигнал, который прилетел обратно — зелёный I и чёрный Q:
Периодичность потери сигнала натолкнула меня на мысль, что проблема где-то в моём конечном автомате, который управляет чтением и записью в USB-контроллер: переход в состояние записи происходило за цикл до попадания данных в регистры, которые нужно записать. Я сдвинул этот переход на один такт, и всё стало гладенько:
На третьей ревизии платы я повторил все тесты, чтобы убедиться в полной работоспособности. Для лупбэка я использовал внутреннюю петлю AD9364, таким образом покрыв тестом всю цифровую часть прототипа.
Весёлые эксперименты с GNU Radio
Теперь мне очень хотелось попробовать декодировать реальные сигналы. Первыми моими жертвами стали GSM и Zigbee, потому что для них есть готовые библиотеки gr-gsm and gr-ieee802-15-4.
GSM
Внешние модули GNU Radio собираются через cmake, потому всё просто:
В пакете gr-gsm идёт некоторое количество пробных приложений. Самые интересные — grgsm_scanner and grgsm_livemon. С помощью первого можно поискать GSM вещание и вычленить из них какие-то идентификаторы, а также получить список базовых станций.
Поглядите, кстати, я в качестве аргумента указываю код своей платы freesrp — и всё работает. Это очень приятное чувство.
Второе приложение позволяет настроиться на один из GSM каналов, расшифровать данные и отправить их в твою локальную сеть, где их можно послушать через Wireshark. Я добавил в программу модуль gr-fosphor, чтобы скриншот стал более красочным:
802.15.4 (Zigbee)
У меня дома было несколько XBee модулей, и я решил с ними взаимодействовать. На этом примере я хотел проверить отправку данных.
Установка модуля настолько же проста, как и в случае с gr-gsm. Примеры, которые идут с библиотекой, сделаны для коммуникационного стека Rime, поэтому я отрезал от него всё, что не касается самого Zigbee, и добавил блок TCP Server, чтобы можно было по локальной сети подключаться и отправлять данные:
Для примера я написал два Python-скрипта: один подключается к XBee через USB, а другой цепляется на TCP порты в GNU Radio. И затем я просто передавал текстовые сообщения через протокол 802.15.4, как в чате.
О разработке драйвера
Дизайн ПЛИС и USB-контроллера
Сейчас моя ПЛИС ничего особого не делает, кроме как служит интерфейсом между трансивером и USB. Из-за простоты реализации, я запустил на MicroBlaze драйвер от AD9364, который производит настройку и калибровку. Драйвер взаимодействует с USB через UART. Вскоре я перенесу этот драйвер на контроллер USB.
AD9364 выдаёт семплы в 12-битный порт чередуя I и Q. Есть ещё один 12-битный порт, куда надо отправлять исходящией I\Q значения. Так же трансивер предоставляет DDR-клок в зависимости от выбранной частоты дискретизации. Во входной сигнальной цепи происходит обратное перемежение и складывание в 24битную очередь.
В контроллере USB есть механизм DMA, куда ПЛИС может напрямую писать (и оттуда же читать) данные через 32битную шину. Поэтому когда в очереди ПЛИС накопилось достаточно данных, а FX3 готова к приёму, конечный автомат перебрасывал данные.
Сейчас я использую только 24 бита из доступных 32. Влезает один I\Q семпл, и остальные 8 бит я просто отбрасываю. Но для полнодуплексной передачи данных нужно будет использовать все 32 бита.
USB контроллер предоставляет следующие контрольные точки:
После включения FPGA можно настроить через INTERRUPT OUT.
Libfreesrp
Библиотека взаимодействия с FreeSRP очень проста. Для приёма и отправки используется интерфейс libusb. Это позволяет накапливать в очередь данные для оптимальной обработки операционной системой. Пользователь указывает колбэк, который будет вызван если поступили новые данные или буферы отправки освободились.
Планы
Дмитрий Стольников из gr-osmosdr уже связался со мной и предложил слить мои изменения в основную ветку библиотеки. Я вскоре закончу её полировать и сделаю это.
Когда я избавлюсь от MicroBlaze и перенесу драйвер на FX3, ПЛИС почти полностью освободится. Я бы хотел воспользоваться этим для экспериментов с обработкой сигналов в реальном времени прямо на ПЛИС.
Очень хочется получить более точные характеристики производительности радиочасти. Я не приблизился к этому ни на шаг, потому что у меня нет приборов, да и других дел полно.
Выпуск продукта
В апреле Лукас запустил краудфандинг для своего продукта и получил первую партию заказов на 20000$ (то есть, порядка пятидесяти экземпляров).
После отгрузки этой партии можно будет с уверенностью сказать, что прототип превратился в продукт, и это замечательный финал длинной трёхлетней истории шестандцатилетнего пацана, собравшего своими руками настоящее Software Defined Radio.