kopia lustrzana https://github.com/eleccoder/raspi-pico-aprs-tnc
128 wiersze
6.0 KiB
Markdown
128 wiersze
6.0 KiB
Markdown
<img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/eleccoder/raspi-pico-aprs-tnc">
|
|
|
|
# raspi-pico-aprs-tnc
|
|
A TX-only [TNC](https://en.wikipedia.org/wiki/Terminal_node_controller) (Terminal Node Controller) to generate the [AFSK](https://en.wikipedia.org/wiki/Frequency-shift_keying#Audio_FSK) (Audio Frequency-Shift Keying) audio tones for [APRS](https://en.wikipedia.org/wiki/Automatic_Packet_Reporting_System) (Automatic Packet Reporting System) messages using a [RP2040](https://en.wikipedia.org/wiki/RP2040) microcontroller on a [Raspberry Pi Pico](https://en.wikipedia.org/wiki/Raspberry_Pi#Raspberry_Pi_Pico) board.
|
|
|
|
![Signal Flow](https://github.com/eleccoder/raspi-pico-aprs-tnc/blob/main/doc/img/signal_flow.png)
|
|
|
|
Block diagram showing the signal flow
|
|
|
|
An analog line-out audio signal will be generated by a band-pass filter connected to GPIO-pin 'GP0' which provides the binary PWM signal. You can probe it by a scope, listen to it by using an audio amp, or connect it to any RF transceiver to send it on the air (ham radio license required).
|
|
|
|
![AFSK scope screenshot](https://github.com/eleccoder/raspi-pico-aprs-tnc/blob/main/doc/img/afsk_scope.png)
|
|
|
|
Image: Line-out signal (see [below](#Hardware)) probed by a DSO. We clearly see the 1200 Hz and 2200 Hz tones of the 1200 Bd 2-AFSK.
|
|
|
|
Both a static library `libaprs_pico.a` and a demo application will be generated by the build.
|
|
|
|
|
|
## Prerequisites
|
|
|
|
Your host platform for cross-compilation is assumed to be LINUX.
|
|
|
|
1. Install the Pico-SDK following the instructions given in the [Raspberry Pi 'Getting Started' Guide](https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf) (pdf)
|
|
1. Set the `PICO_SDK_PATH` environment variable to point to your Pico-SDK installation directory
|
|
1. Install the [pico-extras](https://github.com/raspberrypi/pico-extras) libraries:
|
|
|
|
```
|
|
cd $PICO_SDK_PATH/..
|
|
git clone -b master https://github.com/raspberrypi/pico-extras.git
|
|
cd pico-extras
|
|
git submodule update --init
|
|
```
|
|
|
|
## Hardware
|
|
|
|
We just need a simple band-pass filter to extract the analog AFSK-signal from the binary PWM signal:
|
|
|
|
![band-pass filter](https://github.com/eleccoder/raspi-pico-aprs-tnc/blob/main/doc/img/band_pass_filter.png)
|
|
|
|
The line-out voltage can be as high as 2.7 V<sub>pp</sub> (~1 V<sub>rms</sub>) (at full-scale volume setting in the software and high-impedance load).
|
|
|
|
## Build the library and the 'beacon' demo application
|
|
|
|
NOTE: In case you want to allow the Pico to control the PTT (*Push-To-Talk*) input of your transmitter, set the appropriate `#define` parameters in `src/aprs_pico_beacon_demo.c`.
|
|
|
|
```
|
|
git clone https://github.com/eleccoder/raspi-pico-aprs-tnc.git
|
|
cd raspi-pico-aprs-tnc
|
|
cmake -S . -B build
|
|
cmake --build build
|
|
```
|
|
|
|
`build/lib/libaprs_pico.a` and `build/aprs_pico_beacon_demo[.uf2|.elf|.bin|.hex]` will be generated, as well as the testing application `build/aprs_pico_tone_test[.uf2|.elf|.bin|.hex]`.
|
|
|
|
## Run the 'beacon' demo application
|
|
|
|
The analog AFSK audio signal will be available at the filter's line-out. You can probe it by a scope, listen to it by using an audio amp, or connect it to any RF transceiver to send it on the air (ham radio license required).
|
|
|
|
But for testing the signal integrity, you can feed the signal into the soundcard of your computer and let decode its data content by [Dire Wolf](https://github.com/wb2osz/direwolf) - see down below.
|
|
|
|
### Flash the Pico
|
|
|
|
```
|
|
cd build
|
|
```
|
|
|
|
Flash `aprs_pico_beacon_demo[.uf2|.elf|.bin|.hex]` to the Pico board as you're usually doing.
|
|
|
|
|
|
### Test the 'beacon' demo application using *Dire Wolf* (on LINUX)
|
|
|
|
We can use the famous [Dire Wolf](https://github.com/wb2osz/direwolf) CLI software to decode the APRS data after sampling our APRS audio signal by means of a soundcard.
|
|
|
|
1. Connect the line-out of our circuit above to the microphone input of your soundcard of your (ALSA-supported) LINUX system.
|
|
2. Check if you can hear the typical APRS 'modem-sound' on your audio output device by monitoring the input signal (44.1 kHz, mono, WAVE):
|
|
|
|
```
|
|
arecord -f cd -c 1 - | aplay
|
|
```
|
|
|
|
3. Install [Dire Wolf](https://github.com/wb2osz/direwolf) on your system. Probably, you just have to run:
|
|
|
|
```
|
|
sudo apt install direwolf
|
|
```
|
|
|
|
4. Let's sample the APRS audio signal fed to the soundcard and forward the audio stream to *Dire Wolf* (44.1 kHz, mono, WAVE):
|
|
|
|
```
|
|
arecord -f cd -c 1 - | direwolf -
|
|
```
|
|
|
|
5. Enjoy the decoded APRS message:
|
|
|
|
![Decoded APRS message by Dire Wolf](https://github.com/eleccoder/raspi-pico-aprs-tnc/blob/main/doc/img/direwolf_decoding.png)
|
|
|
|
### Audio file of the 'beacon' demo
|
|
|
|
Here is a [recorded audio wav-file](https://github.com/eleccoder/raspi-pico-aprs-tnc/blob/main/doc/aprs_pico_beacon_demo.wav) (44.1 kHz, mono, WAVE) captured by the soundcard using:
|
|
|
|
```
|
|
arecord -f cd -c 1 > aprs_pico_beacon_demo.wav
|
|
```
|
|
|
|
You can replay and decode this file by:
|
|
|
|
```
|
|
cat aprs_pico_beacon_demo.wav | direwolf -
|
|
```
|
|
|
|
## Going on the air: RF-transmission with the *Baofeng UV-5* HT
|
|
|
|
If you actually want to RF-transmit the APRS signal, you can simply do it by one of the many cheap HTs, like the *Baofeng UV-5*. The complete schematic including PTT control looks like this:
|
|
|
|
![APRS-Pico with Baofeng_UV-5](https://github.com/eleccoder/raspi-pico-aprs-tnc/blob/main/doc/img/APRS_Pico_with_Baofeng_UV-5R.png)
|
|
|
|
Don't forget to set the appropriate `#define` parameters in `src/aprs_pico_beacon_demo.c` to configure PTT control.
|
|
|
|
## TODO
|
|
|
|
- [x] Send the APRS message on the console (USB or UART) rather than hard-coding
|
|
|
|
## Ingredients / Acknowledgements
|
|
|
|
- For `APRS Payload => AX.25 => AFSK (PCM)` conversion I'm using [my modified version](https://github.com/eleccoder/ax25-aprs-lib) of [fsphil's ax25beacon](https://github.com/fsphil/ax25beacon) project.
|
|
- For `PCM => PWM` conversion I'm using the `pico_audio_pwm` library from [pico-extras](https://github.com/raspberrypi/pico-extras) (NOTE: ATTOW, maturity seems to be rather alpha/beta).
|
|
- Basic PWM audio rendering with the Pi Pico has been spotted in the [pico-playground](https://github.com/raspberrypi/pico-playground/tree/master/audio).
|