A guide for building an SDR Cyberdeck within a compact Nanuk 910 case. Featuring a Raspberry Pi 4, 7-inch display, various I/O ports, and custom 3D printed hardware! The project includes step-by-step instructions for assembly and setup, with room for customization.
This is the product of a few months of tinkering and having fun with the Raspberry Pi 4 and RTL-SDR. I wanted to create a portable cyberdeck that could be used for a variety of tasks, including software-defined radio (SDR) and general computing. Now that it's completed, I would like to share this project with the world, so others can enjoy it as well!
[ Index ]
Occasionally you may find a Lambda Cyberdeck for sale on https://www.lambda.guru or https://www.etsy.com/shop/LambdaGuru. I don't intend to make money on this project though, I just want to share it with the world for others to enjoy. If you want to build your own, I've provided all the information and files you need to get started below!
A list of essential parts needed to build the Lambda Cyberdeck:
Part Name |
---|
Nanuk 910 Case |
Raspberry Pi 4 Model B/4GB |
64 GB MicroSD Card - Class 10 |
7inch HDMI LCD (H) Display 1024x600, IPS |
Logitech Pebble Keys 2 K380s Bluetooth Keyboard |
RTL-SDR V4 |
HighPi Pro 5V Cooling Fan |
On/Off Button/Switch |
USB-C Power Supply, 5.1V 3.0A |
Waveshare 8Ω 5W Speakers |
Micro-HDMI to HDMI cable |
Rotary Encoder |
Female USB Type-C Mount to Male adaptor (power in) |
M3 Screws and Nuts |
A list of optional parts to give you some ideas for your build:
Part Name |
---|
Portable Power Bank |
Wireless Mouse |
USB 2.0 / USB 3.0 Port |
USB-C Port |
AUX Port |
Wire Shrink Wrap |
Rubber Grommits |
Case Lock(s) |
A list of 3D printed parts needed to build the Lambda Cyberdeck:
Part | Material Cost | Print Time |
---|---|---|
Innards | 48g | 05H 25M |
Top Left | 90g | 09H 51M |
Top Right | 74g | 07H 53M |
Bottom Left | 126g | 13H 15M |
Bottom Right | 114g | 12H 05M |
Tray Left | 147g | 11H 56M |
Tray Right | 147g | 11H 49M |
Tray Mini Rods | 1g | 00H 07M |
Percentage of 1kg spool used: 74.7%
Total grams of PLA filament: 747g
Total Print Time: 72H 21M (4341 Minutes)
Estimated Electricity Usage: 21.705 kilowatt-hours
[ Index ]
Seperated into two large panel to be able to print in smaller 3D printers, the top panels can easily be combined with screws and nuts. One could also use glue to combine the two pieces together or modify the design to be a single piece.
- Use 5 - 12mm M3 screws and nuts to combine left and right panels together in the middle.
- Use 4 - 6mm M3 flat head screws to secure screen to the middle of the left and right panels.
- Use 8 - 6mm M3 screws with washers to secure the speakers to the left and right panels.
- Use 2 - 12mm M3 screws and nuts to secure the antennas into the right side panel.
- Use 14 - 6-12mm flat head M3 screws to attach the top panel into the case.
The bottom panels are also seperated into two large pieces to be able to print in smaller 3D printers.
- Use 3 - 12mm M3 screws and nuts to combine left and right panels together in the middle.
- Use 9 - 16mm M3 screws and nuts to attach the port tray to the bottom panel.
- Use 4 - 6mm M3 screws to attach the Raspberry Pi to the bottom panel.
- Use 18 - 6-12mm flat head M3 screws to attach the bottom panel into the case.
The keyboard tray is designed to hold a Logitech Pebble Keys 2 K380s Bluetooth Keyboard perfectly, including its slope. The tray is seperated into two large pieces to again be able to print in smaller 3D printers. but could be combined into one peice if desired.
- Use 3 - 8mm (less than 3mm radius) small 3D printed rods to combine left and right pieces together in the middle, glue.
- Use 3 - 152.4mm (6") (less than 6.5mm radius) wooden dowels to combine left and right pieces together in the middle, glue.
[ Index ]
-
Download the Raspberry Pi Imager: https://www.raspberrypi.com/software/
-
Install Raspberry Pi OS image on your microSD card.
7inch HDMI LCD (H) Display, 1024x600, IPS
-
Open the config.txt file in the root directory of the SD card.
-
Add the following lines to the end of config.txt:
hdmi_force_hotplug=1 config_hdmi_boost=10 hdmi_group=2 hdmi_mode=87 hdmi_cvt 1024 600 60 6 0 0 0
-
Save and eject the SD card safely.
Run the following commands to update the Raspberry Pi OS and firmware:
# Update package lists
sudo apt update
# Upgrade all installed packages
sudo apt full-upgrade
# Update the firmware
sudo rpi-update
# Reboot the Raspberry Pi
sudo reboot
Fan | Raspberry Pi 4 |
---|---|
Red | Pin 4 (5V) |
Black | Pin 6 (GND) |
Blue | Pin 8 (GPIO 14) |
Once you have connected your fan, by default it will be on whenever your Raspberry Pi is running. You can configure it to turn on only when your Raspberry Pi reaches a temperature that you choose.
Using a recent version of Raspberry Pi OS, first update to retrieve any recent changes to the operating system:
-
Open the Terminal, either from the Start menu (click the Raspberry Pi icon in the top left corner) or by pressing Control + Alt + T.
-
Type
sudo apt update
and then, when the update has finished, typesudo apt full-upgrade
.
Then open the Raspberry Pi Configuration tool:
-
Click on the Raspberry Pi icon in the top left corner and select Preferences then Raspberry Pi Configuration.
-
Select the Performance tab.
-
Next to Fan, click Enabled.
-
If you have connected your fan as shown above, the default of 14 for Fan GPIO does not need to be changed.
-
Select the Fan Temperature at which you want your fan to turn on. The default is 80°C, which will stop the Raspberry Pi throttling on difficult tasks without having the fan on all the time.
-
Run the following scripts at the root
/
directory to install the RTL-SDR drivers:echo "Removing any existing rtl-sdr-blog directory..." [ -d rtl-sdr-blog ] && rm -rf rtl-sdr-blog echo "Removing existing RTL-SDR packages..." sudo apt purge ^librtlsdr sudo rm -rvf /usr/lib/librtlsdr* /usr/include/rtl-sdr* /usr/local/lib/librtlsdr* /usr/local/include/rtl-sdr* /usr/local/include/rtl_* /usr/local/bin/rtl_* echo "Updating and upgrading system packages..." sudo apt update sudo apt upgrade -y echo "Installing RTL-SDR software..." sudo apt-get install libusb-1.0-0-dev git cmake pkg-config 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 echo 'blacklist dvb_usb_rtl28xxu' | sudo tee --append /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf
-
Copy the file
sdr-plus-plus-install.sh
to the/home/<USER>
folder. -
Open home directory
/home/<USER>
, then run the filesdr-plus-plus-install.sh
to install the SDR++ software: Double click on the file and selectRun in Terminal
. This process will take about 20 minutes to complete and you must be connected to the internet.
Note if you get an error "etc/sudoers.d/010_pi-nopasswd:1:8: syntax error Mr Red ALL=(ALL) NOPASSWD: ALL" running these scripts run sudo visudo -f /etc/sudoers.d/010_pi-nopasswd
and update line to "mr-red ALL=(ALL) NOPASSWD: ALL". You might have to rerun the scripts after this.
-
Reboot the system.
-
Run the software by clicking on the Start menu, then Other, and then SDR++. Right click on the icon and select Add to Desktop to create a shortcut on the desktop for easy access.
-
When you run the software it might be too big for the screen, use the keyboard shortcut
F11
to shrink it to full screen. Using the Logitch Pebble Keys 2 K380s, make sure to enable the F keys by pressingFn + Esc
. -
In SDR++ set the source to
RTL-SDR
and the default gain to14.4 dB
.
An example for finding an FM station steps would be:
-
Set the frequency to
97.7 MHz
(a local FM station frequency). -
Set the mode to
WFM
. -
Set the bandwidth to
200 kHz
.
Rotary Encoder | Raspberry Pi 4 |
---|---|
S1 | Pin 37 (GPIO 26) |
S2 | Pin 39 (GND) |
A | Pin 31 (GPIO 6) |
B | Pin 29 (GPIO 5) |
C | Pin 25 (GND) |
# ROTARY ENCODER PINOUT
|-[ S1 ]-[ S2 ]-|
|...BOTTOM.OF...|
|....ROTARY.....|
|....ENCODER....|
|-[A]--[C]--[B]-|
# RASPERRY PI 4B PINOUT
-----------
3V3 Power - | 01 | 02 | - 5V Power
GPIO 2 (SDA1) - | 03 | 04 | - 5V Power
GPIO 3 (SCL1) - | 05 | 06 | - GND
GPIO 4 (GCLK0) - | 07 | 08 | - GPIO 14 (TXD)
GND - | 09 | 10 | - GPIO 15 (RXD)
GPIO 17 - | 11 | 12 | - GPIO 18 (PCM_CLK)
GPIO 27 - | 13 | 14 | - GND
GPIO 22 - | 15 | 16 | - GPIO 23
3V3 Power - | 17 | 18 | - GPIO 24
GPIO 10 (MOSI) - | 19 | 20 | - GND
GPIO 9 (MISO) - | 21 | 22 | - GPIO 25
GPIO 11 (SCLK) - | 23 | 24 | - GPIO 8 (CE0)
GND - | 25 | 26 | - GPIO 7 (CE1)
GPIO 0 (ID_SD) - | 27 | 28 | - GPIO 1 (ID_SC)
GPIO 5 - | 29 | 30 | - GND
GPIO 6 - | 31 | 32 | - GPIO 12 (PWM0)
GPIO 13 (PWM1) - | 33 | 34 | - GND
GPIO 19 (PCM_FS) - | 35 | 36 | - GPIO 16
GPIO 26 - | 37 | 38 | - GPIO 20 (PCM_DIN)
GND - | 39 | 40 | - GPIO 21 (PCM_DOUT)
-----------
- Copy the following files from the
Scripts
:
-
rotary_encoder.py
- Python script to read the rotary encoder and send input to the system. -
rotary_encoder.service
- Systemd service file to run the script on startup.
These scripts will be initially copied to /home/<USER>/Scripts
and then moved to /etc/systemd/system/
to run on startup.
# Create a new directory for the scripts IN `/home/<USER>/Scripts`
mkdir ~/Scripts
# Copy the Scripts folder from the USB Flash Drive to the Raspberry Pi
cp -r /media/<USER>/<USB>/Scripts ~/
- Open a terminal and navigate to the new
~/Scripts
directory:
cd ~/Scripts
- Run the following command to make the rotary_encoder.py script executable:
sudo chmod +x rotary_encoder.py
-
Open the file
rotary_encoder.service
and replace<USER>
with your username. -
Copy the rotary_encoder.service file to the /etc/systemd/system/ directory:
sudo cp rotary_encoder.service /etc/systemd/system/
- Run the following to install and update all assets needed for these new scripts to run:
# Update package lists
sudo apt update
# Install Python 3, pip3, and the required packages
sudo apt install -y python3 python3-pip python3-pigpio
# Enable and start the pigpio daemon
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
# Install evdev in the global Python environment
sudo apt install python3-evdev
# sudo pip3 install evdev # ERROR
sudo chown <USER>:<USER> /home/<USER>/Scripts/rotary_encoder.py
sudo chmod +x /home/<USER>/Scripts/rotary_encoder.py
# Add the <USER> to the input group to grant access to `/dev/uinput`.
sudo usermod -aG input <USER>
# Create a udev rule to set the correct permissions for `/dev/uinput`.
# This ensures that the device file has the necessary permissions every time the system boots.
sudo nano /etc/udev/rules.d/99-uinput.rules
# Add the following line to the file.
# Save and exit the file (Ctrl + X, then Y, then Enter).
KERNEL=="uinput", MODE="0660", GROUP="input"
# Reload the udev rules to apply the changes
sudo udevadm control --reload-rules
sudo udevadm trigger
# Add User to input Group
sudo usermod -aG input <USER>
# Reboot the System
sudo reboot
- Run the following command to enable the service to run on startup:
sudo systemctl enable rotary_encoder.service
- Run the following command to start the service immediately:
sudo systemctl start rotary_encoder.service
- Run the following command to check the status of the service:
sudo systemctl status rotary_encoder.service
Note: To stop the service, run the following command:
sudo systemctl stop rotary_encoder.service
[ Index ]
This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0) License. See the LICENSE.md file for the pertaining license text.
SPDX-License-Identifier: CC-BY-NC-4.0
[ Index ]
Thanks for checking out my Lambda Cyberdeck project! I hope you found this guide helpful and you had fun building your own cyberdeck. I had a lot of fun figuring all of this out and getting all put together, and may create more in the future. If you have any questions or need help with your build, feel free to reach out to me.
Type | Info |
---|---|
webmaster@codytolene.com | |
https://www.buymeacoffee.com/codytolene | |
bc1qfx3lvspkj0q077u3gnrnxqkqwyvcku2nml86wmudy7yf2u8edmqq0a5vnt |
Fin. Have a good day friend!
Cody Tolene