AX.25 Packet Modem on Arduino
Category: Electronics — Status: In progress
During the late part of 2012, I decided to start building a packet radio modem for 1200 baud AFSK (AX.25 style) from scratch. After spending a number of weeks on the project getting the basics all sorted out, it started to turn into something quite usable. I added on some small SPI SRAM chips that had 256kbit of memory each. However, these had to run at 3.3V and I was using a 5V Arduino. After setting it all up and create level shifters for the SPI bus, I noticed they also had 512kbit 23LC512 SPI SRAM chips that supported a native 5V interface. This made the actual layout and component count far simpler. It also doubled the available packet memory.
The design of the system is very straight forward:
- Use the hardware PWM of the Arduino to create the output wave forms using direct digital synthesis.
- Pass the output voltage from the PWM through a low pass filter using two poles (to get it nice and smooth).
- Pass the receive audio through a capacitor and low pass filter straight to an Arduino ADC pin.
- Sample the ADC at 8kHz and feed it into the audio decoding software on the Arduino.
- Store packets as they are received into memory and output them on serial when an entire HDLC frame has been received.
- Store outbound packets into a buffer and schedule them for delivery via the PWM output when the channel is free and an entire HDLC frame has been received from the host.
To achieve this system design, I wanted to use the smallest external parts count I could and accomplish as much with software as possible. Some inspiration (and code) came from the BeRTOS AX.25 stack for the audio decoding. They had a very efficient and nice looking approach to the audio decode. However, I didn’t want to use the entire BeRTOS software and operating system on the Arduino, as I really only needed the AX.25 decoder part. I copied their code over and adapted it into the flow of my own software that had been worked out. It turns out their decoder is very accurate and sensitive.
The entire current source for the AX.25 project is available on my Github page. I originally had it all just in a private repository, but realized others may find the software useful. I opted not to use the Arduino IDE, using the Atmel Studio software instead. This let me have a lot more flexibility with the modules. There are a number of third party modules that are unmodified in the source tree to add features into the system. If you browse through, you’ll see a heavy emphasis on it being used for APRS tasks. Though this was the initial idea that spawned the project, I decided to turn it into a generic TNC with APRS capabilities instead.
I keep working on the project when I find time and the need to program. I hope to use it soon with my Raspberry Pi based iGate for a low power and low maintenance solution to my home based iGate setup.