Последният ни проект беше за осигуряване на EchoLink свързаност за репитър LZ0RNA – R5 Добрич.
Първо, малко история за рестранслатора, преди да преминем по същество:
R5 е най-старият УКВ ретранслатор в Добрич. Общо взето, откакто в Добрич има радиолюбителство, има го и R5. През годините са се сменили поне три различни ретранслатора като хардуер, конструирани и поддържани от различни колеги, някои от които, за огромно съжаление, вече не са сред нас.
Първият ретранслатор е бил монтиран на водната кула на ВиК около 5-ти километър. Хардуерът е бил базиран на унгарска радиостанция. След авария, ретранслаторът е останал неактивен. Хардуерът е много вероятно още да стои на кулата. 🙂
Вторият ретранслатор е бил конструиран от LZ2NA, Росен (Роко),sk, и е бил монтиран на жерето на ВиК на 5-ти километър. Бил е оборудван с няколко сфазирани Яги антени във всички посоки, за да осигурява максимално добро покритие. По това време, освен местните радиолюбители, през ретранслатора са работили успешно и далечни станции от чужбина. След удар от мълния, ретранслаторът престава да работи.
Преди няколко години, LZ2BB и LZ2IVA организираха спасителна акция, за да свалят обемните резонатори, с цел да ги използваме в настоящия репитър. Иво, LZ2IVA, се покатери до върха на кулата и спусна с въжета резонаторите (горе бяха останали само те, понеже са тежки и трудни за сваляне, а останалото е било откраднато през годините). Няколко месеца по-късно, жерето беше съборено.
Последният (и настоящ) ретранслатор е конструиран и поддържан от LZ4HA, Влади. Базиран е на две радиостанции „Лотос“ – една приемна и една предавателна. Първоначално се намираше в лозето на Петко, LZ2OA,sk в началото на с. Победа, обл. Добрич. След това за кратко беше на лозето на Веско, LZ2HA, във в.з. Лозята. След като успяхме да осигурим позиция на ТВ кулата в Добрич, ретранслаторът беше преместен там, откъдето работи и в момента. Осигурените от LZ2BB и LZ2IVA оставащ брой обемни резонатори бяха добавени към тези, които репитърът вече имаше. С това постигнахме пълна изолация на приемната от предавателната честота, което за един репитър на 2 м. е от съществено значение за правилната му работа.
Настоящият ретранслатор е с позивна LZ0RNA, в памет на Росен, LZ2NA, конструкторът на първия R5.
Назад във времето, LZ2DMM, Митко, е предоставял EchoLink връзка за R5, но от много години не е активна, което ни мотивира да осигурим съвременен и надежден линк на репитъра към мрежата на EchoLink.
И след това лирично отклонение, да преминем по същество. 🙂
Софтуерна част
От предишния ретранслатор, за който направихме EchoLink – LZ0RHA (70 см. репитърът в Добрич), вече имаме доста опит със софтуера SvxLink – в момента най-чистия и модерен начин да се свърже репитър към EchoLink. Трябва да се отбележи, че самият SvxLink като софтуерно решение е много мощен и възможностите му далеч не се изчерпват с EchoLink модула – SvxLink може да управлява всички функции на един ретранслатор, елиминирайки изцяло нуждата от хардуерен контролер, вкл. опашка, тон и т.н, но в нашия случай използваме само EchoLink модула му, както и някои благинки като QSO recorder функционалността, за да записваме активността през ретранслатора. Изпозваме някои функции за викане на външни скриптове при получена DTMF команда, но това са подробности.
Конфигурацията и при този ретранслатор е с външно радио, отдалечено от репитъра. Това се налага, тъй като при репитъра нямаме (или поне няма как лесно да ни се разреши да ползваме) интернет свързаност. Решението с външно радио не е по никакъв начин по-лошо, но един дразнещ недостатък е, че опашката ще се чува всеки път, когато потребителят през EchoLink спре да предава, съответно ако репитърът се закачи към EchoLink на друг репитър, опашката ще се чува всеки път и на отдалечения репитър.
При направата на EchoLink интерфейс, има четири основни момента:
- Аудио от компютъра към радиото
- Аудио от радиото към компютъра
- Логическа сигнализация за отворен SQL от радиото към компютъра
- Логическа сигнализация за активирано PTT от компютъра към радиото
За EchoLink-а на репитър LZ0RHA ползвахме Raspberry Pi, върху което върви SvxLink, а аудиото е с външна звукова карта на USB порт. За сигнализация за SQL, използваме един от GPIO пиновете като входящ, като хардуерният интерфейс към който е свързано радиото го вдига, когато SQL на радиото се отвори, сътоветно SvxLink чете нивото му, за да прецени кога е вдигнат SQL и да започне да предава аудио към свързания към EchoLink потребител.
За PTT-то използваме друг GPIO пин като изходящ, като SvxLink го вдига преди да започне да предава, а хардуерният интерфейс реагира на това като окъсява съответната част от Kenwood конектора, за да може радиото да започне да предава.
За този EchoLink, решихме да не купуваме втора малинка, а да използваме физическия COM порт на сървърната ни машина, на която стои този сайт и WebSDR-а. В последната част на статията ще видите и хардуерния интерфейс, който разработихме за целта, работещ с радиостанции с конектори тип Kenwood, напр. Baofeng, Quansheng и т.н.
По принцип, при липса на физически COM порт, не би трябвало да има проблеми да се използва USB към TTL UART конвертор, както са направили колегите от Силистра за техния EchoLink.
Всичко от описаното по-долу е изпълнено на GNU/Linux сървърна машина с Debian-базирана дистрибуция.
Инсталираме необходимите пакети:
apt install svxlink-server alsa-tools alsa-utils lame
Разбира се, ако желаете да ползвате SvxLink с най-скорошните промени, може да го компилирате от изходен код, но процедурата би отнела цяла отделна статия (сравнително актуални инструкции има тук, но мотиките в хода на процеса са неприятни), така че за целите на упражнението тук ще приемем, че сме решили са инсталираме SvxLink чрез пакетната система на дистрибуцията ни, което не е изобщо лоша опция, ако ползвате сравнително нова GNU/Linux дистрибуция и не искате да губите време и нерви.
С пакета на svxlink
идва и услуга за remotetrx
, която няма да ползваме, затова я забраняваме, за да не стартира със системата:
systemctl disable remotetrx
Проверяваме какви аудио устройства имаме на системата:
При нас, това е една звукова карта, която операционната система представя като аналогов и цифров интерфейс:
$ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: SB [HDA ATI SB], device 0: ALC662 rev1 Analog [ALC662 rev1 Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: SB [HDA ATI SB], device 1: ALC662 rev1 Digital [ALC662 rev1 Digital] Subdevices: 1/1 Subdevice #0: subdevice #0
Задаваме това аудио устройство като такова по подразбиране в конфигурацията на ALSA:
vim /usr/share/alsa/alsa.conf
Указваме индекса на аудио устройството, което ще изпозваме (в нашия случай – 0), на редовете и defaults.ctl.card и defaults.pcm.card:
defaults.ctl.card 0
defaults.pcm.card 0
Сваляме английските аудио файловете за версията на SvxLink, която сме инсталирали. Това са звуците, които ще се изпълняват като анонси при активиране на модули, идентификация и т.н.
Аудио файловете за всички версии на SvxLink може да намерим тук.
Избираме версията на аудио файловете, която съответства на нашата версия на SvxLink.
cd /usr/share/svxlink/sounds/
wget 'https://github.com/sm0svx/svxlink-sounds-en_US-heather/releases/download/19.09.99.3/svxlink-sounds-en_US-heather-16k-19.09.99.3.tar.bz2'
tar xvjf svxlink-sounds-en_US-heather-16k-19.09.tar.bz2
Докато сме в текущата директория, правим symlink към декомпресираната директория:
ln -s en_US-heather-16k en_US
Пристъпваме към конфугирацията на самия SvxLink.
Основна конфигурация
Използваме стандартната конфигурация на SvxLink, която след инсталацията на пакета се намира на упоменатите места по-долу. Ще обясня само по-важните моменти от нещата, които сме променили в нея, като те са в зависимост от използвания хардуерен интерфейс към радиото и наши лични предпочитания.
Отбелязвам, че конфигурацията на модула EchoLink е отделна от общата конфигурация на SvxLink и конфигурационният файл на модула се намира в /etc/svxlink/svxlink.d/ModuleEchoLink.conf
.
Основната конфигурация на SvxLink се намира в /etc/svxlink/svxlink.conf
. В нея, типът ноуд се дефинира като SimplexLogic, с два блока за приемната и предавателната част – Rx1 и Tx1, и изброяване на модулите, които желаем да ползваме в директивата MODULES:
[SimplexLogic] TYPE=Simplex RX=Rx1 TX=Tx1 MODULES=ModuleEchoLink
В основната конфигурация на SvxLink (/etc/svxlink/svxlink.conf
):
[Rx1] TYPE=Local […] AUDIO_DEV=alsa:plughw:0 AUDIO_CHANNEL=0 […] SQL_DET=SERIAL […] SQL_HANGTIME=500 […] SERIAL_PORT=/dev/ttyS0 SERIAL_PIN=!CTS SERIAL_SET_PINS=DTR […] DTMF_DEC_TYPE=INTERNAL DTMF_MUTING=1 DTMF_HANGTIME=40 […]
Това е блокът на приемната част (Rx1). По-интересното тук е следното:
- AUDIO_DEV – интерфейсът на звуковата ни карта. Щом aplay -l ни е показал индекс 0, тук конфигурираме
alsa:plughw:0
. SQL_DET=SERIAL
– указваме, че интерфейсът ни ще получава сигнализация за SQL и ще дава команда за PTT през COM порта на компютъра.SQL_HANGTIME=500
– колко време да изчакаме след хардуерното затваряне на SQL, преди да обработим събитието софтуерно и да затворим SQL за SvxLink.SERIAL_PORT=/dev/ttyS0
– dev ноуда на серийния порт, който ползваме. В случая, това е първият хардуерен (истински, а не емулиран) сериен порт на сървъра ни.SERIAL_PIN=!CTS
– пинът, който ще бъде използван за сигнализиране за SQL, като може да избираме между DCD, CTS, DSR или RI. Забележете удивителната преди CTS – тя указва, че ще се прилага обратна логика за логическата единица и нула от тази по подразбиране за RS232 стандарта. Проследете схемата по-долу в секцията за хардуера, за да видите защо хардуерният ни интерфейс работи така.SERIAL_SET_PINS=DTR
– това е пин, който ще бъде статично вдигнат на COM порта още при стартирането на SvxLink. Той няма пряка роля, а просто предоставя напрежение за логическите функции на интерфейса. В случая сме вдигнали DTR пина. Може да бъде ползван и RTS, но ние ползваме RTS за сигнализиране за PTT-то.DTMF_MUTING=1
– изпратените DTMF команди ще бъдат заглушавани към EchoLink и системата за записи (QSO recorder-а).
Следва блокът на предаватната част:
[Tx1] TYPE=Local AUDIO_DEV=alsa:plughw:0 AUDIO_CHANNEL=0 […] PTT_TYPE=SerialPin PTT_PORT=/dev/ttyS0 PTT_PIN=RTS […] TIMEOUT=240 TX_DELAY=800 […] PREEMPHASIS=0 DTMF_TONE_LENGTH=100 DTMF_TONE_SPACING=50 DTMF_DIGIT_PWR=-15
След като видяхме приемната част по-горе, за повечето неща тук може да се ориентираме чисто интуитивно, като по-различното е в:
PTT_TYPE=SerialPin
– отново указваме, че ще ползваме конкретен пин от COM порт, за да кажем на хардуерния интерфейс на радиото кога да задейства PTT-то му.PTT_PIN=RTS
– в този конкретен случай, използваме за такъв комутационен пин RTS. Забележете, че тук няма удивителна – прилагаме стандартната за RS232 стандарта логика по отношение на напрежението, сигнализиращо логическата едница и нула.TIMEOUT=240
– колко най-много секунди може да предава EchoLink-ът ни (ако ползвате SvxLink като основен софтуерен контролер на репитър, тази настройка би означавала колко време може максимално да предава репитърът ви, преди SvxLink да затвори предавателя).TX_DELAY=800
– тъй като използваме COM порт за нашия интерфейс, е необходимо известно време за стабилизиране на нивата от момента в който SvxLink подава командата за вдигане на PTT пина. В случя ще изчакаме 800 милисекунди от вдигането на PTT пина, преди да започнем да предаваме аудио на звуковата карта.
Тъй като и на двата репитъра желаем да записваме активността през тях, ще конфигурираме и QsoRecorder модула на EchoLink:
[QsoRecorder] REC_DIR=/path/to/audio/archive MIN_TIME=1000 MAX_TIME=300 SOFT_TIME=20 MAX_DIRSIZE=1024 DEFAULT_ACTIVE=1 #TIMEOUT=300 QSO_TIMEOUT=120 ENCODER_CMD=/usr/bin/lame --quiet \"%f\" \"%d/%b.mp3\" && rm \"%f\"
Опциите тук са въпрос на лично предпочитание (колко дълъг да е един запис, колко голяма да става най-много директорията със записи и т.н.) и няма да ги обяснявам подробно. За всички опции, може да се консултирате с man страницата на SvxLink тук.
Само ще обърна внимание, че за компресиране използваме lame, т.е. компресираме до mp3, а не до ogg и wav, както по подразбиране прави SvxLink със стандартната конфигурация за този модул.
Конфигурация на EchoLink модул
Редактираме конфигурацията на EchoLink модула, част от SvxLink, намираща се в /etc/svxlink/svxlink.d/ModuleEchoLink.conf:
[ModuleEchoLink] NAME=EchoLink […] TIMEOUT=60 […] CALLSIGN=LZ0RNA-R PASSWORD= SYSOPNAME=LZ2BB LOCATION=[Svx]145.725 R5 Dobrich PROXY_SERVER= PROXY_PORT= PROXY_PASSWORD= […] MAX_QSOS=10 MAX_CONNECTIONS=11
Документацията за този модул е налична тук, така че може да консултирате с нея възможните опции.
TIMEOUT=60
– след колко време на неактивност SvxLink ще пристъпи към изключване на модула.MAX_QSOS=10
– максималният брой станции (потребители или репитри), които може да са свързани едновременно към EchoLink инстанцията ни.MAX_CONNECTIONS=11
– дори лимитът наMAX_QSOS
да е привишен, EchoLink модулът пак ще приеме връзката, ако общият брой свързани не надвишаваMAX_CONNECTIONS
, но само ще прочете съобщение, че няма налични слотове и ще разкачи потребителят, без да го пусне да ползва инстанцията. Това е и разликата между двете настройки. Ако MAX_CONNECTIONS броят е надвишен, входящата връзка просто ще бъде игнорирана без никакво известие.
При този EchoLink, за разлика от EchoLink-а на репитър LZ0RHA, използваме прокси сървър, хостван от нас на друга, отдалечена машина. Налага се поради дизайна на системата на EchoLink – от един IP адрес може да се хоства само една EchoLink инстанция.
Някои допълнителни неща
Обикновено правя някои допълнителни неща след като съм приключил с цялата конфигурация.
- Спиране на анонса, предаващ се от SvxLink към потребителя при успешно свързване (не става въпрос за анонса, който се чува на репитъра – той си остава).
Логиката на SvxLink се управлява от верига от TCL скриптове, инсталирани заедно с други неща в /usr/share/svxlink
. По-съществената част е в events.d. Ако редактирате нещо там, е горе-долу задължително да си направите директория в events.d с име „logic“ и вътре на наливате само променените от вас скриптове, вместо да правите промените в оригиналните скриптове.
В /usr/share/svxlink/events.d/EchoLink.tcl
поставяме коментар преди playSilence
и playMsg
функциите, които се викат от remote_greeting
функцията:
# # Executed when an incoming connection is accepted # proc remote_greeting {call} { # playSilence 1000; # playMsg "greeting"; }
При мен започва на ред 511.
- Викане на външни DTMF команди.
На нашите репитри се поддържат някои DTMF команди, като съобщаване на времето (*9#), проверка за преминаване на ISS около Добрич и други. Тези команди се обслужват с външни Bash скриптове, които най-просто казано взимат информацията от интернет, превръщат я on-the-fly в аудио файл чрез TTS-а на Google (като ме пусне мързела, ще го прехвърля на ElevenLabs), вдигат предавателя (като задават определена стойност на GPIO пина през съответния файл в /proc файловата система за репитър LZ0RHA или чрез Python и pyserial библиотеката вдигат определен пин на COM порта за този репитър), пускат аудиото на звуковата карта и свалят предавателя.
За отварянето на предавателя при тук описаната конфигурация, измислих следния Python-ски one liner:
python3 -c "import serial; ser = serial.Serial('/dev/ttyS0', timeout=1); ser.rts = True; ser.close()"
И съответно за затваряне:
python3 -c "import serial; ser = serial.Serial('/dev/ttyS0', timeout=1); ser.rts = False; ser.close()"
Кодът на скриптовете е грозен, въпреки че работят безпроблемно, затова няма да ги публикувам тук, но ще обясня как да викаме външни DTMF команди през SvxLink. За целта си правим файлче Logic.tcl
в /usr/share/svxlink/events.d/local
със следното съдържание:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | namespace eval Logic { proc dtmf_cmd_received {cmd} { global active_module if {$active_module != "" && [string index $cmd 0] != "*"} { return 0 } if {[string index $cmd 0] == "*"} { set cmd [string range $cmd 1 end] } if {$cmd == "9"} { puts "Executing weather script" exec /opt/weather/weather.sh & return 1 } return 0 } } |
Последното нещо, което остава да направим, е да си конфигурираме аудио нивата. Правим това през alsamixer
, като след стартирането даваме F5, за да зареди всички конфигуруеми нива.
Настройките тук са строго индивидуални и зависят преди всичко от звуковата ви карта, така че няма как да посочим някакви референтни стойности. Правилният начин за настройка е с проба и грешка – някой се закача към EchoLink-а и слуша, докато друг предава от ефира – така се настройва нивото на аудиото, идващо от радиото към компютъра. След това започва да предава от EchoLink-а, а друг слуша от ефира – така се настройва нивото на аудиото, отиващо от компютъра към радиото.
Все пак, за някакъв ориентир, слагам скрийншот на аудио нивата за този EchoLink, на които последно се спряхме след тестове:

След всичко това, може да рестартираме SvxLink услугата през systemd:
systemctl restart svxlink
Може и да проверим лога в /var/log/svxlink
за грешки. Ако няма, значи сме готови софтуерно.
Хардуерна част

Може да свалите pdf със схемата от тук.
Хардуерният интерфейс е разработен от Влади, LZ4HA. По-долу следва кратко описание на принципа на работа:
Изходящият аудио сигнал от слушалките на компютъра през J4 постъпва на тример-потенциометъра RP2. С негова помощ се настройва подходящо ниво на аудио сигнала, който през развързващият трансформатор Т2 постъпва на микрофонният вход на радиостанцията (конектор J3).
През конектор J2, постъпващият от радиостанцията аудио сигнал се подава към развързващия трансформатор Т1. Нивото на аудио сигнала, постъпващ на вход Line in на компютъра, се регулира с тример потенциометъра RP1.
При постъпване на сигнал +10V (логическа 0) на извод 7 (сигнал RTS) на серийния изход, се задейства оптрон U1 и радиостанцията преминава в режим предаване. Индикация за това е светването на светодиод LD1 (РТТ).
Вторият оптрон U2 служи за прехвърляне на сигнал SQL. За тази цел от светодиода на оптрона е свързан през резистор R7 между колектора на управляващият транзистор и анода на светодиода SQL на радиостанцията. Когато шумоподавителя на радиостанцията е отворен, тогава освен сигналния светодиод на радиостанцията, свети и светодиода на оптрона U2. Емитера на тронзистора на оптрона е свързан към извод 3 (сигнал Tx), който през цялото време осигурява статично ниво -10V.
Колекторът на транзистора (през светодиода LD2 и R6) е свързан към извод 4 (сигнал DTR), който осигурява статично ниво +10V. Полезният изходен сигнал от колектора на транзистора отива към извод 8 (CTS) на серийния вход. Когато шумоподавителят на радиостанцията е отворен, транзисторът на U2 се отпушва и CTS застава във високо ниво (-10V). И обратно – при затворен шумоподавител, CTS застава в ниско ниво (+10V). Индикация за задействан шумоподавител е светването на светодиод LD2.
Най-добре е като развързвързващи трансформатори да се ползват миниатюрни НЧ трансформатори с коефициент на трансформация 1:1. Поради липса на такива съм ползвал трансформатори с коефициент на трансформация 1:5.
За U1 и U2 съм ползвал български оптрони тип 6Н2001 и 6Н2017, но могат да се ползват и други видове оптрони със същия успех.
Използваната радиостанция е Baofeng UV-82.