Привет geektimes.

Недавно мне понадобился маломощный радиопередатчик для домашних экспериментов. Ничего подходящего под рукой не было, и тут я вспомнил описанный еще несколько лет назад на радиолюбительских сайтах метод — использовать в качестве передатчика непосредственно Raspberry Pi. Метод не нов и известен несколько лет, но похоже на geektimes он не описывался ни разу (или я плохо искал), да и опрос знакомых показал что о таком способе передачи никто не знает.

Исправим этот момент.



Тестирование того, как это работает, под катом.

Принцип


Современные компьютеры работают на весьма высоких тактовых частотах, а любой генератор фактически является маломощным передатчиком. Программно изменяя на Raspberry Pi частоту PLLD clock multiplier, можно прямо с ножки микропроцессора передавать радиосигнал. Метод впервые был опробован еще в 2013 году, после чего концепция получила развитие, и сейчас на Github можно найти несколько проектов: передавать можно разные типы сигналов, AM, FM, CW, SSB, WSPR, DCF77 и даже изображения в режиме «медленной развертки» (SSTV). Можно передавать даже Stereo FM с RDS, также в некоторых программах есть поддержка USB Audio, что позволяет использовать Raspberry Pi и как жучок радиомикрофон.

Разумеется, выходная мощность мала, и состав��яет примерно 10мВт. Но тем не менее, это работает. И параноикам на заметку: да, современный компьютер гипотетически может передавать радиосигнал прямо с платы. Правда дальность невысока, и дальше соседней комнаты такой сигнал не уйдет. Но тем не менее, как гипотетический способ утечки информации, такой способ имеет место быть.

Как это работает, приступим к тестированию.

Тестирование


В качестве подопытного, был взят Raspberry Pi3 и установлена программа rpitx. Вместо антенны на GPIO18 был надет кусок провода от макетной платы.

Фото
Как можно видеть, ничего лишнего :)


В качестве анализатора спектра использовался SDR-приемник SDRPlay v2. Им же проверялось, свободна ли тестируемая частота, нет ли там каких-либо сигналов или переговоров.

1. Режим VFO


В этом режиме передается простой сигнал на указанной частоте:

sudo ./rpitx -m VFO -f 235000000

Включение «передатчика» занимает несколько секунд, после чего на экране SDR виден пик примерно на указанной частоте.



Как можно видеть, помимо центрального пика, есть увы, множество побочных. Суть в том, что как и любой микропроцессор, Raspberry Pi в реале передает прямоугольный сигнал. Который имеет кучу гармоник, и вместо одной частоты в эфир летит реально целая куча мусора на всех кратных частотах. На SDR можно видеть, что помехи от передачи «летят» по всему спектру, вплоть до гигагерца.

Пр�� мощности 10мВт это не является проблемой, но из этого следует важное замечание: желание подключить к Raspberry Pi усилитель мощности было бы плохой идеей. Либо надо использовать ФНЧ, который будет отсекать более высокие частоты, но в таком случае теряется вся суть простоты идеи.

2. Режим Narrow FM


Эта же программа может передавать wav-файл в режиме Narrow FM, что может использоваться например, для прослушивания на портативных радиостанциях.

Вначале создаем файл с данными — конвертируем файл в IQ-данные:

./pifm sampleaudio.wav out.fm

Запускаем передачу:

sudo ./rpitx -m RF -i out.fm -f 235000000

Но как я не пробовал, звука так и не получилось, только «палки» на спектре. То ли программа не поддерживает Raspberry Pi 3, то ли в ней какая-то другая ошибка.

3. Режим WFM


Для передачи полноценного FM-радио есть программа PiFmRds, скачать которую можно с guthub. В отличие от предыдущей версии, программа использует другой пин, GPIO4, так что «антенну» пришлось переставить.

Запускаем программу из командной строки:

sudo ./pi_fm_rds -audio sound.wav -freq 87.0

Работает… но звук очень высокий и пищащий, по частоте выше раза в 2, как у персонажей в мультфильме Диснея. Методом научного тыка подбираю параметр ppm (коррекция), командная строка получилась такой:

sudo ./pi_fm_rds -audio sound.wav -freq 87.0 -ppm -320000

Частота передачи, как оказалось, тоже съехала почти на мегагерц, да и спектр вдвое шире, чем у обычной нормальной станции:



Звук по качеству, примерно как из телефонной трубки, но в принципе вполне разборчивый. Дальность на удивление, оказалась вполне неплохой, в пределах всей квартиры сигнал вполне уверенно ловился на обычный FM-приемник. И это причем, на совершенно несогласованную антенну, КПД которой крайне мал. Кстати, используя специальный метод узкополосной передачи WSPR и настроенные антенны, с 10мВт мощности радиолюбителям удавалось передать сигнал на расстояние до 2000км.

Выводы


Метод передачи скорее интересен, как proof of concept. Хорошего качества звука добиться так и не удалось, да и с частотами что-то непонятное, несовпадение весьма сильное. Но сам факт, что только программным методом, без какого-либо внешнего «железа» вообще, можно передавать сигналы в любом виде модуляции, с частотой до 500МГц, достаточно интересен. Ну и практически, если нужен простой и маломощный генератор, такой способ вполне может пригодиться.

Для тех, кто захочет повторить эксперимент, пара советов:

— Не использовать короткозамкнутые антенны — короткое замыкание пина испортит Raspberry Pi. Достаточно простого куска провода, в лучшем случае, дипольной антенны, длину «усов» можно посчитать в любом онлайн-калькуляторе.
— Не использовать усилитель мощности — сигнал содержит слишком много шумов, и будет создавать помехи другим службам.

При желании в youtube можно также найти множество видео-туториалов с демонстрацией, например вот этот.

Всем удачных экспериментов.