Community project

Build Me Raspberry Pi Dual Screen Cyberdeck Like

otieno.robind

Published August 13, 2026 · Updated August 13, 2026

Raspberry Pi Pico
Photo of Build Me Raspberry Pi Dual Screen Cyberdeck Like

This guide builds a Raspberry Pi Pico-based control panel for a dual-screen cyberdeck, featuring dual rotary encoders for volume and scroll control, four programmable macro keys, and a capacitive trackpad interface. The project combines custom PCBs, 3D-printed mechanical components, and analog input electronics into a compact, professional-grade input device that communicates with a Raspberry Pi 5 host system via USB.

Builders will receive a complete wiring diagram, detailed parts list, CircuitPython firmware with HID keyboard and mouse support, and step-by-step assembly instructions covering PCB population, mechanical assembly, enclosure construction, and functional verification. The modular design allows customization of macro key bindings and encoder behavior through straightforward firmware edits.

Wiring diagram

Interactive · read-only
Wiring diagram for Build Me Raspberry Pi Dual Screen Cyberdeck Like

Pan and zoom to explore the wiring. Remix the project to edit it in your own workspace.

Parts list

Bill of materials
ComponentQtyNotes
2 × 2 Cherry MX-compatible macro-key matrix4 keys, 4 × 1N4148 diodes1A real four-key mechanical switch matrix with four 1N4148 isolation diodes. Its row and column connections are routed to the Pico as a single assembled input module.
KY-040 Rotary Encoder ModuleVolume / mute15-pin incremental rotary encoder breakout with integrated momentary push switch. CLK and DT are the quadrature outputs; SW is the built-in push-button output and should not be modelled as a separate Push Button component.
KY-040 Rotary Encoder ModuleScroll / play-pause15-pin incremental rotary encoder breakout with integrated momentary push switch. CLK and DT are the quadrature outputs; SW is the built-in push-button output and should not be modelled as a separate Push Button component.
TMP117 Temperature SensorI2C address 0x481Texas Instruments TMP117 high-accuracy, low-power digital temperature sensor with I2C/SMBus interface. Common breakouts default to address 0x48 and are used when a precise calibrated temperature reading is more important than a cheap DHT-style reading.
Cirque Pinnacle capacitive trackpad I2C breakoutI2C address 0x2A13.3 V Cirque Pinnacle-series capacitive trackpad breakout, used as a relative USB mouse controller through the Pico.
3D-printed Pico control-panel platePETG, 2.4–3.0 mm thick1PETG front panel for the 2 × 2 macro-key matrix, two KY-040 rotary encoders, and Cirque trackpad opening. Design the cutouts from the actual modules before printing.
3D-printed Raspberry Pi Pico mounting trayPETG or PLA1PETG or PLA tray that supports the Raspberry Pi Pico using its real mounting holes or cable-tie slots, with USB connector access and harness strain relief.
3D-printed Cirque trackpad bezelPETG, 1.2–1.6 mm lip1Thin PETG bezel that retains the Cirque trackpad from behind while leaving its active surface unobstructed. Dimension it from the exact breakout and sensor overlay.
3D-printed rotary-encoder knobsPETG or PLA2Two press-fit knobs for the KY-040 encoder shafts, with an alignment mark and finger grip.
Sector 07 RPI_DEV PCB1 (control and power board)Required custom PCB1Required custom PCB populated with MOSFET, DIP switch, pushbuttons, FPC/Qwiic connectors, rotary-encoder interface, and 18 AWG 5 V hub-power leads. Manufacture from the Sector 07 released Gerber package.
Sector 07 RPI_DEV PCB2 (base interconnect board)Required custom PCB1Required custom PCB fitted with extended header, Qwiic connector, and FPC connector; sits in the base and connects PCB1 to the controls/interconnects.
Sector 07 RPI_DEV PCB3 (Raspberry Pi 5 interface board)Required custom PCB1Required custom PCB mounted on the Raspberry Pi 5. It carries the regulated 5 V barrel input, GPIO header, Qwiic/FPC connections, two HDMI paths, and USB 3.0 path.
Sector 07 RPI_DEV PCB4 USB passthroughOptional custom PCB1Optional custom PCB for the external USB passthrough; populate only the specified male USB connector.
PCF8591 analog-to-I2C converter moduleLinear-potentiometer interface1Sector 07 input module converting the linear potentiometer voltage to I2C for the Pi 5 integration board.
Sector 07 linear potentiometer3-wire analog input1Three-wire linear potentiometer used as an analog control through the PCF8591 module.
Sector 07 compatible HDMI monitor assembliesExact BOM-specified model required2Two matching monitors installed in the Sector 07 front/back printed cases and connected to the Pi 5 through HDMI and USB cables. Purchase only the exact monitor model stated by the Sector 07 BOM.
Sector 07 internal USB hubBOM-specified hub1Modified internal USB hub feeding the keyboard and both monitor USB links, with its 5 V supply brought to PCB1 as specified by Sector 07.
Sector 07 keyboard moduleExact BOM-specified keyboard1USB keyboard installed in the Sector 07 base and connected to the internal USB hub.
Sector 07 printed Left BaseMatte PLA1Licensed Sector 07 RPI_DEV printable base shell part.
Sector 07 printed Center BaseMatte PLA1Licensed Sector 07 RPI_DEV printable base shell part.
Sector 07 printed Right BaseMatte PLA1Licensed Sector 07 RPI_DEV printable base shell part.
Sector 07 printed base I/O parts setMatte PLA; six specified pieces6Six discrete licensed printed parts: EXT IO Cover, Micro SD Cover, PCB Spacer, EXT PCB Latch, Cable Anchor, and Port Frame.
Sector 07 printed housing and cover panels setMatte PLA; eight specified pieces8Eight discrete licensed printed parts: left/right housing covers, left/right cover panels, center cover, USB latch cover, camera-slot cover, and speaker cap.
Sector 07 printed controls setOrange/Matte PLA; nine specified pieces9Nine discrete licensed printed controls: slider button, slider switch case, power-switch button, power-switch mount, aux button, and five screen buttons.
Sector 07 printed cable and port parts setMatte PLA; four specified pieces4Four discrete licensed printed parts: HDMI Cover, Eject One, Pi 5 Eject Two, and USB 3.0 Cover. Do not use the included Pi 4 Eject Two for this Pi 5 build.
Sector 07 printed monitor case partsMatte PLA; two monitor pairs4Four discrete licensed printed parts: two front cases and two back cases, one pair per monitor.
Sector 07 printed monitor rotary hinge partsMatte PLA; 80% infill arms5Five discrete licensed printed parts: left/right rotary hinges, rotary knob, left/right arms.
Sector 07 printed monitor support partsMatte PLA3Three discrete licensed printed parts: left arm cover, right arm cover, and center brace.
Raspberry Pi 5 host computerExact RAM variant per Sector 07 BOM1The Linux host computer for the Sector 07 RPI_DEV cyberdeck. It is mechanically/electrically integrated through the released PCB3; Schematik does not deploy its Linux software.
Sector 07 mechanical hardware packUse exact sizes/counts from Sector 07 BOM1M3/M5 screws, heat-set inserts, M5 locknuts, 12 mm metal dowel pins, ball bearings, threadlocker, and optional underside rubber pads specified by the Sector 07 assembly guide.

Assembly

11 steps
  1. Observe the Sector 07 license and collect the released packages

    Build this as a personal, non-commercial project under the CC BY-NC 4.0 license: credit Sector 07 and do not sell the design or derivative files. Download the Sector 07 RPI_DEV 3D-print archive, editable base STEP archive, Gerber/order archives for PCB1–PCB4, matching PCB order-parameter PDFs, and the original BOM. Use the original BOM as the authority for exact monitor, keyboard, cable, connector, and Raspberry Pi 5 variants.

    • Tip: The required-only budget supplied is about $728.14 before shipping, tax, and unlisted filament.
    • Tip: PCB4 is an optional USB passthrough board; PCB1, PCB2, and PCB3 are required.
    • This project is an integration record for the Pi 5 cyberdeck. Schematik deploys only the optional Raspberry Pi Pico controller, not the Raspberry Pi 5 Linux operating system.
    • Do not substitute a monitor or PCB revision without checking it against Sector 07's original BOM and CAD.
  2. Print the complete Sector 07 enclosure set

    Print the 42 released STL pieces at 0.2 mm layer height with 20% infill, supports where the model requires them, and ironing on flat visible surfaces. Use grey/white matte PLA for normal body pieces and orange PLA for accents where intended. Print the left, center, and right base; six base I/O parts; eight housing/panel parts; nine button/control parts; four cable/port parts; two front and two back monitor cases; the five rotary/arm parts; and the three monitor-support parts.

    • Tip: Use 80% infill for the printed monitor arms; the remaining regular parts use 20%.
    • Tip: Start printing before electronics work because the enclosure is the longest lead-time portion.
    • Tip: Use the eight released base/housing STEP files only if a physical part must be modified before printing.
    • Clean all support-contact surfaces before attempting the base snap-tabs. The pieces should be snug, never forced.
    • Do not use the Pi 4 version of Eject Two; print/use the Pi 5 Eject Two.
  3. Install inserts and prepare mechanical hardware

    Install the specified M3 heat-set inserts in the printed parts with a temperature-controlled soldering iron. Collect the exact M3/M5 fasteners, M5 locknuts, 12 mm dowel pins, ball bearings, and threadlocker listed by Sector 07. Tap only the locations the designer specifies, including the center-brace M5 holes and the monitor-arm M3 holes.

    • Tip: Drive each insert straight and flush; let the plastic cool fully before installing screws.
    • Tip: A very small amount of bearing grease in the roller channels is optional and may reduce noise.
    • Do not tap beyond the specified thread depth; overshooting can split or strip the printed part.
    • Keep grease away from monitor panels, cable contacts, and plastic snap joints.
  4. Order and populate the custom PCB set

    Order PCB1, PCB2, and PCB3 from their released Gerber archives using the corresponding Sector 07 order-parameter PDFs; order PCB4 only if you want the external USB passthrough. Populate PCB1 with the MOSFET, DIP switch, pushbuttons, FPC connector, Qwiic connector, and 18 AWG power leads. Populate PCB2 with its extended header, Qwiic connector, and FPC connector. Populate PCB3 with the 5 V barrel jack, Qwiic connector, FPC connector, and right-angle header. PCB4 needs its specified male USB connector.

    • Tip: Use flux, magnification, a fine tip, and continuity testing for every FPC connector.
    • Tip: Use an FPC breakout/test fixture to check for adjacent-pin shorts and opens before installation.
    • FPC connectors are fine-pitch and hand-solder-hostile; do not power a board until it has passed a visual inspection and continuity test.
    • PCB3 is for regulated 5 V only; never inject an unregulated battery or 9–12 V source.
  5. Prepare the hub and analog-control electronics

    Following the released Sector 07 diagram, prepare the specified internal USB hub: remove its stock 5 V barrel jack and USB 3.0 jack only if your exact BOM-specified hub and the released instructions require this modification. Leave enough of the factory USB cable to reach the Pi, solder its specified 18 AWG power leads, and build the female-to-male USB breakout cable as documented. Desolder the rotary-encoder header and solder its ribbon directly. Solder three leads to the linear potentiometer, then connect it to the PCF8591 analog-to-I2C module.

    • Tip: Use short factory-made HDMI/USB assemblies for high-speed links; do not hand-wire USB or HDMI signal pairs.
    • Tip: Label each power, USB, FPC, and Qwiic cable before routing it into the base.
    • Hub modifications void its warranty and can destroy the hub if pad polarity or cable shielding is wrong.
    • Keep the 5 V power wiring physically separate from fine FPC and Qwiic wiring where possible.
  6. Assemble both monitor modules and rotating arms

    Install inserts in the rotary mounts; attach the support arm to the left and right rotary mounts with M5 × 10 mm flat-head screws. Insert ball bearings into the channels, attach each back case to its rotary mount at the center holes, and temporarily retain printed buttons with painter's tape. Angle each exact BOM-specified monitor into its front case, respecting the half-circle PCB clearances, then snap the back-case/rotary assembly evenly onto it. Fit the HDMI and USB 90-degree adapters, route the cables through the arms and cable support with rotation slack, add arm covers, and install 12 mm dowel pins.

    • Tip: Test monitor-arm movement through its full intended range before closing the arm covers.
    • Tip: Leave a gentle cable loop at every moving joint to prevent fatigue.
    • Monitor arm covers are fragile; begin installation at the 90-degree bend and avoid prying.
    • Do not pinch HDMI or USB cables in the rotary channels.
  7. Build the base and install internal boards

    Snap the three base shells together through their 90-degree tabs after removing all support remnants. Route monitor USB/HDMI leads through the arm channels. Insert the locking tab, install PCB2 at the required steep angle and rotate it down, then install the rotary encoder and its knob. Mount the USB breakout, PCB1/spacer assembly, and USB hub. Feed the labeled FPC, Qwiic, rotary, and power harnesses through the designated access slot and wireway, following the released electrical diagram exactly.

    • Tip: The 500 mm FPC from PCB1 is tight by design; fold it lengthwise only as Sector 07 specifies and never crease its conductive traces.
    • Tip: Measure monitor USB leads in place before cutting/soldering any intended power-injector assemblies.
    • If a tab does not seat with modest pressure, stop and remove remaining support material or lightly sand the contact face.
    • Never pull on an FPC by its cable; release its connector latch first.
  8. Install PCB3, the Pi 5, displays, and analog input

    Connect the HDMI and USB paths through the printed ejection/retention pieces, then press PCB3 onto the Raspberry Pi 5 and place the assembly in the base. Connect the long FPC to PCB3. Install the linear potentiometer under the right cover, put the PCF8591 in its right-base location, and connect its Qwiic cable to PCB3. Connect the hub upstream cable to the Pi 5 through PCB3, then connect the keyboard and both monitor USB links to the hub. Finally, attach the monitor arms to the base with M5 × 18 mm bolts and locknuts.

    • Tip: Perform one final visual check that both micro-HDMI ends and the USB 3.0 lead are fully retained before closing covers.
    • Tip: Use zip ties sparingly and keep service loops so PCB3 and the Pi can be removed later.
    • Do not connect or remove the Pi 5 while power is present.
    • The original Sector 07 system uses PCB controls and PCF8591; it does not require the optional Pico controller.
  9. Verify the regulated 5 V rail before the first Pi power-on

    With the Raspberry Pi disconnected, set the external supply approximately to the Sector 07 stated 5.3 V and connect it to PCB3's barrel input. Measure voltage at PCB3 and at the Pi-side 5 V input path; the stated target at PCB3 is 5.1 V DC. Only after the measurement is correct should you disconnect power, install the Pi, and perform the first boot through the front power switch.

    • Tip: A multimeter check should include polarity and continuity from the barrel jack to the intended 5 V/GND pads.
    • Tip: The slightly elevated supply setting is intended to compensate for path voltage drop; measure rather than relying on the dial.
    • Do not attach the 3S LiPo/BMS concept supplied earlier to this 5 V input. It is a different, unvalidated power design.
    • Immediately remove power if the measured voltage is out of range, polarity is reversed, a component warms unexpectedly, or there is a short.
  10. Close the enclosure and perform functional checks

    Tidy the wiring without constricting arm movement, snap on the right and center covers, add button caps and the left cover, install the camera/access and expandable-I/O covers, and install the microSD and its cover. Add optional rubber feet. Boot the Pi and verify both displays, keyboard, hub ports, screen buttons, rotary control, linear potentiometer, and external I/O one function at a time.

    • Tip: Photograph internal cable routing before installing final covers for future maintenance.
    • Tip: For Pi-side software, use the official Sector 07 software/repository instructions once identified; this project does not invent missing Linux package commands.
    • Do not force covers over a trapped cable or a board that is not fully seated.
    • The provided notes do not identify the exact Pi GUI/software repository, so do not assume arbitrary packages will enable the custom controls.
  11. Optional: integrate the existing Pico USB HID control panel

    The pre-existing Raspberry Pi Pico macro/encoder/Cirque trackpad assembly is an optional USB HID accessory, not a Sector 07 original subsystem. Assemble and bench-test it using its separate panel/tray, power all Pico peripherals at 3.3 V, then connect the Pico to a spare internal hub port with a factory USB cable. It presents keyboard, consumer-control, and mouse HID devices to the Pi 5 without a Pi GPIO connection.

    • Tip: Use Schematik's Deploy button only for this Pico firmware.
    • Tip: Keep the Pico panel removable and away from moving monitor-arm cables.
    • Do not tie Pico USB 5 V and the Pi 5 GPIO 5 V together.
    • The custom Cirque driver may require bench adjustment for the exact trackpad breakout revision.

Pin assignments

Board wiring reference
PinConnectionType
GPIO 14macro_matrix_1 ROW1digital
GPIO 15macro_matrix_1 ROW2digital
GPIO 20macro_matrix_1 COL1digital
GPIO 21macro_matrix_1 COL2digital
3V3encoder_volume VCCpower
GNDencoder_volume GNDground
GPIO 8encoder_volume CLKdigital
GPIO 9encoder_volume DTdigital
GPIO 10encoder_volume SWdigital
3V3encoder_scroll VCCpower
GNDencoder_scroll GNDground
GPIO 11encoder_scroll CLKdigital
GPIO 12encoder_scroll DTdigital
GPIO 13encoder_scroll SWdigital
3V3tmp117_1 VINpower
GNDtmp117_1 GNDground
GPIO 4tmp117_1 SDAi2c
GPIO 5tmp117_1 SCLi2c
3V3cirque_trackpad_1 VCCpower
GNDcirque_trackpad_1 GNDground
GPIO 4cirque_trackpad_1 SDAi2c
GPIO 5cirque_trackpad_1 SCLi2c

Firmware

Raspberry Pi Pico
code.pyDeploy to device
import time
import board
import busio
import digitalio
import keypad
import rotaryio
import usb_hid

from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.consumer_control import ConsumerControl
from adafruit_hid.consumer_control_code import ConsumerControlCode
from adafruit_hid.mouse import Mouse

# Physical wiring, using only Pico GPIOs assigned in this project.
MATRIX_ROW_PINS = (board.GP14, board.GP15)
MATRIX_COL_PINS = (board.GP20, board.GP21)
VOLUME_CLK = board.GP8
VOLUME_DT = board.GP9
VOLUME_SW = board.GP10
SCROLL_CLK = board.GP11
SCROLL_DT = board.GP12
SCROLL_SW = board.GP13
I2C_SDA = board.GP4
I2C_SCL = board.GP5

keyboard = Keyboard(usb_hid.devices)
consumer = ConsumerControl(usb_hid.devices)
mouse = Mouse(usb_hid.devices)

# F13 through F16 leave ordinary keyboard shortcuts untouched.
MACRO_MAP = {
    (0, 0): Keycode.F13,
    (0, 1): Keycode.F14,
    (1, 0): Keycode.F15,
    (1, 1): Keycode.F16,
}
matrix = keypad.KeyMatrix(
    row_pins=MATRIX_ROW_PINS,
    column_pins=MATRIX_COL_PINS,
    columns_to_anodes=False,
    interval=0.02,
)

encoder_volume = rotaryio.IncrementalEncoder(VOLUME_CLK, VOLUME_DT)
encoder_scroll = rotaryio.IncrementalEncoder(SCROLL_CLK, SCROLL_DT)
volume_switch = digitalio.DigitalInOut(VOLUME_SW)
volume_switch.switch_to_input(pull=digitalio.Pull.UP)
scroll_switch = digitalio.DigitalInOut(SCROLL_SW)
scroll_switch.switch_to_input(pull=digitalio.Pull.UP)

volume_last = encoder_volume.position
scroll_last = encoder_scroll.position
volume_switch_last = True
scroll_switch_last = True

i2c = busio.I2C(I2C_SCL, I2C_SDA)

# The TMP117 is optional. Its absence must not prevent HID operation.
tmp117 = None
try:
    import adafruit_tmp117
    tmp117 = adafruit_tmp117.TMP117(i2c)
except (ImportError, OSError, RuntimeError):
    pass

# Cirque Pinnacle I2C breakout. The supplied design specifies address 0x2A.
# This driver operates it in relative-coordinate feed mode.
PINNACLE_ADDR = 0x2A
REG_STATUS1 = 0x02
REG_FEED_CONFIG1 = 0x04
REG_FEED_CONFIG2 = 0x05
REG_PACKET_BYTE0 = 0x12


def pinnacle_write(register, value):
    i2c.writeto(PINNACLE_ADDR, bytes((0x80 | register, value)))


def pinnacle_read(register, count):
    data = bytearray(count)
    i2c.writeto_then_readfrom(PINNACLE_ADDR, bytes((0xA0 | register,)), data)
    return data


def pinnacle_init():
    pinnacle_write(REG_FEED_CONFIG2, 0x00)
    pinnacle_write(REG_FEED_CONFIG1, 0x01)


def pinnacle_packet():
    data = pinnacle_read(REG_PACKET_BYTE0, 3)
    dx = data[1] - 256 if data[1] > 127 else data[1]
    dy = data[2] - 256 if data[2] > 127 else data[2]
    pinnacle_write(REG_STATUS1, 0x00)
    return data[0] & 0x07, dx, dy


trackpad_ok = True
try:
    pinnacle_init()
except (OSError, RuntimeError):
    trackpad_ok = False

last_temperature_report = time.monotonic()

while True:
    event = matrix.events.get()
    if event:
        row, column = divmod(event.key_number, len(MATRIX_COL_PINS))
        macro_key = MACRO_MAP.get((row, column))
        if macro_key:
            if event.pressed:
                keyboard.press(macro_key)
            else:
                keyboard.release(macro_key)

    volume_now = encoder_volume.position
    while volume_now > volume_last:
        consumer.send(ConsumerControlCode.VOLUME_INCREMENT)
        volume_last += 1
    while volume_now < volume_last:
        consumer.send(ConsumerControlCode.VOLUME_DECREMENT)
        volume_last -= 1

    pressed = volume_switch.value
    if volume_switch_last and not pressed:
        consumer.send(ConsumerControlCode.MUTE)
    volume_switch_last = pressed

    scroll_now = encoder_scroll.position
    while scroll_now > scroll_last:
        mouse.move(wheel=1)
        scroll_last += 1
    while scroll_now < scroll_last:
        mouse.move(wheel=-1)
        scroll_last -= 1

    pressed = scroll_switch.value
    if scroll_switch_last and not pressed:
        consumer.send(ConsumerControlCode.PLAY_PAUSE)
    scroll_switch_last = pressed

    if trackpad_ok:
        try:
            buttons, dx, dy = pinnacle_packet()
            if dx or dy:
                mouse.move(x=dx, y=dy)
            if buttons & 0x01:
                mouse.press(Mouse.LEFT_BUTTON)
            else:
                mouse.release(Mouse.LEFT_BUTTON)
        except (OSError, RuntimeError):
            trackpad_ok = False
            mouse.release(Mouse.LEFT_BUTTON)

    if tmp117 and time.monotonic() - last_temperature_report >= 5:
        try:
            print("TMP117: {:.1f} C".format(tmp117.temperature))
        except (OSError, RuntimeError):
            pass
        last_temperature_report = time.monotonic()

    time.sleep(0.005)

“Deploy to device” opens this project in Schematik, where you can flash it to your board over USB.

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik