FreeDV Modem
FreeDV is a digital voice mode specifically for Amateur Radio HF communications. It provides wide-bandwidth, crystal-clear, noise-free audio and works with weak signals down to 5 dB under the ambient HF noise level. For us it is a game-changer: We now use it every day to run our School Amateur Radio Club Net on 7083 kHz, which we previously ran for 10 years on 7105 kHz - often putting up with barely readable and very noisy analog single-sideband signals. With FreeDV we now have our Amateur Radio (rig) connected to Hi-Fi speakers and listen all day for stations calling in without the annoying snap, crackle and pop of HF band noise. We can hear local, and many more DX stations from ZL and VK6, just like they were in the other room! When conditions on 40 m are stable we can often work stations up to 300 km away on only 100 mW PEP. So what's not to love? Well, actually, one really big thing for us: How do we use FreeDV easily when setting up our portable station at parks or summits, or safely when mobile in our car, all without having to lug around and interact with a laptop computer?
This project provides a small, "black-box" modem to easily setup your portable FreeDV station, or to use it safely (hands-free) in your car. It has no distracting screen, keyboard or mouse and runs on 12 V DC. Instead a small dash-mounted console controls everything and provides visual feedback. You just plug in a USB headset and a USB controlled Amateur Radio transceiver. You can now take FreeDV with you wherever you go!

Mobile Setup with PyFreeDV Modem, PyFreeDV Console, Headset and Uninterruptable Power Supply
Features
- Safe operation while mobile:
- No distracting displays or keyboards
- Hands free (except for dash-mounted PTT button)
- Radio frequency and modulation mode is set using the rig
- Rig Audio is via USB or an external USB sound adapter
- Rig PTT is via USB or an external audio VOX control
- Works with USB or Bluetooth, Headset or Mic and Speaker
- FreeDV Reports are uploaded via WiFi a Smart-Phone Hotspot
- FreeDV Reported Frequency is obtained from the rig or the configuration file
- FreeDV Reports can be monitored on a Smart-Phone Web Browser
- Automatic start-up: 65 second start-up time
- Shut-down button with green 12V DC power indicator: 15 second shut-down time
- Regulated 5.1 V USB Power for the Raspberry Pi prevents "Low Voltage Warning" and CPU throttling
- Uninterruptible Power Supply (optional) keeps PyFreeDV Modem alive when the engine is off and charges when the engine is on
- Fused, 12 V power cable with in-line power switch (optional)
Hardware Setup
This project uses the following hardware:
- A Raspberry Pi 3B+ (or later model)
- A Raspberry Pi 3B+ Enclosure
- A 32 MB micro SDHC card
- A USB Headset
- A PyFreeDV Dash-Mounted Control Console, requiring the following parts and tools:
- Enclosure
- Green Illuminated Momentary-Action Start Up/Shut Down Press Button
- Red Illuminated Momentary-Action PTT Press Button
- RGB Common Cathode LED
- LED Bezel
- 10-Way Rainbow Ribbon Cable
- 310pc 2.54mm Header Connector Kit
- Crimping Tool
- In-line Power Switch
- 1/4 Watt Assorted Resistor Pack or individual values as required
- An Amidon FT-140/43 ferrite toroid for RFI suppression, if necessary
- A USB power adapter; or
- 1 - XL4015 Step-Down DC/DC Converter
- An optional Uninterruptible Power Supply:
- 2 - XL4015 Step-Down DC/DC Converters
- 2 - 1N5822 3A Schottky Diodes
- 2500 mAh, 9.6 V NiMH Battery Pack (8 - AA cells)
- Enclosure, veroboard, cable gland, toggle switch
FreeDV Console Wiring
Prepare a 10-Way rainbow ribbon cable to connect between the PyFreeDV Modem and PyFreeDV dash-mounted console.
FUNCTION | PIN | PIN | FUNCTION | APPLICATION | LED VOLTAGE | LED CURRENT | LED RESISTOR | WIRE COLOUR |
3.3V | 1 | 2 | 5V | SHUTDOWN BUTTON LED | 2.13 V | 10 mA | 270 R | BROWN |
GPIO2 | 3 | 4 | 5V | |||||
GPIO3 | 5 | 6 | GND | |||||
GPIO4 | 7 | 8 | GPIO14 | PTT BUTTON | RED | |||
GND | 9 | 10 | GPIO15 | GROUND FOR LEDS | ORANGE | |||
GPIO17 | 11 | 12 | GPIO18 | RED LED | 1.77 V | 6 mA | 270 R | YELLOW |
GPIO27 | 13 | 14 | GND | GREEN LED | 2.35 V | 6 mA | 180 R | GREEN |
GPIO22 | 15 | 16 | GPIO23 | BLUE LED | 2.65 V | 8 mA | 82 R | BLUE |
3.3V | 17 | 18 | GPIO24 | |||||
GPIO10 | 19 | 20 | GND | |||||
GPIO9 | 21 | 22 | GPIO25 | |||||
GPIO11 | 23 | 24 | GPIO8 | |||||
GND | 25 | 26 | GPIO7 | |||||
N.C. | 27 | 28 | N.C.u | |||||
GPIO5 | 29 | 30 | GND | |||||
GPIO6 | 31 | 32 | GPIO12 | |||||
GPIO13 | 33 | 34 | GND | SHUTDOWN BUTTON | PURPLE | |||
GPIO19 | 35 | 36 | GPIO16 | PTT BUTTON LED | 1.77 V | 10 mA | 150 R | GREY |
GPIO26 | 37 | 38 | GPIO20 | EXTRA | WHITE | |||
GND | 39 | 40 | GPIO21 | GROUND FOR BUTTONS | BLACK |
Wiring Notes
Observe that the ribbon cable must thread into the Raspberry Pi enclosure of the PyFreeDV Modem and the PyFreeDV Console. First check that the cable and crimp connectors will fit through the apertures.
To calculate the LED resistor values use R = (V supply - V led) / I led. V supply = 5V for the Shutdown Button LED and 3.3V for all others. Choose the next highest preferred resistor value in the range.
To wire the 10-way rainbow ribbon cable to the 40-pin IDC header on the Raspberry Pi:
- Do not solder the ribbon cable conductors directly to the pins
- Buy an IDC Crimp Connector Kit!
- Buy the correct Crimping Tool!
- Separate the three sets of ribbon cable wires and shorten the centre bundle
- Strip the wire ends to 2mm
- Insert the wire ends into the crimp socket
- Fold over the tabs with pinch-nose plyers to initially secure the wire
- Crimp the socket using the Crimping Tool
- Choose 1-pin, 5-pin and 4-pin housings from the kit
- Insert the crimp sockets into the correct positions of the correct housing as shown above
- Make sure the crimp sockets lock into the housings
- Plug the ribbon cable into the 40-way IDC header on the Raspberry Pi
The IDC Crimp Connector Kit comes with both pin and socket crimp connectors. If required, you can make a disconnect in the cable as follows:
- Cut the cable at the required position
- Crimp pins to each wire on the PyFreeDV Console side
- Crimp sockets to each wire on the Raspberry Pi side
- Insert the pins and sockets into housings. You will need four, 5-way housings
- Use superglue (sparingly) to glue the housings on each side of the cable together to make a single 10-way disconnect.
To wire the LED resistors:
- Cut the LED resistor pigtails to 3mm long
- Cut the RGB LED pigtails flush with the shortest lead (remember the RGB/Ground order)
- Solder the LED resistors to the RGB LED and to the Switch LED connections
To wire the additional ground wires:
- Cut black hook-up wire to 100mm long
- Strip the ends to 2mm and tin them with a soldering iron
- Solder a hook-up wire between the Switch LED Grounds
- Thread thin heat-shrink tubing over one hook-up wire
- Solder that hook-up wire between the RGB LED Ground and one Switch LED Ground
To wire the PyFreeDV Console:
- Thread the ribbon cable into the enclosure
- Separate and fan out the ribbon cable into three bundles 100mm long
- Separate and fan out the ends of the ribbon cable 25mm long
- Strip the wire ends to 2mm and tin them with a soldering iron
- Thread thin heat-shrink tubing over the ends of the ribbon cable
- Solder the ends of the ribbon cable to the correct components
- Position and shrink the heat-shrink tubing over all exposed conductors

Connecting Crimp Sockets to the Ribbon Cable using the Crimping Tool

Connecting The Ribbon Cable to the Raspberry Pi

PiFreeDV Console
USB Power Adapter
It is a sad fact that those USB power outlets in cars (and most USB AC phone chargers for that matter) do not deliver sufficient voltage to boot up and power a Raspberry Pi without getting a "Low Voltage" alarm and causing the CPU frequency to be throttled. Instead, an elevated USB supply must be maintained between 5.1 V and 5.25 V. We always use a switch-mode regulator module to efficiently convert between 12 - 14 V car power and 5.1 V USB power. Our favourite is the XL4015 module which has a multiturn, pre-set potentiometer to set the output voltage (and often the same to set the output current limit). There are some precautions, though: A switch must be provided for the 12 V supply as the regulator has a quiescent current of 60 mA. When the regulator is first started it draws a large in-rush current and won't start if preceded by a current limiter of less than 2A.

USB Power Check
Always use the following command on a Raspberry Pi in a terminal window to check if it is or has been subject to under-voltage, temperature limits, mild CPU frequency capping or emergency CPU throttling:
vcgencmd get_throttled
It will return a hexadecimal bitmask code as follows:
The best result is 0x00000• Bit 0 (0x00001): Under-voltage currently active• Bit 1 (0x00002): ARM frequency currently capped• Bit 2 (0x00004): Currently throttled• Bit 3 (0x00008): Soft temperature limit currently active• Bit 16 (0x10000): Under-voltage has occurred since last reboot• Bit 17 (0x20000): Frequency capping has occurred since last reboot• Bit 18 (0x40000): Throttling has occurred since last reboot• Bit 19 (0x80000): Soft temperature limit has occurred since last reboot
Uninterruptable Power Supply (Optional)
An Uninterruptable Power Supply (UPS) is required if you want to protect against corruption of the Raspberry Pi's micro SDHC card in the event of an abrupt power failure. For example, turning off the car ignition switch without shutting down the PyFreeDV Modem first. The UPS may only be needed to keep the device running for a few minutes, long enough for you to remember to press the green shutdown button and then disconnect the batteries via the power toggle switch. There are many solutions for an automotive UPS, but we wanted to avoid the risks associated with charging Lithium batteries in a potentially hot car. We originally tried a 20000 mAh USB Power Bank, but it did not maintain sufficient output voltage during the boot up process. The "Under Voltage Alarm" was raised and the CPU frequency was throttled as a result.
Instead, we decided to design our own UPS. Nickel Metal Hydride (NiMH) batteries are safer than Lithium batteries. They can be charged to about 80% capacity using a simple Constant Current/Constant Voltage charging regime. They and do not need cell load-balancing. Since we were already using an XL4015 CC/CV DC/DC converter to provide 5.1V to run the Raspberry Pi, we thought we would use another one to charge a small 9.6 V (8S) 2550 mAh NiMH battery pack from the same 12V supply. The charging current was set to 0.1C = 255 mA and the charge voltage was set to 11.2 V. A low voltage-drop 1N5822 3A Schottky diode combiner circuit was used to provide an automatic changeover from the car battery supply to the UPS battery supply. The output regulator is set to 5.1 V, the minimum to avoid Raspberry Pi undervoltage alarms, and 3 A for good measure. A double-pole toggle switch simultaneously disconnects the car battery and the backup battery, preventing discharge. The following pictorial schematic diagram shows the wiring and the setting of the XL4015 potentiometers.

Uninterruptable Power Supply Pictorial Schematic
The following photo shows the general layout of the UPS. It is housed inside a plastic zippy box. Partitions are used to separate the regulators from the battery, and to hold everything in place. The 9.6 V battery pack was made from 8 AA cells. Tin tabs were spot-welded to join the adjacent cells together. It is well worth getting a battery-operated, spot-welder for this task. Absolutely do not try to directly solder to the battery terminals - They can short and may even explode. There is also an in-line 3 A fuse in the car power connector. We estimated the NiMH battery would probably power the PyFreeDV Modem for nearly three hours after the car power was switched off. So its OK to leave it running while you stop for coffee.

Uninterruptible Power Supply Wiring
Software Setup
This project uses the following free, open-source software:
- Raspberry Pi Imager for Raspberry Pi OS (64-bit) Lite: A port of Debian Trixie with no desktop (516 MB download)
- A FreeDV codec, called radae_headless, ported by Peter Marks VK3TPM to run without a GUI.
- HAMLIB Ham Radio Control Library
- Python 3.14
- Our PyFreeDV Modem script:
- Runs as a Linux service on power up
- Maintains a system configuration file
- Controls an Amateur Radio transceiver: Frequency, Mode and PTT
- Controls radae_headless, the FreeDV codec
- Spots activity on the FreeDV Reporter website
- Provides a Press-To-Talk toggle switch GPIO interface for hands-free operation
- Our PyFreeDV Modem Installer script:
- Upgrades the RPi OS
- Installs Linux packages and Python libraries
- Compiles radae_headless
- Creates a Linux boot service
- WinSCP or PuTTY to configure the system using SSH over you Home WiFi network
Software Installation
Software installation requires the preparation of a micro SDHC with a fresh installation of a Raspberry Pi OS Lite (64-bit) and then installation of the PfreeDV Modem software.
The current version of the software is: PyFreeDV Modem version 1.0
Prepare a micro SDHC Card
To get started, insert a 32 GB micro SDHC Card into the PC via a USB adapter. Download and run Raspberry Pi Imager as follows:

Select Raspberry Pi OS Lite (64-bit)

Select Device - Raspberry Pi 3

Select OS Raspberry Pi OS (Other)

Select the location, time zone and keyboard layout

Select your micro SDHC card storage device

Enter the network hostname of the Raspberry Pi

Enable SSH

Enter your username and password

Enter the SSID and Wi-Fi password of your Wi-Fi Router

Confirm Write Image

Disable Raspberry Pi Connect

Review and select Write Image

Remove the micro SDHC card

Wait for the image to be written

Wait for the image to be verified
Once the micro SDHC Card has been prepared:
- Power off the Raspberry Pi
- Insert the micro SDHC Card into the Raspberry Pi
- Power up the Raspberry Pi - It will boot up and connect to your WiFi router
- Discover the IP address of the Raspberry Pi:
- Log into your WiFi Router and find the list of connected stations. Look for the RPi host name; or
- Use a free IP scanner such as Advanced IP Scanner. Look for the RPi host name; or
- Open a terminal session, ping your WiFi network broadcast address and use Address Resolution Protocol; or
- Type: ping 192.168.1.255
- Type: arp -a
- You will then see a list of all the IP address on your WiFi network. It's the new one!
- Ping the address with the RPi powered up or down to check.
- If all else fails, temporarily connect an HDMI monitor and USB keyboard:
- Log in to the Raspberry Pi using your username and password
- Type: ifconfig
- Look for the inet address associated with the wlan0 port
- Start SCP and log in to the Raspberry Pi IP address over WiFi using your credentials
Install the PyFreeDV Modem Software
Once logged in: Copy and paste, or type, the following commands in bold to download and run the installer from this website; edit the configuration file and reboot the Raspberry Pi:
curl -fLo pyfreedv.sh https://sarcnet.org/files/FreeDV/pyfreedv.sh && chmod +x pyfreedv.sh && sudo ./pyfreedv.sh
You will have to re-enter your password. The installation process will take about 15 minutes. Then:
nano /opt/freedv/pyfreedv.txt
sudo reboot

Open WinSCP

Open the PuTTY window
Configuration
Before using the software for the first time, or to make changes, you will have configure the PyFreDV Modem application as follows:
- Log into the Raspberry Pi with your user credentials:
- Using WinSCP or PuTTY from a remote PC over the WiFi network; or
- By temporarily connecting an HDMI display and USB Keyboard
- Type: pacmd list-sources | grep -e 'name:' to list the names of all the audio input devices
- Type: pacmd list-sinks | grep -e 'name:' to list the names of all the audio output devices
- Type: ls -l /dev/serial/by-id to list the names of all the USB serial devices.
- Match your rig's serial device name to the USB port, usually shown as: -> ../../ttyUSB0
- Edit the configuration file using:
- The built-in WinSCP editor on a remote Windows PC; or
- PuTTY on a remote Winodws PC: Type: nano /opt/freedv/pyfreedv.txt. Press CTRL-O, <ENTER>, CTRL-X when finished; or
- The HDMI display and USB Keyboard: Type: nano /opt/freedv/pyfreedv.txt. Press CTRL-O, <ENTER>, CTRL-X when finished .
The default configuration file is as shown below, with comments in bold. You will have to edit the Station, Audio, Rig and FreeDV sections:
[Station]
callsign = NOCALL Your Callsign
grid_square = QF22NC Your Maidenhead locator
[Audio]
fromradio = alsa_input.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo Radio RX USB Audio Device
tospeaker = alsa_output.usb-Plantronics_Plantronics_DA45-00.mono-fallback Speaker USB Audio Device
toradio = alsa_output.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo Radio TX USB Audio Device
frommic = alsa_input.usb-Plantronics_Plantronics_DA45-00.mono-fallback Microphone USB Audio Device
[Rig]
model = IC7200 HAMLIB Rig Model. See here. Note1.
rigid = 3061 HAMLIB RIG ID
freq = 7083000 Last Used Frequency. Note 2.
mode = LSB Last Used Modulation Mode
hamlib = yes Use HAMLIB to Control Radio
port = /dev/ttyUSB0 USB Serial Device to Control Radio
baud = 19200 USB Serial Device Baud Rate
[Modem]
version = PyFreeDV 1.0 Modem version as sent to FreeDV Reporter. Note 3.
beep = yes Enable an audible beep on RX SYNC Start and Stop
ptt_button = 4 GPIO Port for the PTT Button
ptt_led = 19 GPIO Port for the PTT LED
red_led = 17 GPIO Port for the RGB Red LED
green_led = 27 GPIO Port for the RGB Red LED
blue_led = 22 GPIO Port for the RGB Red LED
snr_level = (0, 10, 20) SNR Level Breakpoints in Percent for Green, Purple, Blue LED Display. Note 4.
mic_level = (30, 50, 80) Mic Level Breakpoints in Percent for Green, Purple, Blue LED Display
rgb_red = (0.02, 0.0, 0.0) RGB LED Colour Ratio for Red. Note 5.
rgb_green = (0.0, 0.02, 0.0) RGB LED Colour Ratio for Green
rgb_purple = (0.05, 0.0, 0.05) RGB LED Colour Ratio for Purple
rgb_blue = (0.0, 0.0, 0.05) RGB LED Colour Ratio for Blue
[FreeDV]
mode = RADEV1 Codec Mode as sent to FreeDV Reporter
status = TX Status (TX or RX Only) as sent to FreeDV Reporter
message = PyFreeDV is Great! Message as sent to FreeDV Reporter
report = yes Use FreeDV Reporter
url = https://qso.freedv.org:443 FreeDV Reporter URL
Notes:
- The PyFreeDV app automatically sets the Rig Id from the Rig Model, but the model must exactly match the name in the list.
- The PyFreeDV app always starts on the frequency and mode in the configuration file, but saves any subsequent changes.
- The PyFreeDV app version is set automatically by the app
- The RGB LED indicates: Off = N/A, Red = Bad, Green = Good, Purple = Better and Blue = Best, according to the breakpoints shown.
- The three floating-point numbers in the brackets indicate the ratio of the Red, Green and Blue LED drive level from 0.0 to 1.0. They are all set fairly low to avoid excessive glare in a vehicle at night.
Configure Mobile Internet Access
The following additional configuration is required to add a mobile phone hotspot to the PyFreeDV Modem. When you transfer the modem to the vehicle and are outside the range of the home WiFi router, the modem should connect to your mobile phone hotspot. Copy and paste, or type, the following two commands:
sudo nmcli c add con-name <NAME> ifname wlan0 type wifi ssid <SSSID> wifi-sec.key-mgmt wpa-psk wifi-sec.psk <PASSWORD>sudo nmcli c up <NAME>
Where:
<NAME> is the name given to the new WiFi interface<SSID> is the ssid of the mobile phone hotspot<PASSSWORD> is the password to access the mobile phone hotspot
Configure the Audio Levels
To set the audio volume control levels for the headset and rig interfaces you have to access the ALSA sound system by typing the following commands in bold. Different devices will have different soundcard numbers and control names. So the first step is to identify them for your set up. Some devices have sub-controls, which can only be found by querying the main control. You need to identify a total of four (4) controls: The headset earphone and microphone and the rig TX and RX controls. Then you can set the levels for each control - at least within the limits shown. Start by setting all levels to 100% and then back them off if needed. When finished, make sure you store the levels.
Get the Soundcard Numbers
aplay -l | grep 'card'
card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones]card 1: DA45 [Plantronics DA45], device 0: USB Audio [USB Audio] This is our headset interfacecard 2: vc4hdmi [vc4-hdmi], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]card 3: Device [USB Audio Device], device 0: USB Audio [USB Audio] This is our rig interface
Get the Control Names for each Soundcard
amixer -c1 scontrolsamixer -c3 scontrolsSimple mixer control 'Bass',0Simple mixer control 'Treble',0Simple mixer control 'Sidetone',0Simple mixer control 'Headset',0 This is the name of the headset control (it has two sub-controls - see next)Simple mixer control 'Speaker',0 This is the name of the rig's TX audio control
Simple mixer control 'Mic',0 This is the name of the rig's RX audio control
Simple mixer control 'Auto Gain Control',0
Get the Audio Control Levels
amixer -c1 get Headset
Simple mixer control 'Headset',0Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined
Playback channels: Mono Headset Playback is the name of the headset earphone controlCapture channels: Mono Headset Capture is the name of the headset microphone controlLimits: Playback 0 - 25 Capture 0 - 4Mono: Playback 0 [0%] [-50.00dB] [on] Capture 0 [0%] [-9.00dB] [on]
amixer -c3 get Speaker
Simple mixer control 'Speaker',0
Capabilities: pvolume pswitch pswitch-joinedPlayback channels: Front Left - Front RightLimits: Playback 0 - 30Mono:Front Left: Playback 0 [0%] [-45.00dB] [on]Front Right: Playback 0 [0%] [-45.00dB] [on]
amixer -c3 get Mic
Simple mixer control 'Mic',0
Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joinedPlayback channels: MonoCapture channels: MonoLimits: Playback 0 - 14 Capture 0 - 30Mono: Playback 0 [0%] [-12.00dB] [off] Capture 0 [0%] [-12.00dB] [on]
Set the Audio Control Levels
amixer -c1 set Headset Playback 100% Set headset earphone levelamixer -c1 set Headset Capture 100% Set headset microphone levelamixer -c1 set Sidetone 50% Set headset sidetone level to monitor your microphone levelamixer -c3 set Speaker 100% Set rig TX levelamixer -c3 set Mic 100% Set rig RX level
Save the Audio Control Levels
sudo alsactl store Save the audio level controls
Hardware Installation
- Install the rig, PyFreeDV Modem, PyFreeDV Console and the UPS or USB power adapter in the vehicle in safe locations
- Connect the PyFreeDV Modem to the rig:
- A USB CAT cable for rigs with inbuilt USB serial ports and sound cards; or
- A USB sound adapter for transmit and receive audio; with
- A USB to serial converter for CAT control; or
- A VOX control in the rig for PTT control; or
- A VOX adapter for PTT control
- See our USB Rig Interface page for details
- Connect the USB/Bluetooth audio input and output devices to the PyFreeDV Modem:
- A USB microphone and a USB Speaker; or
- A USB Headset; or
- A Bluetooth Headset
- Connect the UPS or USB Power Adapter:
- Connect 12 V car power to the UPS or USB power adapter
- Connect 5 V UPS or USB power adapter power to the PyFreeDV Modem using a micro USB power cable
How it works
- The user creates a new RPi OS Lite (64-bit) image using RPi Imager. Together with the user's login and home WiFi access credentials. It is a headless image, meaning it has no desktop. This was chosen to reduce to CPU overhead, especially on the RPi 3B+, and since a GUI requires an additional display which would also be distracting in a mobile environment.
- The user logs into the RPi and manually downloads and runs an installation script
- The installation script:
- Updates and upgrades the operating system
- Installs the required application libraries and removes any unused libraries
- Removes any previous installations
- Creates a user application directory
- Clones and builds the FreeDV codec, radae_headless, a port by Peter VK3TPM from his GitHub repository
- Creates a Python virtual environment
- Installs the required Python libraries
- Downloads the PyFreeDV application script, its configuration file and a beep.wav file from this website
- Enables sound and WiFi services at boot up, without any user login, since PyFreeDV requires Pulse Audio and WiFi services, which are not normally started until user login
- Creates, enables and restarts a PyFreeDV service file, which automatically executes on boot
- Configures a RPi GPIO shutdown pin, in /boot/firmware/config.txt, to permit an external signal to gracefully shutdown the RPi
- The PyFreeDV script:
- Creates a user configuration file object:
- Reads the file on start up
- Saves the file with updated rig frequencies and modes
- Creates a radae_headless codec object to send and receive the FreeDV digital waveform:
- Starts the codec as a separate thread on start up
- Captures real-time output from the codec
- Signals RX and TX modes to the codec
- Creates a HAMLIB rig object to control an Amateur Radio transceiver:
- Gets the correct HAMLIB Rig ID for the configured HAMLIB Rig Model
- Connects to the rig on start up
- Gets and sets rig PTT, Frequency and Mode
- Creates a GPIO ptt object to provide the user with a PTT button:
- Monitors the PTT button state
- Sets the modem's RX or TX mode
- Creates a FreeDV Reporter spot object to send operation reports to the FreeDV Reporter website:
- Connects to the FreeDV Reporter website on start up
- Sends Callsign, Locator, Frequency, Status and Message
- Sends RX (SNR and Callsign) and TX Reports
- Creates an integrated PyFreeDV modem object:
- Initializes and starts the other objects
- Runs a 100ms loop, polling the codec output for SYNC, EOO and TX events
- Beeps in the headset on SYNC events
- Spots RX mode and SNR on SYNC events
- Spots Callsign on EOO events
- Spots TX mode on TX events
- Tries to restart the codec on disconnection of the rig
- Tries to reconnect the rig on disconnection of the rig
- Tries to reconnect FreeDV Reporter on disconnection of FreeDV Reporter
Operation
- In-line Power switch
- Press to power up the PyFreeDV Modem - Check PyFreeDV console power LED is on
- Press to power down the PyFreeDV Modem after it has been shutdown - Check PyFreeDV console power LED is off
- PyFreeDV console momentary press-button shutdown switch - with green power indicator
- Press to shutdown PyFreeDV Modem - Wait 15 seconds, then turn off in-line power switch
- Green LED off: Power off
- Green LED on: Power on
- PyFreeDV console press-button PTT switch - with red PTT Indicator
- Press to TX Press to RX
- Red LED Off: RX Mode
- Red LED On: TX Mode
- PyFreeDV console RGB LED indicator
- LED Off: No RX signal or TX audio
- Red LED: Bad. RX signal below 0 dB SNR, or TX audio below 30%
- Green LED: Good. RX signal above 0 dB SNR, or TX audio above 30%
- Purple LED: Better. RX signal above 10 dB SNR, or TX audio above 50%
- Blue LED: Best. RX signal above 20 dB SNR, or TX audio above 80%
- Beep tone on audio output device
- 1 Beep - On start or stop of FreeDV RX SYNC signal
Acknowledgments
- Thanks to the FreeDV Team for their huge contribution to Amateur Radio HF communication.
- Thanks to Peter VK3TPM for his radae_headless code.
- Thanks to Anthony VK3YSA, Felix VK3FAR and Rob VK3CKY for help with development and testing