Revisiting Packet Radio on a Raspberry Pi with Direwolf: part 2 (minimal installation)

This is a continuation of part 1 here. To summarize the required steps to setup ax25 and Direwolf for software based packet radio, here’s the minimum steps need to get up and running:

Install libasound2-dev and libudev-dev:

sudo apt-get install libasound2-dev
sudo apt-get install libudev-dev

Clone the source for Direwolf, then build and install:

git clone

Compile and install Direwolf (build steps changed recently):

cd direwolf
mkdir build && cd build
cmake ..
make -j4
sudo make install
make install-conf

Plug in a soundcard device like a Signalink or Rigblaster, run ‘aplay -l’

Get the device number, in this case my Rigblaster is 2,0:

card 1: vc4hdmi [vc4-hdmi], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: Audio [RIGblaster Advantage Audio], device 0: USB Audio [USB Audio]
Subdevices: 1/1

Configure ~/direwolf.conf – change ADEVICE to refer to the device number from the previous step:, and then set your call sign:

ADEVICE plughw:2,0

Run alsamixer, select your soundcard attached to your radio, and make sure playback and capture sound levels are around 70% and not muted:

Install ax25 apps and tools:

sudo apt-get install libax25 ax25-apps ax25-tools

Add 1 line in /etc/ax25/axports – the number in the first column is the port number, you’ll need this in the next steps:

1 KK6DCT-1 1200 255 2 2m packet


direwolf -t 0 -p

Look for the last line for /dev/pts:

Ready to accept KISS client application on port 8001 ...
Virtual KISS TNC is available on /dev/pts/0
WARNING - Dire Wolf will hang eventually if nothing is reading from it.
Created symlink /tmp/kisstnc -> /dev/pts/0

Run kissattach:

sudo kissattach [/dev/pts/value here] [ax25 port value here]


sudo kissattach /dev/pts/0 1

You should see:

AX.25 port 1 bound to device ax0

Now you’ll set to use the ax tools to connect to other nodes, for example, run:

axcall [ax25 port number] [nodename]


Troubleshooting serial terminal connections (VT Serial Terminal, VT132, Packet Radio TNCs) – part 2

In my previous post, I said I was going to test my two serial cables with every serial device I have to work out which combination worked and which didn’t to find out what the difference was. It didn’t take long to realize though that the DB25 to DB25 serial cable I have that I assumed was a null modem cable only worked with certain types of connections.

For example, it only worked with a VT terminal to a modem type device (in this case a PK-232 packet radio TNC), but not terminal to PC. In the first case that is a DTE to DCE type connection (which worked), whereas the second is DTE to DTE (which didn’t).

  • A DTE to DCE connection requires a straight through cable
  • A DTE to DTE requires a crossover connection (tx to rx, rx to rx)

This realization pretty much confirmed that the cable that was only working for DTE to DCE connectors was a straight through cable, and explained why it didn’t work elsewhere.

Long story short, I picked up a cheap null modem adapter that does the crossover for you, converting a straight through cable to a crossover:

From left to right:

  • USB serial dongle, connected to the Pi
  • DB9 to DB25 converter
  • DB25 to DB25 null model adapter
  • DB25 to DB25 straight through (converted to crossover with the null modem adapter)

And now I can successfully get a terminal logon to my Raspberry Pi:

To enable the serial terminal login via ttyUSB0, see this post.

Enabling serial tty login to a Raspberry Pi

Depending on what Raspbian version you are running on your Pi, the approach for enabling a serial tty login via a VT terminal differs, but on current/recent versions you can enable by enabling and starting this systemd service (steps from this post, and here):

sudo systemctl enable serial-getty@ttyUSB0.service

and then:

sudo systemctl start serial-getty@ttyUSB0.service

This assumes you are using a USB serial dongle and that it’s connected as /dev/ttyUSB0. You can check by doing a ‘ls /dev/ttyUSB*’ before you connect your USB serial adapter and after to check what device your USB dongle appears as.

If you’re running an older version of Raspbian not using systemd, you can add a line to /etc/inittab to initialize getty as described here.

Packet Radio: ax25 node logon message: updating for a cleaner menu

After logging on to an ax25 node, you’re shown a message like this:

DAVBBS:KK6DCT-6 Welcome to KK6DCT-6 network node

Type ? for a list of commands. help <commandname> gives a description
of the named command.


@kk6dct-6 20:52:01>

This is what is shown by my node that I’m currently setting up. I’d like to show a list of the apps I currently have configured. You can see the configured commands by entering a ? as the message tells you, but the formatting is not ideal, especially as I’m adding more apps and this list is getting cluttered. This is what the ‘?’ command shows for my currently configured apps:

@kk6dct-6 20:52:01> ?
DAVBBS:KK6DCT-6 Commands:
?, Advent, Bye, Connect, Escape, Finger, Help, HItchhikers, HOst
Info, Links, Mheard, NLinks, Nodes, PIng, Ports, Routes, Status
TAlk, Telnet, TIme, Users, W1-WeatherDavisCA, W2-Weather5DaysDavisCA
W3-WeatherForCity, W4-Weather5DaysForCity, Z1-Zork1, Z2-Zork2
Z3-Zork3, ZConnect, ZTelnet

When you logon, the first part of the welcome message that’s displayed is configured in /etc/ax25/node.motd (message of the day). Editing this file I can now more cleanly format the menu (and I might come back and change some of the names of the apps to make the menu options clearer later) :

DAVBBS:KK6DCT-6 Welcome to KK6DCT-6 network node
  W1		- Weather in Davis, CA
  W2		- 5 day weather forecast: Davis, CA
  W3		- Weather in specified city
  W4		- 5 day weather forecast for specified city
  Advent	- Adventure / Colossal Cove
  Z1		- Zork I
  Z2		- Zork II
  Z3		- Zork III
Type ? for a list of commands. help <commandname> gives a description
of the named command.


Much better!