Skip to the content
PCBKitNew board
2 layersPicoDeck, the printed circuit board in 3D

physical userinterface for Picoscope 7 software to improve user experience

Copper layers
2
Thickness
1.6 mm
Parts
2
Nets
57
Pads
58
Tracks, vias
0, 0
Routed
Not yet
KiCad
KiCad 10.0 (file 20260206)
Created
30 Mar 2025
Updated
28 Oct 2026

Overview

PicoDeck is an open-source printed circuit board by tronicbaumi, from the tronicbaumi/PicoDeck repository on GitHub, published under the BSD-3-Clause licence. It is a 2-layer board with 2 parts on 57 nets.

It belongs with the AVR (ATmega, ATtiny) boards of this library.

README

README.md

PicoDeck

A small USB control panel for PicoScope 7, built around an Arduino Micro (ATmega32u4). It enumerates as a USB HID keyboard and turns two rotary encoders and four push buttons into the keyboard shortcuts PicoScope uses for amplitude, offset, filter, time base, trigger and pre-trigger. A 0.96" 128x64 OLED shows the active channel and the current encoder modes.

text
  +--------------------------------------------+
  |        [ OLED 128x64  "PicoDECK" ]         |   <- sloped top face
  |          CH 1            AMP     TIME      |
  |                                            |
  |        (ENC1)                (ENC2)        |
  |                                            |
  |   (BTN1)  (BTN2)  (BTN3)  (BTN4)           |
  +--------------------------------------------+

Repository layout

FolderContentState
fw/PicoDeck/Arduino firmware (.ino tabs + headers)working
mec/PicoDeck/OpenSCAD housing (PicoDeck.scad), OLED datasheet, helper libraries (BOSL2, MCAD, Write)working
hw/Early KiCad / Fritzing descriptions (.net, .fz), empty KiCad project in hw/PicoDeck/outdated, see Known gaps
doc/Screenshots, PicoScope 7 / Pico logos, Eagle-style script exports (bom.scr, pcb.scr, sch.scr), title pagereference
sw/PC softwareplaceholder, empty

Hardware

Parts

QtyPartNotes
1Arduino Micro (ATmega32u4, 5 V / 16 MHz)native USB, Keyboard library
1OLED 0.96" 128x64, SSD1306, I2C4 pin module, address 0x3C, 27.3 x 27.3 mm
2Rotary encoder with push button (KY-040 / EC11 style)8 mm mounting holes in the housing
4Momentary push button8 mm mounting holes in the housing
4M3 screws (about 8-10 mm)fix the base plate

Pin assignment (as defined in fw/PicoDeck/general.h)

FunctionArduino pinNotes
OLED SDAD2hardware I2C of the Micro
OLED SCLD3hardware I2C of the Micro
ENC1 SW / DT / CLKD4 / D5 / D6INPUT_PULLUP, active low
ENC2 SW / DT / CLKD7 / D8 / D9INPUT_PULLUP, active low
BTN1D10INPUT, external pull-up required, active low
BTN2D14as above
BTN3D15as above
BTN4D16as above

Power: 5 V and GND from the Micro to the OLED and encoder modules. All switches connect between the pin and GND. The OLED reset pin is shared with the Arduino reset (OLED_RESET = -1).

Firmware

Build

Board: Arduino Micro (arduino:avr:micro). Libraries (Library Manager):

  • Adafruit SSD1306 (pulls in Adafruit GFX Library and Adafruit BusIO)
  • Adafruit GFX Library
  • Adafruit SleepyDog Library (included, currently not used functionally)
  • Keyboard and Wire/SPI ship with the Arduino AVR core
text
arduino-cli lib install "Adafruit SSD1306" "Adafruit GFX Library" "Adafruit SleepyDog Library"
arduino-cli compile --fqbn arduino:avr:micro fw/PicoDeck
arduino-cli upload  --fqbn arduino:avr:micro -p COMx fw/PicoDeck

The display type is selected in general.h (OLED64_09 = 0.96" 128x64 is the default; OLED32 and OLED64_13 are prepared but commented out).

Source files

FilePurpose
PicoDeck.inosetup() / loop(); polls encoders and buttons every pass, prints the encoder state to the serial port once per second (MAIN_TIME)
general.hpin definitions, key assignments, display config, state variables, structs
ENCODER.inoquadrature decoding (transition table, 4 sub-steps = 1 detent), switch debounce, mode switching, USB key output
BUTTONS.inobutton polling with debounce, key is typed on release
OLED.inodisplay init (PicoScope 7 logo for 2 s) and the three redraw functions
logo.hPicoScope 7 start-up bitmap
GPIO.ino, LOGGER.inoempty placeholders

Debounce time is 25 ms (SW_DEBOUNCE_MS). Serial debug output runs at 115200 baud.

Operation

The deck keeps a current channel (CH 1..4) and, per channel, an encoder 1 mode. Encoder 2 has one global mode.

Buttons (key sent on release)

ButtonPinAction
BTN1D10Space
BTN2D142
BTN3D15cycles the channel CH 1 -> 2 -> 3 -> 4 -> 1 (no key sent)
BTN4D16X

Encoder 1 - channel settings. Pressing its switch cycles the mode of the current channel: AMP -> OFF -> FLT -> AMP.

ChannelAMP: CW / CCWOFF (offset)FLT (filter)
CH 1q / 1Shift + key, directions swappedAlt + key
CH 2w / 2as aboveas above
CH 3e / 3as aboveas above
CH 4r / 4as aboveas above

Entering and leaving FLT additionally sends Alt + a / s / d / f for channel 1 / 2 / 3 / 4, which toggles the filter dialog in the same way on both transitions.

Encoder 2 - time base and trigger. Its switch cycles TIME -> TRIG -> PRE -> TIME.

ModeCWCCW
TIMEUp arrowDown arrow
TRIG (trigger level)bv
PRE (pre-trigger)mn

The key tables are at the top of general.h (buttons, encoder fallback keys) and in ENCODER.ino (enc1CtrlCW/CCW, enc1FltEnter, Send_Rotation). Adjust them if your PicoScope shortcut set differs.

Display

Text size 2 (12 x 16 px per character) on a 128 x 64 screen:

Row (y)Content
0PicoDECK header, centered
24CH x
48 leftmode of encoder 1 on the current channel: AMP / OFF / FLT
48 rightmode of encoder 2: TIME / TRIG / PRE

After power-up the PicoScope 7 logo is shown for 2 seconds.

Housing (OpenSCAD)

mec/PicoDeck/PicoDeck.scad generates a wedge-shaped desktop housing in two parts: the top shell and a separate base plate. Render with OpenSCAD (tested with the nightly build); no external libraries are needed by this file.

Select what to render with the part variable at the top of the file: both (side by side, default), assembly, top, or bottom.

Main dimensions (all parameters at the top of the file)

ParameterDefaultMeaning
W120 mmwidth
D80 mmdepth
Hf / Hb20 / 60 mmheight front / back (slope about 26.6 degrees)
r3 mmedge radius of the top shell (the base plate edges are not rounded)
t2.4 mmwall thickness

Controls on the sloped face

Positions are measured along the slope, s = distance from the front edge. Holes are perpendicular to the face.

ElementParametersDefault
4 push buttons, 8 mmbtn_s, btn_pitch, btn_ds = 12 mm, 22 mm pitch, centered
2 encoders, 8 mmenc_s, enc_pitch, enc_ds = 36 mm, 40 mm pitch, centered
OLED windowoled_s, oled_win, oled_win_dys = 66 mm, 22.4 x 11.6 mm, offset +1.76 mm

OLED mounting (from the datasheet in mec/PicoDeck/)

ItemDatasheetIn the model
PCB27.3 x 27.3 mm (+-0.5)pocket 28.0 x 28.0 mm (oled_mod)
Active area21.74 x 10.86 mmwindow 22.4 x 11.6 mm (about 0.35 mm margin)
Active area position1.76 mm from PCB center towards the pin headeroled_win_dy = 1.76
Mounting holes4 x 2.5 mm, pitch 20.7 x 23.2 mm4 pegs 2.2 mm with 3.4 mm seats (oled_hole, oled_peg_d, oled_boss_d)

Assumptions that are not in the datasheet: PCB 1.0 mm thick, glass stack about 1.4 mm (oled_pcb_t, oled_boss_h = 1.6), module mounted with the pin header towards the back of the housing. Rotating the module by 180 degrees means oled_win_dy = -1.76.

Assembly

  • The base plate has a centering lip and snap bumps on all four sides that click into grooves on the inner wall of the top shell (tol, bump and groove sizes are tunable).
  • Four screw posts hang from the roof of the shell and are connected to the side and front/back walls by 2 mm ribs. Pilot hole 2.6 mm for M3 self-tapping screws; the base plate has 3.4 mm countersunk holes, screws go in from below.
  • The base plate carries 4 standoffs (6 mm diameter, 6 mm high, 2.6 mm blind pilot hole for M3) for a 70 x 50 mm prototyping PCB. The board is centered in x and sits against the back wall (3 mm gap); the holes are 3 mm from the board edges (pcb_size, pcb_hole_in, pcb_post_d, pcb_post_h, pcb_screw_d, pcb_back). Hole positions: x = 28 / 92 mm, y = 27.6 / 71.6 mm with the default housing. Check them against your board and adjust pcb_hole_in if its holes are placed differently.
  • The back wall has a USB-C opening (13 x 7.5 mm, rounded) centered in x. Its height is computed for an Arduino Micro plugged into single-row female headers on the prototyping PCB: 6 mm standoff + 1.6 mm PCB + 8.5 mm header + 1.6 mm Micro PCB + half of the 3.2 mm connector = connector center at about z = 19.3 mm. Adjust header_h, pcb_t, micro_t, usb_conn_h, usb_cut and usb_x if your parts differ.
  • Print the top shell open side down; the sloped roof needs supports. Print the base plate flat.
  • part = "assembly" shows the closed housing for checking fit.

Known gaps

  • hw/ still describes an earlier pin assignment (encoders on D8-D13, buttons on D4-D7 with internal pull-ups). The netlist (arduino_micro_panel.net), Fritzing description (arduino_micro_panel.fz) and the helper READMEs hw/README_KiCad.md / hw/README_FZ.md do not match the current firmware in general.h. The KiCad project in hw/PicoDeck/ is an empty skeleton.
  • The firmware expects external pull-ups on D10, D14, D15 and D16.
  • The firmware uses polling in loop() (no pin-change interrupts), so very fast encoder turns can lose steps if the loop is delayed. The Send_Combo helper blocks for about 90 ms per modifier keystroke.
  • sw/ is a placeholder.

License

See LICENSE.

Parts

2
QtyValueFootprintReferences
1Arduino_Pro_MiniPCM_SL_Development_Boards:Arduino_pro_miniA1
1Clone_Pro_Mini_Socket_NoSPHPCM_arduino-library:Clone_Pro_Mini_Socket_NoSPHA2

Questions

What parts does the PicoDeck use?

2 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the PicoDeck KiCad files?

From the tronicbaumi/PicoDeck repository on GitHub, at the commit this page was made from: the board is hw/PicoDeck/PicoDeck.kicad_pcb and its schematic hw/PicoDeck/PicoDeck.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the PicoDeck design in my own project?

Its repository publishes it under the BSD-3-Clause licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers37 × 19 mmPassive rpi hub75-adapter, the printed circuit board in 3D

    Passive rpi hub75-adapter

    hzeller/rpi-rgb-led-matrix

    Controlling up to three chains of 64x64, 32x32, 16x32 or similar RGB LED displays using Raspberry Pi GPIO

    2 parts4.4kGPL-2.0
  • 2 layersDiode template, the printed circuit board in 3D

    Diode template

    adamws/kicad-kbplacer

    KiCad plugin for automatic keyboard's key placement and routing

    2 parts547GPL-3.0
  • 2 layers20.3 × 15.2 mmL0 button, the printed circuit board in 3D

    L0 button

    Luos-io/luos_engine

    Open-source and real-time orchestrator for cyber-physical-systems, to easily design, test and deploy embedded applications and digital twins.

    2 parts546MIT
  • 2 layers35.1 × 46.8 mmSDEX2M2 Breakout Board, the printed circuit board in 3D

    SDEX2M2 Breakout Board

    NVNTLabs/switch2-SDEX2M2

    Micro SD Express to M.2 NVME Adapter for Nintendo Switch 2

    2 parts542GPL-3.0
  • 2 layers59.3 × 36.6 mmExpansionBoardTemplate, the printed circuit board in 3D

    ExpansionBoardTemplate

    BlueSCSI/BlueSCSI-v2

    BlueSCSI v2/Ultra - an open source, open hardware, SCSI emulator using the Pi Pico PR2040 and Pico 2 RP2350

    2 parts459GPL-3.0
  • 2 layersAlpha.9mm.wire, the printed circuit board in 3D

    Alpha.9mm.wire

    ohmtech-rdi/eurorack-blocks

    Software to Hardware Prototyping for Eurorack using C++, Max/Gen~ or Faust

    2 parts410
  • 2 layers26.7 × 64 mmGpu power, the printed circuit board in 3D

    Gpu power

    dennisss/dacha

    Monorepo for awesome tools/projects/libraries

    2 parts397Apache-2.0