Kevin Santo Cappuccio 33845feb5a
Update README.md
2025-07-01 11:41:29 -07:00

35 KiB

Getting Started

guideNoHighlight

You probably want to install the app first, to get the latest firmware.

Here's a super-quick rundown of the how to use the thing:

The Probe

First, keep the switch on the probe set to Select ProbeSelect (If you're curious why: Measure mode allows the probe tip to be ±9V tolerant and routable like any other node, but as of yet, the code to actually do anything with it is unwritten so it just connects to DAC 0 and outputs 3.3V just like it was in Select mode. But the DAC is much worse at matching the RP2350B's idea of what 3.3V is exactly, so probing will be flaky and may be off from the rows you're tapping in Measure.

To Connect rows, click the Connect button on the probe

connectButton

The logo should turn blue and the LEDs on the probe should also change connect

Now any pair of nodes you tap should get connected as you make them. In connect mode, you're creating bridges (see the glossary at the bottom of this page), so connections are made in pairs. When you've tapped the first node in a pair, the logo and Connect text on the probe will brighten to show that you're "holding" a connection, and the next thing you tap will connect to that first node.

If you make a mistake while holding a connection, click the Connect button and it will clear it and take you back to the first node. If you click the Connect button while you're not holding a node, it will leave probe mode and bring you back into idle mode (rainbowy logo, all 3 probe LEDs on.)`

To connect to special functions, tap the corresponding pad near the logo, it will show you a menu on the breadboard and terminal to choose them. gpioTapped

(This is an ASCII version of what will show on the breadboard LEDs)

Screenshot 2025-05-30 at 10 55 13 AM

You can think of special functions just like any other node, there's just a second step to picking them so I didn't need to put a dedicated pad for each of them.

The other 4 user pads will be more remappable in the future, but for now, top_guy is routable UART Tx and bottom_guy is routable UART Rx. The building pads are for overriding colors in idle mode (you'll see more about that that below.)

userPads

To get out of Connect mode, press the button again.

To Remove rows, click the Remove button

removeButton and the logo should turn reddish remove

Now you can swipe along the pads or tap them one at a time. Remember it only disconnects that node and anything connected to it directly, not everything on the net. So tapping say, row 25 that's connected to GND won't clear everything connected to GND, but tapping the - on the rails (for GND) would.

The special functions work the same way, tap the pad, pick one, and it will remove it. Click the button again to get out.

Remember the probe is read by a resistive voltage divider, so putting your fingers on the pads (or the back sides of the 4 risers that connect those probe sense boards to the main board), or anything causing the probe tip not to be at a steady 3.3V will give you weird readings.

If you can't seem to stop playing with the switch on the probe, run DAC calibration with $ and the 3.3V measure mode puts out should be fairly accurate enough for probing.

The Click Wheel

wheel copy

There are two kinds of presses, click (short press) and hold (long press). In general, a click (short) is a yes, and a hold (long) is a no/back/exit/whatever.

To get to the menu, click the button and scroll through the menus, click will bring you into that menu, hold will take you back one level. If you have trouble reading stuff on the breadboard LEDs, everything is copied to the Serial terminal and the OLED (talked about below), and adjusting the brightness may help; in the menus, it's Display Options > Bright > Menu and then scroll around until you find a level you like, then click to confirm.

Behold! The App!

Screenshot 2025-05-29 at 10 01 15 PM

Now that I've lifted my self-imposed ban on VT100 commands (for compatibility and me-spending-too-much-time-on-them reasons, but, YOLO), we've got colors now!

But that's like the least cool thing the new app can do, here's a list of what's new:

  • No longer a janky pile of garbage

  • Firmware updating should be pretty reliable when there's a new version (falls back to instructions for how to do it manually)

  • Command history and tab completion, up arrows will go through past commands and are persistent after closing

  • Properly detects which port is the main Jumperless Serial and which is routable UART

  • Arduino flashing from Wokwi works once again and is a lot more solid

    • It installs arduino-cli on first startup and uses it pull in libraries, compile, and flash an arduino Nano in the header
    • If the routable UART lines aren't connected when the app detects a change in the sketch file, it will connect them to flash the new code and then return them to how they were
    • avrdude output is shown in real time (you'd be amazed how difficult this was)
  • You can set a slot to point to a local Arduino sketch.ino file and it will flash if it detects a change

    • If you don't like using Arduino IDE or Wokwi and prefer using vim or emacs or whatever, now you can let the app handle the flashing stuff and just edit an .ino file.
    • In the app, type menu then slots and instead of entering a link to a Wokiw project, just give it a path to a file (this will be saved so you can unassign it and pick it later by name)
    • (This one is so fucking sick) Screenshot 2025-05-29 at 9 16 14 AM
  • Launch scripts included to easily run it from your favorite terminal emulator and not just the system default (terminal.app on macOS, Powershell on Windows, idk on Linux), just go to the directory in a terminal and run the script in tabby or whatever

  • The launcher should kill other instances (and close their windows) that happen to be open because it's such a common issue for me at least

  • Linux people are no longer red-headed stepchildren, there are proper tar.gz packages now for you nerds

Or you can use any terminal emulator you like, iTerm2, xTerm, Tabby, Arduino IDE's Serial Monitor, whatever. The TUI is all handled from the Jumperless itself so it just needs something to print text.

Animated rows

If it's a rail, those are animated and should be a continuous slow pulsing toward the top or bottom depending in the rail.

ADCs are green at 0V, and go through the spectrum to red at +5V, and get whiter hot pink toward +8V. Negative voltages are kinda blue/icy and do that same thing with the "cold" colors towards -8V.

GPIO as inputs are animated with a white pulsing (this might be broken in that FW release, I'm fixing that right now actually, and will just be purple/white) when floating, red for high, green for low

GPIO outputs will be either green or red depending on their state

Idle mode interactions

The main thing is that there'a a lot more interaction that can be done outside of any particular mode (like not probing and the logo is rainbowy, I'm gonna call this idle mode here until I think of a good name)

idle

Here's what's new (all of this is in idle mode):

  • Tapping nets highlights them as before, but there's a slightly different animation on the row you have selected from the whole net

  • The click wheel scrolls through highlighting rows as if you tapped each one

  • With a row selected, here's what you can do

    • connect button will bring you into probing mode with the highlighted row already selected and then spit you back out to idle mode once you've made a connection to another row, or click connect again to exit

    • remove will briefly turn the row reddish warn (I need to settle on a good time for this, if it feels too short or long lmk), another remove press will remove that row (just like in probe mode, it removes the bridge it's in, so just things that have a direct connection to that row, not the whole net), if you let it time out without pressing anything, the row will be unhighlighted. TL;DR, double click remove to remove, single click to unhighlight.

    • tapping the building top pad with something highlighted will open the color picker, (note: the color now follows the row instead of the net, so it can keep the colors even if you remove nets below it and they shift, this was soooo difficult until I realized I should do it by node).

      • Also the color assignments are saved to a file for each slot, so they should work after a reboot and when changing slots
      • In the color picker, short clicking the probe buttons will zoom in and out, long press will confirm. The click wheel is similar, except you toggle zoom and scroll modes with short presses and long press to confirm Here's a demo on YouTube Here's a demo on YouTube
    • if the highlighted row is a measurement (gpio input or adc) it will print the state to serial and the oled

    • if the highlighted row is an output (gpio output, I'll eventually do dacs too) clicking the connect button will toggle it high / low. The remove button will just unhighlight the net (there were some choices here, like make each button assigned to high / low or allow removing them, but this felt like the best way after trying them all). I will eventually add a setting for the toggle repeat rate (set to 500ms now) and a way to set it freewheeling as a clock.

      • this one feature is the reason I did this whole update. And it's worth it because it's sick af.
  • when selecting gpio in probing mode (tap the bottom of the 3 pads by the logo), there are shortcuts for input and output, the blue line on the left is input, red square on the right is output. Tapping right in the middle of a number will take you to the old written out on the top and bottom selector.

OLED Support

First, get yourself one of these bad boys (literally any of these are fine.)

oled Medium https://www.amazon.com/MakerFocus-Display-SSD1306-3-3V-5V-Arduino/dp/B079BN2J8V

batchone-11 Ignore the really cool LEDs.

They should friction fit into the SBC/SMD/OLED board included with your Jumperless V5. SBCBP-4 copy

This should copy basically any text printed on the breadboard, some people have trouble reading text on the breadboard LEDs, which is why I added all this. (if I missed something, let me know, it's a fairly new thing so I've probably forgot to add code for it to print in a bunch of places.)

To connect the data lines to the Jumperless' GPIO 7 and 8, just use the menu option . (that's a period). It will try to find the OLED on the I2C bus, after a few failed attempts, it'll automatically disconnect to free up GPIO 7 and 8.

If you want to use this all the time, there's a config option to connect the OLED on startup. You can just paste these into the main menu:

`[top_oled] enabled = true;

and

`[top_oled] connect_on_boot = true;

Config file stuff

To change any persistent settings, there's a config file. You can read it with ~ and edit settings by copying any of those lines, pasting it back, and changing the value to whatever you want it to be.

~

copy / edit / paste any of these lines
into the main menu to change a setting

Jumperless Config:


`[hardware] generation = 5;
`[hardware] revision = 5;
`[hardware] probe_revision = 5;

`[dacs] top_rail = 0.00;
`[dacs] bottom_rail = 0.00;
`[dacs] dac_0 = 3.33;
`[dacs] dac_1 = 0.00;
`[dacs] set_dacs_on_boot = false;
`[dacs] set_rails_on_boot = true;
`[dacs] probe_power_dac = 0;
`[dacs] limit_max = 8.00;
`[dacs] limit_min = -8.00;

`[debug] file_parsing = false;
`[debug] net_manager = false;
`[debug] nets_to_chips = false;
`[debug] nets_to_chips_alt = false;
`[debug] leds = false;

`[routing] stack_paths = 1;
`[routing] stack_rails = 2;
`[routing] stack_dacs = 0;
`[routing] rail_priority = 1;

`[calibration] top_rail_zero = 1634;
`[calibration] top_rail_spread = 20.60;
`[calibration] bottom_rail_zero = 1614;
`[calibration] bottom_rail_spread = 20.73;
`[calibration] dac_0_zero = 1635;
`[calibration] dac_0_spread = 20.53;
`[calibration] dac_1_zero = 1625;
`[calibration] dac_1_spread = 20.80;
`[calibration] probe_max = 4060;
`[calibration] probe_min = 19;

`[logo_pads] top_guy = uart_tx;
`[logo_pads] bottom_guy = uart_rx;
`[logo_pads] building_pad_top = off;
`[logo_pads] building_pad_bottom = off;

`[display] lines_wires = wires;
`[display] menu_brightness = -10;
`[display] led_brightness = 10;
`[display] rail_brightness = 55;
`[display] special_net_brightness = 20;
`[display] net_color_mode = rainbow;

`[gpio] direction = 0,1,1,1,1,1,1,1,0,1;
`[gpio] pulls = 0,0,0,0,0,0,0,0,2,2;
`[gpio] uart_tx_function = off;
`[gpio] uart_rx_function = passthrough;

`[serial_1] function = passthrough;
`[serial_1] baud_rate = 115200;
`[serial_1] print_passthrough = false;
`[serial_1] connect_on_boot = false;
`[serial_1] lock_connection = false;
`[serial_1] autoconnect_flashing = true;

`[serial_2] function = off;
`[serial_2] baud_rate = 115200;
`[serial_2] print_passthrough = false;
`[serial_2] connect_on_boot = false;
`[serial_2] lock_connection = false;
`[serial_2] autoconnect_flashing = false;

`[top_oled] enabled = false;
`[top_oled] i2c_address = 0x3C;
`[top_oled] width = 128;
`[top_oled] height = 32;
`[top_oled] sda_pin = 26;
`[top_oled] scl_pin = 27;
`[top_oled] gpio_sda = MCP_2;
`[top_oled] gpio_scl = MCP_3;
`[top_oled] sda_row = D2;
`[top_oled] scl_row = D3;
`[top_oled] connect_on_boot = false;
`[top_oled] lock_connection = false;

There's also a help you can get to by entering ~?

		 ~ = show current config
~[section] = show specific section (e.g. ~[routing])
		 ` = enter config settings
		~? = show this help

	`reset = reset to defaults   //editor's note: this doesn't clear the calibration or hardware version, to clear that, you can use `reset_all `reset_calib `reset_hardware
	~names = show names for settings
  ~numbers = show numbers for settings

	config setting format (prefix with ` to paste from main menu)

`[serial_1]connect_on_boot = true;

Look Inside your Jumperless

Crossbar Array

There's a new way to see what the 12 analog crossbar switches are up to, just enter c in the menu

 Analog Crossbar Array

			 chip A                            chip B                            chip C                            chip D
	 0  1  2  3  4  5  6  7            0  1  2  3  4  5  6  7            0  1  2  3  4  5  6  7            0  1  2  3  4  5  6  7
  0 ─█───────────┼────────┼─ AI     0 ────█──┼──────────────┼─ AB0    0 ─┼──┼────────█─────█──── AC0    0 ────█────────█─────┼──── AD0
  1 ─█───────────┼────────┼─ AJ     1 ────┼──█──────────────┼─ AB1    1 ─┼──█────────┼─────█──── AC1    1  .  │  .  .  │  .  │  .  AD1
  2 ─┼───────────█────────┼─ AB0    2 ────┼──┼──────────────█─ BI     2  │  │  .  .  │  .  │  .  BC0    2  .  │  .  .  │  .  │  .  BD0
  3 ─┼───────────┼────────█─ AB1    3  .  │  │  .  .  .  .  │  BJ     3  │  │  .  .  │  .  │  .  BC1    3  .  │  .  .  │  .  │  .  BD1
  4  │  .  .  .  │  .  .  │  AC0    4  .  │  │  .  .  .  .  │  BC0    4 ─█──┼────────┼─────┼──── CI     4 ────█────────┼─────┼──── CD0
  5  │  .  .  .  │  .  .  │  AC1    5  .  │  │  .  .  .  .  │  BC1    5 ─█──┼────────┼─────┼──── CJ     5  .  │  .  .  │  .  │  .  CD1
  6  │  .  .  .  │  .  .  │  AD0    6  .  │  │  .  .  .  .  │  BD0    6 ─┼──┼────────█─────┼──── CD0    6  .  │  .  .  │  .  │  .  DI
  7  │  .  .  .  │  .  .  │  AD1    7  .  │  │  .  .  .  .  │  BD1    7  │  │  .  .  │  .  │  .  CD1    7  .  │  .  .  │  .  │  .  DJ
  8  │  .  .  .  │  .  .  │  AE0    8  .  │  │  .  .  .  .  │  BE0    8  │  │  .  .  │  .  │  .  CE0    8  .  │  .  .  │  .  │  .  DE0
  9  │  .  .  .  │  .  .  │  AK     9  .  │  │  .  .  .  .  │  BE1    9  │  │  .  .  │  .  │  .  CL     9  .  │  .  .  │  .  │  .  DE1
 10  │  .  .  .  │  .  .  │  AF0   10  .  │  │  .  .  .  .  │  BF0   10  │  │  .  .  │  .  │  .  CF0   10 ────┼────────┼─────█──── DF0
 11  │  .  .  .  │  .  .  │  AF1   11  .  │  │  .  .  .  .  │  BK    11  │  │  .  .  │  .  │  .  CF1   11  .  │  .  .  │  .  │  .  DL
 12  │  .  .  .  │  .  .  │  AG0   12  .  │  │  .  .  .  .  │  BG0   12  │  │  .  .  │  .  │  .  CG0   12  .  │  .  .  │  .  │  .  DG0
 13  │  .  .  .  │  .  .  │  AL    13  .  │  │  .  .  .  .  │  BG1   13  │  │  .  .  │  .  │  .  CK    13  .  │  .  .  │  .  │  .  DK
 14  │  .  .  .  │  .  .  │  AH0   14  .  │  │  .  .  .  .  │  BH0   14  │  │  .  .  │  .  │  .  CH0   14 ────┼────────█─────┼──── DH0
 15  │  .  .  .  │  .  .  │  AH1   15  .  │  │  .  .  .  .  │  BL    15  │  │  .  .  │  .  │  .  CH1   15  .  │  .  .  │  .  │  .  DH1
	 u  1  2  3  4  5  6  7            u  8  9  10 11 12 13 14           u  15 16 17 18 19 20 21           u  22 23 24 25 26 27 28


			 chip E                            chip F                            chip G                            chip H
	 0  1  2  3  4  5  6  7            0  1  2  3  4  5  6  7            0  1  2  3  4  5  6  7            0  1  2  3  4  5  6  7
  0 ─────────────█─────█──── AE0    0  .  .  .  │  .  │  .  .  AF0    0 ────█───────────█─────── AG0    0 ────█─────█───────────┼─ AH0
  1  .  .  .  .  │  .  │  .  EK     1  .  .  .  │  .  │  .  .  AF1    1  .  │  .  .  .  │  .  .  GL     1  .  │  .  │  .  .  .  │  AH1
  2  .  .  .  .  │  .  │  .  BE0    2  .  .  .  │  .  │  .  .  BF0    2  .  │  .  .  .  │  .  .  BG0    2  .  │  .  │  .  .  .  │  BH0
  3  .  .  .  .  │  .  │  .  BE1    3  .  .  .  │  .  │  .  .  FK     3  .  │  .  .  .  │  .  .  BG1    3  .  │  .  │  .  .  .  │  HL
  4  .  .  .  .  │  .  │  .  CE0    4  .  .  .  │  .  │  .  .  CF0    4  .  │  .  .  .  │  .  .  CG0    4  .  │  .  │  .  .  .  │  CH0
  5  .  .  .  .  │  .  │  .  EL     5  .  .  .  │  .  │  .  .  CF1    5  .  │  .  .  .  │  .  .  GK     5  .  │  .  │  .  .  .  │  CH1
  6  .  .  .  .  │  .  │  .  DE0    6 ──────────┼─────█─────── DF0    6  .  │  .  .  .  │  .  .  DG0    6 ────┼─────┼───────────█─ DH0
  7  .  .  .  .  │  .  │  .  DE1    7  .  .  .  │  .  │  .  .  FL     7  .  │  .  .  .  │  .  .  DG1    7  .  │  .  │  .  .  .  │  HK
  8  .  .  .  .  │  .  │  .  EI     8  .  .  .  │  .  │  .  .  EF0    8  .  │  .  .  .  │  .  .  EG0    8  .  │  .  │  .  .  .  │  EH0
  9  .  .  .  .  │  .  │  .  EJ     9  .  .  .  │  .  │  .  .  EF1    9  .  │  .  .  .  │  .  .  EG1    9  .  │  .  │  .  .  .  │  EH1
 10  .  .  .  .  │  .  │  .  EF0   10  .  .  .  │  .  │  .  .  FI    10 ────┼───────────█─────── FG0   10  .  │  .  │  .  .  .  │  FH0
 11  .  .  .  .  │  .  │  .  EF1   11  .  .  .  │  .  │  .  .  FJ    11  .  │  .  .  .  │  .  .  FG1   11  .  │  .  │  .  .  .  │  FH1
 12  .  .  .  .  │  .  │  .  EG0   12 ──────────█─────┼─────── FG0   12  .  │  .  .  .  │  .  .  GI    12  .  │  .  │  .  .  .  │  GH0
 13  .  .  .  .  │  .  │  .  EG1   13  .  .  .  │  .  │  .  .  FG1   13  .  │  .  .  .  │  .  .  GJ    13  .  │  .  │  .  .  .  │  GH1
 14  .  .  .  .  │  .  │  .  EH0   14  .  .  .  │  .  │  .  .  FH0   14  .  │  .  .  .  │  .  .  GH0   14  .  │  .  │  .  .  .  │  HI
 15  .  .  .  .  │  .  │  .  EH1   15  .  .  .  │  .  │  .  .  FH1   15  .  │  .  .  .  │  .  .  GH1   15  .  │  .  │  .  .  .  │  HJ
	 u  31 32 33 34 35 36 37           u  38 39 40 41 42 43 44           u  45 46 47 48 49 50 51           u  52 53 54 55 56 57 58


			 chip I                            chip J                            chip K                            chip L
	 0  1  2  3  4  5  6  7            0  1  2  3  4  5  6  7            0  1  2  3  4  5  6  7            0  1  2  3  4  5  6  7
  0 ─┼──┼──┼──█──┼────────── nA0    0  │  │  │  .  .  .  .  .  nD0    0  │  .  .  .  .  .  .  .  29     0  .  .  .  .  .  .  .  .  30
  1  │  │  │  │  │  .  .  .  nD1    1 ─┼──█──┼──────────────── nA1    1  │  .  .  .  .  .  .  .  59     1  .  .  .  .  .  .  .  .  60
  2  │  │  │  │  │  .  .  .  nA2    2 ─┼──┼──█──────────────── nD2    2 ─█────────────────────── BFi    2  .  .  .  .  .  .  .  .  BFo
  3  │  │  │  │  │  .  .  .  nD3    3  │  │  │  .  .  .  .  .  nA3    3  │  .  .  .  .  .  .  .  ARF    3  .  .  .  .  .  .  .  .  5V
  4 ─█──┼──┼──┼──┼────────── nA4    4  │  │  │  .  .  .  .  .  nD4    4  │  .  .  .  .  .  .  .  TRl    4  .  .  .  .  .  .  .  .  GP1
  5 ─┼──┼──█──┼──┼────────── nD5    5 ─█──┼──┼──────────────── nA5    5  │  .  .  .  .  .  .  .  BRl    5  .  .  .  .  .  .  .  .  GP2
  6 ─┼──█──┼──┼──┼────────── nA6    6  │  │  │  .  .  .  .  .  nD6    6  │  .  .  .  .  .  .  .  Da1    6  .  .  .  .  .  .  .  .  GP3
  7 ─┼──┼──┼──┼──█────────── nD7    7  │  │  │  .  .  .  .  .  nA7    7 ─█────────────────────── Da0    7  .  .  .  .  .  .  .  .  GP4
  8  │  │  │  │  │  .  .  .  nD1    8  │  │  │  .  .  .  .  .  nD8    8  │  .  .  .  .  .  .  .  Ad0    8  .  .  .  .  .  .  .  .  GP5
  9 ─┼──┼──┼──┼──█────────── nD9    9  │  │  │  .  .  .  .  .  nD1    9  │  .  .  .  .  .  .  .  Ad1    9  .  .  .  .  .  .  .  .  GP6
 10  │  │  │  │  │  .  .  .  nD1   10  │  │  │  .  .  .  .  .  nD1   10  │  .  .  .  .  .  .  .  Ad2   10  .  .  .  .  .  .  .  .  GP7
 11  │  │  │  │  │  .  .  .  I+    11  │  │  │  .  .  .  .  .  I-    11  │  .  .  .  .  .  .  .  Ad3   11  .  .  .  .  .  .  .  .  GP8
 12  │  │  │  │  │  .  .  .  IL    12  │  │  │  .  .  .  .  .  JL    12  │  .  .  .  .  .  .  .  KL    12  .  .  .  .  .  .  .  .  LI
 13 ─┼──┼──┼──█──┼────────── IJ    13 ─┼──█──┼──────────────── IJ    13  │  .  .  .  .  .  .  .  KI    13  .  .  .  .  .  .  .  .  LJ
 14  │  │  │  │  │  .  .  .  IK    14  │  │  │  .  .  .  .  .  JK    14  │  .  .  .  .  .  .  .  KJ    14  .  .  .  .  .  .  .  .  LK
 15  │  │  │  │  │  .  .  .  uRX   15  │  │  │  .  .  .  .  .  uTX   15  │  .  .  .  .  .  .  .  GND   15  .  .  .  .  .  .  .  .  GND
	 AI BI CI DI EI FI GI HI           AJ BJ CJ DJ EJ FJ GJ HJ           AK BK CK DK EK FK GK HK           AL BL CL DL EL FL GL HL



Bridge array

Enter b in the menu. This is generally the most helpul one for me to troubleshoot what's going on if your issue has anything to do with routing or connections. It probably looks like nonsense to you but I've been in it so long it makes perfect sense to me.

Screenshot 2025-05-30 at 7 04 54 AM

Net list

Enter 'n' in the menu to show this one. If you have anything that's doing any measurement (gpio input or ADCs), it'll stay up and live update if any of them change. (And just like basically any menu not asking for input, entering anything will bring you back to the main menu.)

Screenshot 2025-05-30 at 7 10 04 AM

Arduino UART passthrough

With an Arduino Nano in the header and the UART lines connected, anything on those lines should be passed through to the second serial port that shows up when you plug in your Jumperless.

(You can also set the config option ``[serial_1] print_passthrough = true;` and have it print on both. Don't worry about the baud rate, the Jumperless senses what the host computer is set to and changes the speed accordingly.

Screenshot 2025-05-19 at 11 07 55 AM

The shortcuts to connect D0 and D1 to the Jumperless's UART Tx and Rx is A to connect, and a to disconnect.

It will even sense when Arduino IDE is trying to upload code and twiddle the reset lines to allow you to flash code with just a single USB cable going to your Jumperless. Screenshot 2025-05-19 at 11 09 38 AM

3D printable stand

3DStandCollage

Here are the 3D models for you to print your own stand for your Jumperless. It's extremely handy to have it propped up like this to read text on the breadboard.

Yes, the model is at a weird angle, just drop it down in the slicer, if you want it to hold at a shallower angle, just drop the model through the bed a bit when you slice.

These stick-on rubber feet also make it a lot more solid on your desk (and having the different sizes lets you shim the angle by putting different ones on the front and back.)


That's all the brand spankin' new stuff, there's some more general info in the updates on the Crowd Supply page.

Come hang out in the Discord if you have any questions or just want to chat.

Odds and ends

  • GPIO 1-8 will show a subtle animation while they're floating and go red / green when they're pulled high / low

  • Added commands to just add or remove nodes +uart_tx-43, 1-2, 2-3, -2-3 (will just remove the bridge 2-3 and leave 1-2, -2 will remove the node, so both 1-2 and 2-3 will be removed)

  • x will clear all connections in the current slot

  • Configuration options are saved to a file and any option can be changed with `, or print it out with ~ (there's also a help menu ~?)

  • Arduino flashing works through the second serial port, a DTR signal will pull down the Reset lines and then let avrdude pass through whatever. So if you tell Arduino IDE there's an Arduino Nano connected to Jumperless port 2, it should flash as expected.

  • There's also a shortcut to connect the Jumperless's UART lines to D1 and D0, a to disconnect and A to connect

  • You can manually toggle the 2 Reset lines with r (both), rt (top), rb (bottom)

  • LED brightness menu updated (pro tip, try l?, lc, and lb)

  • v will just return all the ADC readings once, you can do v2 to get just ADC 2's reading

  • g will show the state of all the gpio

  • #[any text] will print text on the breadboard (type m or whatever to go back)

Firmware changes in 5.1.2.7

  • Commands from Routable UART
    • Starting a UART message (that would normally just be passed through to the second serial port) with 0x02 (non-printable ASCII code for Start of Text / STX) and ending with 0x03 (End of Text / ETX) will cause the Jumperless to interpret that as something that was sent though the menu on the main serial port. So you can send commands to make connections and such while also using serial passthrough.

What's that BUFFER_IN - DAC_0 bridge that's always there?

That gets added to power the probe LEDs, it's kinda weird, but to multiplex 3.3V, GND, LED data, 2 buttons, and a +-9V tolerant analog line over the 4 wires on a TRRS cable, the line powering those LEDs is shared. The connect/measure switch is a Dual Pole Dual Throw (DPDT) switch. The probe tip needs to be at a steady 3.3V to be read by the probe sense pads which is a big resistive divider sensed by a single ADC.

When you have it in select mode, the probe tip is getting 3.3V from a GPIO on the RP2350B driven high, and the LEDs get their power from the analog line, which is ROUTABLE_BUFFER_IN connected to DAC 0 set to 3.3V.

When you switch to measure mode, those roles get swapped, the LEDs are powered by that GPIO, and the probe tip is now ROUTABLE_BUFFER_IN. In the current firmware, that just stays at 3.3V so you can kinda sense pads in either mode (you may notice the sensing is a lot wonkier, that's because the DAC isn't perfectly calibrated to output exactly 3.3V.) But in the future, there will be some other stuff you can do in that mode treating it as an analog line (and of course, I'll forget to update this, if it's after like June 2025, double check this is still true.)

Why am I using one of the precious two DACs and not another GPIO?

The answer is switch position sensing. You may notice there's no obvious way for the Jumperless to know where the switch is set, so I had to get creative on this one. DAC 0's output is hardwired to go through a current sense shunt resistor, so when DAC 0 is powering the probe LEDs, they'll be drawing some current I can measure with one of the INA219s, and therefore I can be reasonably confident that the switch is in the select position.

If you need both DACs, you can just get rid of this connection and the probe LEDs won't light up, but other than aesthetics, it really has no effect on functionality. Or you connect ROUTABLE_BUFFER_IN to a GPIO and set it high and just lose the ability to sense where the switch is.

Glossary of terms:

net = a group of all the nodes that are connected together (enter n to see the list {there's a colorful update to that I'm working on right now})

node = anything the crossbar array can connect to, which includes everything on the breadboard and Nano header, as well as the internal special function nodes like routable GPIO, ADCs, DACs

row = kinda the same thing as node but I generally use it to mean stuff on the breadboard (so special function things like routable GPIO, ADCs, DACs that don't have a set location are excluded)

rail = I use this to refer to the 4 horizontal power rails on the top and bottom (top_rail, bottom_rail, gnd), I will never call a vertical row a rail. (I know they're columns but it's easier to say a lot)

bridge = a pair of exactly two nodes (this is what you're making when you connect stuff with the probe, enter s to print the (kinda misnamed) node files to see a list of bridges)

path = the set of crossbar connections needed to make a single bridge, so it can have multiple hops if it doesn't have a direct connection and needs to make a bounce through an intermediate chip enter b to see them

node file / slot file = this is an actual text file on the filesystem that stores the list of bridges, there's one of these for each slot (enter s to see all of them, they start with an f { to make it east to just copy paste them from the terminal)

slot = one of the 8 node files stored that you can switch between with </> or the menus. Named nodeFileSlot[0-7].txt (there's no actual limit, there's so much flash storage on this thing, but by default it's 8)

menu = I generally mean the onboard clickwheel menu when I say this (click the wheel to enter those and scroll around)

chip = shorthand for the CH446Qs specifically, lettered A-L. The first 8 (A-H) are considered "breadboard chips, and the last 4 are considered "special function" chips (enter c to see their connections)

That's probably more than you need to worry about but that gives me a nice start on real docs