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 Link to heading

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 Link to heading

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 Link to heading

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 Link to heading

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 Link to heading

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 Link to heading

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 Link to heading

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 Link to heading

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 Link to heading

rigctld -l to find hamlib rig model numbers

This number will be used where we see <RIG_MODEL>

Configure Direwolf Link to heading

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 Link to heading

These are optional and used as needed

Digipeater Link to heading

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 Link to heading

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 Link to heading

direwolf -c ~/direwolf.conf

AX25 Link to heading

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 Link to heading

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 Link to heading

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.

rigctld -m <RIG_MODEL> -r <RIG_SERIAL> -s <RIG_SERIAL_BAUD> will open rigctld for Pat Winlink to use to control my rig.

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 Link to heading

pat --listen="ardop,ax25" http to start the UI for Pat Winlink, listening for ARDOP and AX25.

Running YAAC Link to heading

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 Link to heading

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 Link to heading

Send email example:

To: EMAIL-2
[email protected] Test Email

Appendix Link to heading

Rig Serial Parameters for My Radios Link to heading

These are the settings I’d need for setting up applications like JS8Call, WSJT-X, and Flrig.

IC-705 Link to heading

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 Link to heading

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 Link to heading

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 Link to heading

IC-705 Link to heading

<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 Link to heading

<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 Link to heading

<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 Link to heading

<GPS_SERIAL> = /dev/serial/by-id/usb-u-blox_AG_-_www.u-blox.com_u-blox_7_-_GPS_GNSS_Receiver-if00

References Link to heading