moxon-frame-generator
simple generator for 3D-printed frames for a moxon rectangle antenna
Raspberry PI based WebSDR server
git clone https://github.com/reynico/raspberry-websdr.gitreynico/raspberry-websdrLeer en Inglés, Español. Read in English, Spanish.
This WebSDR setup covers a dual band receiver (80/40 meters bands) time-based switched. It uses a relay to switch between antennas who is managed by one GPiO pin on the Raspberry PI (using a driver transistor).
Very special thanks to Pieter PA3FWM, Mark G4FPH and Jarek SQ9NFI for the helpful hand on configuring the progfreq setting.
Raspberry PI 4 or newer runs on a different (but similar) architecture than older hardware like the PI 3. Since websdr-rpi is not fully compatible with this newer arch (mostly due to outdated dependencies) you may face some of these errors:
websdr-rpi: cannot execute: required file not found
or
websdr-rpi: error while loading shared libraries: libfftw3f.so.3
Some of the steps listed below have specific instructions for setting up a newer Raspberry PI hardware and overcome these issues.
sudo apt update && sudo apt upgrade sudo apt install -y \ g++ \ make \ libsigc++-2.0-dev \ libgsm1-dev \ libpopt-dev \ tcl8.6-dev \ libgcrypt-dev \ libspeex-dev \ libasound2-dev \ alsa-utils \ libsigc++-2.0-0v5 \ cmake \ groff \ rtl-sdr \ libusb-1.0-0-dev \ unzip \ git \ rsync
If you are running a Raspberry PI 4 or newer (arm64 architecture) install the armhf arch:
sudo dpkg --add-architecture armhf sudo apt install -y \ libsigc++-2.0-dev:armhf \ libgsm1-dev:armhf \ libpopt-dev:armhf \ tcl8.6-dev:armhf \ libgcrypt-dev:armhf \ libspeex-dev:armhf \ libasound2-dev:armhf \ libsigc++-2.0-0v5:armhf \ libusb-1.0-0-dev:armhf \ libc6:armhf \ zlib1g-dev:armhf
cd /home/pi/
git clone https://github.com/reynico/raspberry-websdr.git
cd raspberry-websdr/
Over the time, some required libraries were deprecated in favor of newer and incompatible versions.
If you're running a Raspberry PI 4 or newer (arm64 architecture), compile libpng like this:
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf tar xf libpng-1.2.59.tar.xz cd libpng-1.2.59/ CC=arm-linux-gnueabihf-gcc \ CXX=arm-linux-gnueabihf-g++ \ ./configure \ --host=arm-linux-gnueabihf \ --prefix=/usr/local \ --libdir=/usr/local/lib/arm-linux-gnueabihf make sudo make install sudo ldconfig sudo ln -s /usr/local/lib/arm-linux-gnueabihf/libpng12.so.0 /lib/arm-linux-gnueabihf/libpng12.so.0 cd..
If you're running a Raspberry PI older than a PI4, compile it this way:
tar xf libpng-1.2.59.tar.xz cd libpng-1.2.59/ ./configure make sudo make install cd ..
If you're running a Raspberry PI 4 or newer (arm64 architecture), compile libssl like this:
cd openssl-1.0.0k/ CC=arm-linux-gnueabihf-gcc ./Configure linux-armv4 shared \ --prefix=/usr/local/arm32 \ --openssldir=/usr/local/arm32/ssl \ -Wl,--version-script=openssl.ld \ -Wl,-Bsymbolic-functions make sudo make install_sw sudo ln -s /usr/local/arm32/lib/libcrypto.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libcrypto.so.1.0.0 sudo ln -s /usr/local/arm32/lib/libssl.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libssl.so.1.0.0 sudo ldconfig
If you're running a Raspberry PI older than a PI4, compile it this way:
tar xf openssl-1.0.0k.tar.gz
cd openssl-1.0.0k/
cat << EOF > openssl.ld
OPENSSL_1.0.0 {
global:
*;
};
EOF
./config shared --prefix=$HOME/libssl/openssl --openssldir=$HOME/libssl/ssl -Wl,--version-script=openssl.ld -Wl,-Bsymbolic-functions
make
sudo make install_sw
sudo ldconfig
ldd $HOME/libssl/openssl/bin/openssl
sudo cp $HOME/libssl/openssl/lib/libcrypto.so /usr/local/lib
sudo chmod 0755 /usr/local/lib/libcrypto.so
sudo ldconfig
cd ..
If you are running a RTL-SDR.com V4 receiver, a special version of the rtl-sdr driver is needed in order to receive 500KHz-28.8MHz
git clone https://github.com/rtlsdrblog/rtl-sdr-blog cd rtl-sdr-blog/ mkdir build cd build cmake ../ -DINSTALL_UDEV_RULES=ON make sudo make install sudo cp ../rtl-sdr.rules /etc/udev/rules.d/ sudo ldconfig
If you are running a different SDR device, but if it supports direct sampling (such as RTL-SDR.com V3 receiver), there's a way to receive 500khz-28.8mhz without an external upconverter hardware, easing the node build.
unzip rtl-sdr-driver-patched.zip cd pkg-rtl-sdr/ mkdir -p build/ cd build/ cmake ../ -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON make sudo make install sudo ldconfig cd ../../ cp -r pkg-rtl-sdr/ /home/pi/ cd ..
Don't forget to remove the progfreq line from the websdr configuration file(s).
Use the following systemd unit for direct sampling:
sudo cp etc/systemd/system/rtl_tcp_direct_sampling.service /etc/systemd/system/rtl_tcp@.service
sudo reboot.sudo cp etc/systemd/system/websdr@.service /etc/systemd/system/websdr@.service
Copy this systemd unit only if you're NOT using the RTL SDR direct sampling method. RTL-SDR.com V4 receivers don't need the Direct Sampling mod to work, it just works out of the box.
sudo cp etc/systemd/system/rtl_tcp@.service /etc/systemd/system/rtl_tcp@.service
The setup described in this section is the most usual: a single band SDR receiver (say, 40m band).
websdr and rtl_tcp:sudo cp etc/systemd/system/websdr.service /etc/systemd/system/websdr.service
rtl_tcp systemd unit:sudo systemctl enable rtl_tcp@0.service
websdr unit:sudo systemctl enable websdr.service
The setup described in this section is a more powerful one, where the Raspberry PI switches the WebSDR bands according to the time you define in crontab.
This WebSDR setup uses one RTL-SDR dongle for two bands (40/80 meters), crontab takes control of which band is working. As wave length isn't the same on both two bands, I'm using a GPiO port to switch between them using a DPDT relay. GPIO3 is controlled by the check_band.sh cron script.

rtl_tcp systemd unit. Websdr is managed by crontabsudo systemctl enable rtl_tcp@0.service
You can always control band changes manual way. Disable cron lines to avoid automatic setup changes. Then you can use
sudo systemctl stop websdr@40.service sudo systemctl start websdr@40.service
Where 40 is the band you want to receive. You can use and setup almost any band you want, as long as you had setup your websdr-{{band}}m.cfg
sudo cp etc/rc.local /etc/rc.local
sudo cp opt/reset.py /opt/reset.py sudo cp etc/systemd/system/reset.service /etc/systemd/system/reset.service sudo chmod 644 /etc/systemd/system/reset.service sudo systemctl enable reset.service sudo systemctl start reset.service
This is the software reset schematic. It has a 5v pull-up signal between a 10k resistor.

You'll need to blacklist some modules in order to get rtl_tcp working. Edit or create the file /etc/modprobe.d/blacklist.conf with the following content:
blacklist dvb_usb_rtl28xxu
To reduce the SD Card wear due to writes from logs, I recommend you to install log2ram, a tool which creates a ramdisk mountpoint for /var/log.
echo "deb [signed-by=/usr/share/keyrings/azlux-archive-keyring.gpg] http://packages.azlux.fr/debian/ bookworm main" | sudo tee /etc/apt/sources.list.d/azlux.list sudo wget -O /usr/share/keyrings/azlux-archive-keyring.gpg https://azlux.fr/repo.gpg sudo apt update sudo apt install log2ram sudo systemctl enable log2ram
You may want to increase the ramdisk partition size up to 200M, edit the file /etc/log2ram.conf and set SIZE=200M.
While Websdr has an option to prevent logs to be written to the card (logfileinterval 0), there are two log files that are written anyway: log-cpuload.txt and userslog.txt. Create a logs folder inside /var/log and link both files in a symbolic fashion.
sudo rm /home/pi/dist11/userslog.txt sudo rm /home/pi/dist11/log-cpuload.txt sudo mkdir -p /var/log/websdr ln -s /var/log/websdr/userslog.txt /home/pi/dist11/userslog.txt ln -s /var/log/websdr/log-cpuload.txt /home/pi/dist11/log-cpuload.txt
more like this
simple generator for 3D-printed frames for a moxon rectangle antenna
search projects, people, and tags