Недавно мне понадобился маломощный радиопередатчик для домашних экспериментов. Ничего подходящего под рукой не было, и тут я вспомнил описанный еще несколько лет назад на радиолюбительских сайтах метод — использовать в качестве передатчика непосредственно 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 можно также найти множество видео-туториалов с демонстрацией, например вот этот.
Всем удачных экспериментов.
Комментарии (27)
Psychosynthesis
15.10.2017 05:06Прикольно.
По поводу усилителя — ставите согласующий и\или полосовой фильтр и можно даже с усилителем. Это всего-то три-четыре дополнительных элемента.DmitrySpb79 Автор
15.10.2017 10:04+2Да, можно конечно, просто есть ли смысл. Ну и полосовой фильтр на сотни мегагерц, без опыта и приборов сделать, не такая уж простая задача.
А так да, есть даже готовые шилды для WSPR в продаже: www.tapr.org/kits_20M-wspr-pi.htmlPsychosynthesis
15.10.2017 10:21В данном случае, насколько я понимаю, выходным звеном служат транзисторные цепи Распбери. Они имеют какое-то сопротивление, явно отличное от 50 Ом. Так что даже банальный согласующий п-фильтр, который не столь сложно сделать и подстроить, плюс хоть какая-то согласованная антенна — очень улучшат ситуацию.
ReakTiVe-007
15.10.2017 08:54можно ли сделать что то подобное с мобильными процессорами? или подпроцессоры жпс, аудиочип? что бы выводить к микро юсб или на джек к антенне было удобнее.
С помехами по идее можно разобраться, правильно формирую сигнал во времени и играя мощностью ядер процессора, что бы все гармоники усиливали друг друга, ну или по крайней мере не мешали. Это если я правильно понял механизм работы, т.к. в малинах не селен.DmitrySpb79 Автор
15.10.2017 10:13+2Сложно сказать. Можно только в том случае, если SDK позволяет иметь прямой доступ к «железу» процессора. Ну и дальность без антенны на той же Raspberry Pi 1-2см, а в мобиле дорожки на плате еще короче. На ноутбуке может более реально, там платы побольше.
Сигнал из самого процессора выходит прямоугольный, так что программно его не сгладить, только внешними фильтрами.
Stanislavvv
16.10.2017 10:20В малинах используется модуль PWM, в котором есть приличный синтезатор частоты, насколько я понял.
Так что для остальных процессоров — либо жесткий реалтайм, когда ВСЁ устройство занято только передачей (в частности, на AVR так делали DDS с произвольной частотой), либо частота определяется из какой-то сетки, причём довольно жестко (коэффициенты деления у таймеров, по-моему, не бывают дробными), либо используется что-то имеющееся аппаратное (т.е. процессор — не общего назначения).
Rumlin
15.10.2017 09:08Не хватает указания верхнего предела генерации. Хотя при таких гармониках это сложно определить.
DmitrySpb79 Автор
15.10.2017 10:00+1В описании rpitx указано " It can handle frequencies from 5 KHz up to 500 MHz.".
CrazyRoot
15.10.2017 09:15+3Кстати, используя специальный метод узкополосной передачи WSPR и настроенные антенны, с 10мВт мощности радиолюбителям удавалось передать сигнал на расстояние до 2000км.
DmitrySpb79 Автор
15.10.2017 10:16+3:)
На самом деле, такие дальности действительно реальны, только антенна нужна примерно такого размера, как на передающей, так и на приемной стороне. Ну и это медленная передача, со скоростью где-то 30 бод.
FreazAV
15.10.2017 09:58+1С полгода назад пробовал излучать fm с помощью rpitx. Звук был нормальный (оригинальный wav пришлось ресемплировать до 22 кГц), но с периодическими щелчками.
siryoshka
15.10.2017 10:43+1На заметку конспирологам, с помощью корреляционных фильтров принимается сигналы меньше уровня шумов самого приёмника, а тем более помех.
DmitrySpb79 Автор
15.10.2017 12:00+1Да, до Пентагона сигнал не добьет в любом случае, а метров на 100 (ну максимум километр в совсем идеальных условиях) думаю, передать вполне реально.
SopaXT
15.10.2017 14:45но звук очень высокий и пищащий
Это — неправильный сэмплрейт. PiFmRDS по дефолту, кажется, берёт 44.1 или 48 кГц (читать заголовок файла умеет не очень).
DmitrySpb79 Автор
15.10.2017 14:46Возможно, я особо не разбирался. Я использовал тестовый файл из папки с программой, странно если там лежит неправильный семпл.
SopaXT
16.10.2017 16:58О, на RPi3?
Там вроде как есть какой-то нюанс (кажется, что-то, связанное с прерываниями). Некоторые тоже замечали: https://github.com/ChristopheJacquet/PiFmRds/issues/75.
alexhott
15.10.2017 15:36+1использовать процессор для формирования радиосигнала это как микроскопом гвозди забивать. Но в интересное время живем, можем себе и такие вещи позволить. Инженеры радиоэлектроники из прошлого века в гробу епреворачиваются
DmitrySpb79 Автор
15.10.2017 15:51Сейчас без процессоров никуда. Например OFDM-модуляция — это же фактически преобразование Фурье и перевод сигнала сразу из frequency в time domain, чистая математика. Думается, чисто аналоговой связи уже и не осталось практически (хотя метеофаксы на КВ еще передают:).
Mogwaika
15.10.2017 16:56+1Мне кажется, рассуждая так про OFDM вы предлагаете вместо гвоздей шурупы микроскопом забивать…
DmitrySpb79 Автор
15.10.2017 19:52Нет, я не призываю конечно, специально покупать Raspberry Pi, чтобы сгенерировать прямоугольный сигнал :) Это лишь интересный побочный эффект, не более того.
Ну а мысль про ODFM была в том, что в проф-связи все так или иначе в цифру переходит (или уже перешло). Да и все генераторы сигналов в продаже, по-моему, уже давно цифровые.Mogwaika
16.10.2017 01:14+1Позволю себе разъяснить сарказм, речь шла не об излишнести применении цифровых методов формирования «аналогового» сигнала, а в использовании вычислительных ресурсов центрального процессора вхолостую, чтобы ногами дрыгать.
daggert
15.10.2017 20:43А вы представьте себе как плохо в это "интересное время" искать нужную информацию. Мне давеча понадобилось сделать простой усилитель передающей антенны (фиксированной частоты) — и я просто сдался, т.к. большая часть информации найденной — использование готовых шилдов. Ну и туповат я, соглашусь.
EvilMushroom
Скоро начнут делать радио-закладки с пауэр банками и нулевой малинкой — вещать сверх
секретную...важную инфу за гаражами, в подъезде, etc ;)DmitrySpb79 Автор
Кстати да, программа github.com/markondej/fm_transmitter судя по описанию, поддерживает USB sound card, так что подключаем к «малине» USB-микрофон, и закладка готова :)
granade18
Почему микрофон а не динамик ?
DmitrySpb79 Автор
Raspberry Pi может передать радиосигнал, а вот принять не может, так что динамик тут не пригодится :)
Rumlin
Скорее всего имелась ввиду эта публикация geektimes.ru/post/282954