Amateur Radio Linux Machine Provisioning
IN PROGRESS - Still working out a few bugs and filling in a few details
These are some notes I use for configuring my amateur radio Linux machines. The base operating system is Ubuntu 22.04 LTS. This is not a comprehensive guide, just a quick reference for myself and others to install commonly used amateur radio applications on a Linux machine. Please don't blindly copy and paste these into your terminal without understanding what they do. I will include links in the reference section for more detailed newbie instructions.
Overview
The system that these instructions intends to build is a Linux system using the Ubuntu distribution. The goal is to use as much open source software as possible. I think currently all the amateur radio software used in this guide is open source. Additionally, the software chosen provides a good cross-section of capabilities needed for emcomm, as well as for more recreational activities. Here's a list of software and the capabilities they provide:
- chirp
- Radio programming
- gpsd
- GPS daemon, provides GPS support for a variety of other applications
- hamlib
- Library and applications for rig control
- xastir
- APRS client
- YAAC
- APRS client
- Offline OpenStreetMap view with search feature
- gpredict
- Satellite pass predictor
- gqrx-sdr
- SDR receiver
- rtl-sdr
- SDR tools and library needed to use RTL based SDRs
- direwolf
- AFSK KISS TNC with additional APRS capabilities included
- pat
- Winlink client
- ax25-tools
- flrig
- Rig control application compatible with fldigi
- fldigi
- Digital mode application. Supports PSK, RTTY, MFSK, and more
- js8call
- Weak signal digital mode for messaging
- wsjtx
- Weak signal digital mode (FT8, etc)
- noaa-apt
- gpxsee
- TODO Add installation instructions
Variables
These are some variables that will be used throughout this guide:
<CALL_SIGN>
= My call sign
<SSID>
= An SSID is used to differentiate other instances using this call sign. It's known as the substation id
<RIG_MODEL>
= Hamlib rig model number
<RIG_SERIAL>
= Rig serial port
<RIG_SERIAL_BAUD>
= Baud rate for rig's serial port
<RIG_ALSA_DEVICE>
= The ALSA device for the rig
<APRS_PASSWORD>
= The password for APRS-IS for my call sign
<GPS_SERIAL>
= The serial device for my GPS
Install Packages
This will install most applications we need through Ubuntu's package manager:
sudo apt-get install \
chirp \
gpsd \
hamlib4 \
hamlib-utils \
xastir \
gpredict \
gqrx-sdr \
rtl-sdr \
direwolf \
pat \
ax25-tools \
flrig \
fldigi \
js8call \
wsjtx \
openjdk-11-jre \
openjdk-17-jre \
ntp
To install ARDOP we'll need to do the following:
sudo wget -O /usr/local/bin/ardopc64 "http://www.cantab.net/users/john.wiseman/Downloads/ardopc64"
sudo chmod +x /usr/local/bin/ardopc64
To install noaa-app:
wget https://github.com/martinber/noaa-apt/releases/download/v1.3.1/noaa-apt_1.3.1-1_amd64.deb
sudo dpkg -i noaa-apt_1.3.1-1_amd64.deb
Configure gpsd
sudo nano /etc/default/gpsd
and set:
DEVICES="<GPS_SERIAL>"
GPSD_OPTIONS="-n"
USBAUTO="false"
We use this config to pin to our GPS serial device explicitly and prevent gpsd from latching onto out rig's serial device.
sudo systemctl enable gpsd
to enable gpsd on boot.
sudo systemctl start gpsd
to start gpsd on the spot.
Configure ntpd
sudo timedatectl set-ntp no
to turn off timesyncd.
sudo nano /etc/ntp.conf
to edit config and add:
# GPS Serial data reference
server 127.127.28.0 minpoll 4 maxpoll 4
fudge 127.127.28.0 time1 0.0 refid GPS
# GPS PPS reference
server 127.127.28.1 minpoll 4 maxpoll 4 prefer
fudge 127.127.28.1 refid PPS
After restarting ntpd use ntpq -p
and gpsmon
for testing.
Rig Serial Port Permissions
We need to configure udev rules to allow our user to read/write to the rig's USB serial port. In this example I'm creating one for my IC-705. The idVendor
and idProduct
can be found using sudo lsusb -v
.
sudo nano /etc/udev/rules.d/50-radios.rules
to create/open a file for radio udev rules. I place the following in that file for my IC-705:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0c26", ATTRS{idProduct}=="0036", GROUP="users", MODE="0666"
sudo usermod -a -G dialout $USER
to add the current user to the dialout
group so it can get permissions for the rig's USB serial port.
sudo udevadm control --reload
to reload the udev rules.
Find Rig's ALSA SoundCard Device
arecord --list-pcms
plughw:CARD=CODEC,DEV=0
USB Audio CODEC, USB Audio
Hardware device with all software conversions
My IC-705's <RIG_ALSA_DEVICE>
would be plughw:CARD=CODEC
. This value would also work for my IC-7100 and IC-7300.
Find Rig's Serial Device
Afterwards find the serial device for CAT control ls /dev/serial/by-id/
. My output looks like:
usb-Sierra_Wireless__Incorporated_MC7750_001027009999999-if00-port0
usb-Sierra_Wireless__Incorporated_MC7750_001027009999999-if02-port0
usb-Sierra_Wireless__Incorporated_MC7750_001027009999999-if03-port0
usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7100_02012442_A-if00-port0
usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7100_02012442_B-if00-port0
After looking at this list, I've identified the second to last as being my IC-7100's CAT control. Therefore the serial device is /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7100_02012442_A-if00-port0
This will be used where we see <RIG_SERIAL>
Find hamlib Rig Model Number
rigctld -l
to find hamlib rig model numbers
This number will be used where we see <RIG_MODEL>
Configure Direwolf
sudo nano ~/direwolf.conf
ADEVICE <RIG_ALSA_DEVICE>
CHANNEL 0
MYCALL <CALL_SIGN>-<SSID>
MODEM 1200
PTT RIG <RIG_MODEL> <RIG_SERIAL> <RIG_SERIAL_BAUD>
AGWPORT 8000
KISSPORT 8001
GPSD localhost
Configure Direwolf ARPS
These are optional and used as needed
Digipeater
This will digipeat but also emit the station's position as a fill-in digipeater. This is what I would add to the existing config:
DIGIPEAT 0 0 ^WIDE[3-7]-[1-7]$ ^WIDE[12]-[12]$
TBEACON SYMBOL=1# POWER=5
IGate
This will listen for ARPS traffic and send it over to the internet APRS servers. This should be added to the existing config:
IGSERVER noam.aprs2.net
IGLOGIN <CALLSIGN>-<SSID> <APRS_PASSWORD>
Run Direwolf
direwolf -c ~/direwolf.conf
AX25
sudo nano /etc/ax25/axports
to open the config file for AX.25 ports. I put the following on one line in that file:
wl2k <CALL_SIGN> 0 255 7 Winlink
sudo kissattach $(readlink -f /tmp/kisstnc) wl2k
whenever I connect my rig and start direwolf. This will bind the direwolf KISS TNC to Linux AX.25 stack.
sudo kissparms -p wl2k -t 300 -l 10 -s 12 -r 80 -f n
to set the correct parameters.
sudo killall kissattach
after finished using the AX.25 port.
Virtual Device for ARDOP
echo 'pcm.ARDOP {type rate slave {pcm "<RIG_ALSA_DEVICE>" rate 48000}}' > ~/.asoundrc
will create a new ALSA device, tied to my rig's ALSA device, that will have the correct sample rate for use with ARDOP.
Run ARDOP
ardopc 8515 <RIG_ALSA_DEVICE> <RIG_ALSA_DEVICE> -l /tmp
if the rig ALSA device can support the needed sample rate. Otherwise use ardopc 8515 -l /tmp
which will use the virtual device we setup earlier.
Note: Make sure that when using ARDOP that the radio filter is set to the selected gateway's bandwidth. For example, if using a gateway with 500 then set the filter at 600 Hz.
Rig Control for Pat Winlink
rigctld -m <RIG_MODEL> -r <RIG_SERIAL> -s <RIG_SERIAL_BAUD>
will open rigctld
for Pat Winlink to use to control my rig.
Configure Pat Winlink
pat configure
to do a one time configuration.
For rigs we'll just make one called my_rig
, it'll point to our rigctld
process.
"hamlib_rigs": {
"my_rig": {"address": "localhost:4532", "network": "tcp"}
},
Default ARDOP settings:
"ardop": {
"rig": "my_rig",
"ptt_ctrl": true,
"addr": "localhost:8515",
"arq_bandwidth": {
"Forced":false,
"Max":500
},
"beacon_interval": 0,
"cwid_enabled": false
},
Default AX.25 settings:
"ax25": {
"port": "wl2k",
"beacon": {
"every": 0,
"message": "Winlink P2P",
"destination": "IDENT"
}
},
Use GPSD:
"gpsd": {
"enable_http": true,
"allow_forms": true,
"use_server_time": true,
"addr": "localhost:2947"
}
Run Pat
pat --listen="ardop,ax25" http
to start the UI for Pat Winlink, listening for ARDOP and AX25.
Running YAAC
sudo update-alternatives --config java
to select Java 11 if the machine as more than one version of Java on it.
java -jar YAAC.jar
Sending SMS via APRS
Register number with SMSGTE: #mynumber {add, delete, show} <number>
.
Registration example:
To: SMSGTE
#mynumber add 6135551234
Send SMS example:
To: SMSGTE
@6135551234 No cell coverage here, ping me on radio
Send APRS message example (from phone):
To: 2015551234
@VE3OTB-10 Did you forget your cellphone?
Sending Email via APRS
Send email example:
To: EMAIL-2
test@gmail.com Test Email
Appendix
Rig Serial Parameters for My Radios
These are the settings I'd need for setting up applications like JS8Call, WSJT-X, and Flrig.
IC-705
Rig as IC-7300
19200 baud
8 data bits
1 stop bit
No handshake
Force DTR and RTS to low
Set CI-V Address on Radio: 94h
Set modes to -D
(e.g. USB-D, FM-D) so the radio uses the USB device instead of microphone.
IC-7100
Rig as IC-7100
19200 baud
8 data bits
1 stop bit
No handshake
Force DTR and RTS to low
Data Mod USB
Set modes to -D
(e.g. USB-D, FM-D) so the radio uses the USB device instead of microphone.
IC-7300
19200 baud
8 data bits
2 stop bit
No handshake
Force DTR and RTS to low
CI-V Address: 94h
Set modes to -D
(e.g. USB-D, FM-D) so the radio uses the USB device instead of microphone.
My Variables
IC-705
<RIG_SERIAL> = /dev/serial/by-id/usb-Icom_Inc._IC-705_IC-705_12004306-if00
<RIG_BAUD> = 19200
<RIG_ALSA_DEVICE> = plughw:CARD=CODEC
Udev rules:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0c26", ATTRS{idProduct}=="0036", GROUP="users", MODE="0666"
IC-7100
<RIG_SERIAL> = /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7100_02012442_A-if00-port0
<RIG_BAUD> = 19200
<RIG_ALSA_DEVICE> = plughw:CARD=CODEC
<HAMLIB_RIG_MODEL> = 3070
Udev rules:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="10c3", ATTRS{idProduct}=="ea60", GROUP="users", MODE="0666"
Notes: alsamixer
to 50%.
Digirig
<RIG_SERIAL> = /dev/serial/by-id/usb-Silicon_Labs_CP2102N_USB_to_UART_Bridge_Controller_226d25d349a4ec11bff2e789a29c855c-if00-port0
<RIG_ALSA_DEVICE> = plughw:CARD=Device,DEV=0
Udev rules:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="013c", GROUP="users", MODE="0666"
Notes: Set speakers and microphone with alsamixer
to 100% and disable auto gain using the m
key.
U-blox7 GPS
<GPS_SERIAL> = /dev/serial/by-id/usb-u-blox_AG_-_www.u-blox.com_u-blox_7_-_GPS_GNSS_Receiver-if00
References
- https://github.com/la5nta/pat/wiki/Rig-control
- https://github.com/la5nta/pat/wiki/AX25-Linux
- https://unix.stackexchange.com/questions/609302/fixed-card-mapping-from-usb-to-alsa-device-list
- https://packet-radio.net/wp-content/uploads/2018/10/Direwolf-User-Guide.pdf
- https://www.jeeps.net/threads/sms-text-and-email-via-aprs-using-aprsdroid.2038/
- https://smsgte.org/user-guide/