<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.sandboxpedal.com/index.php?action=history&amp;feed=atom&amp;title=Installing_the_RP2040_programmer_firmware</id>
	<title>Installing the RP2040 programmer firmware - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.sandboxpedal.com/index.php?action=history&amp;feed=atom&amp;title=Installing_the_RP2040_programmer_firmware"/>
	<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Installing_the_RP2040_programmer_firmware&amp;action=history"/>
	<updated>2026-08-24T05:04:08Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.sandboxpedal.com/index.php?title=Installing_the_RP2040_programmer_firmware&amp;diff=14&amp;oldid=prev</id>
		<title>Matthew: Add how-to guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.sandboxpedal.com/index.php?title=Installing_the_RP2040_programmer_firmware&amp;diff=14&amp;oldid=prev"/>
		<updated>2026-08-23T23:53:21Z</updated>

		<summary type="html">&lt;p&gt;Add how-to guide&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;The Sandbox programmer is an off-the-shelf RP2040 board running [https://circuitpython.org CircuitPython] plus a few files from the Sandbox repository.  Once it is set up, programming an FV-1 pedal is a matter of dragging a HEX file onto a USB drive — there is no driver to install and no programming application to run.&lt;br /&gt;
&lt;br /&gt;
This guide covers installing the firmware.  For day-to-day use, see [[Programming an EEPROM with HEX files]].&lt;br /&gt;
&lt;br /&gt;
== What you need ==&lt;br /&gt;
&lt;br /&gt;
* An RP2040 board.  We use a &amp;#039;&amp;#039;&amp;#039;Waveshare RP2040-Zero&amp;#039;&amp;#039;&amp;#039; for its small size and USB-C port, but a Raspberry Pi Pico or a clone will also work.&lt;br /&gt;
* A USB cable that carries data.  Charge-only cables are a common cause of &amp;quot;nothing happens when I plug it in&amp;quot;.&lt;br /&gt;
* The firmware files from the [https://github.com/DisasterAreaDesigns/Sandbox-FV1 Sandbox-FV1 repository], in the &amp;lt;code&amp;gt;Firmware&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
== Which firmware folder do I want? ==&lt;br /&gt;
&lt;br /&gt;
The repository contains two builds of the same programmer:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Folder !! Use it for&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Firmware/src&amp;lt;/code&amp;gt; || The programmer module fitted to a Sandbox pedal.  This is the one most people want.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Firmware/production programmer&amp;lt;/code&amp;gt; || A standalone bench programmer with an SSD1306 OLED and a button, for programming EEPROMs in quantity.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Both share the same file layout and the same HEX file rules.  The production build adds the OLED status display.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Put the board into bootloader mode ==&lt;br /&gt;
&lt;br /&gt;
# Unplug the RP2040 board from everything.&lt;br /&gt;
# Hold down the &amp;#039;&amp;#039;&amp;#039;BOOTSEL&amp;#039;&amp;#039;&amp;#039; button on the board.&lt;br /&gt;
# While still holding BOOTSEL, plug the USB cable into your computer.&lt;br /&gt;
# Release the button.&lt;br /&gt;
&lt;br /&gt;
A removable drive named &amp;#039;&amp;#039;&amp;#039;RPI-RP2&amp;#039;&amp;#039;&amp;#039; will appear on your computer.  If it does not, the cable is the first thing to suspect.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Install CircuitPython ==&lt;br /&gt;
&lt;br /&gt;
Drag the CircuitPython &amp;lt;code&amp;gt;.uf2&amp;lt;/code&amp;gt; file onto the &amp;#039;&amp;#039;&amp;#039;RPI-RP2&amp;#039;&amp;#039;&amp;#039; drive.  The repository ships a known-good build as &amp;lt;code&amp;gt;Firmware/firmware.uf2&amp;lt;/code&amp;gt;; alternatively download the CircuitPython build for your specific board from [https://circuitpython.org/downloads circuitpython.org].&lt;br /&gt;
&lt;br /&gt;
The board reboots on its own as soon as the copy finishes — the RPI-RP2 drive disappearing is expected and is how you know it worked.  A new drive named &amp;#039;&amp;#039;&amp;#039;CIRCUITPY&amp;#039;&amp;#039;&amp;#039; appears in its place.&lt;br /&gt;
&lt;br /&gt;
== Step 3: Copy the Sandbox files ==&lt;br /&gt;
&lt;br /&gt;
Copy these four items from the firmware folder onto the &amp;#039;&amp;#039;&amp;#039;CIRCUITPY&amp;#039;&amp;#039;&amp;#039; drive:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;code.py&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;hardware_id.json&amp;lt;/code&amp;gt;&lt;br /&gt;
* the &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; folder&lt;br /&gt;
&lt;br /&gt;
If your computer asks whether to merge or replace the contents of &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt;, say yes.  CircuitPython ships its own &amp;lt;code&amp;gt;lib&amp;lt;/code&amp;gt; folder and the Sandbox libraries need to sit alongside whatever is already there.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hardware_id.json&amp;lt;/code&amp;gt; is what lets the web editor recognise the drive as a real Sandbox target, so do not skip it.&lt;br /&gt;
&lt;br /&gt;
== Step 4: Confirm it worked ==&lt;br /&gt;
&lt;br /&gt;
Eject the drive and re-plug the board.  Two things should change:&lt;br /&gt;
&lt;br /&gt;
* The drive is now named &amp;#039;&amp;#039;&amp;#039;SANDBOX-FV1&amp;#039;&amp;#039;&amp;#039; instead of CIRCUITPY.  &amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt; renames it at power-on.&lt;br /&gt;
* The board identifies itself over USB as &amp;#039;&amp;#039;Disaster Area Designs SandboxFV1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
If you still see CIRCUITPY, &amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt; did not run.  Check that it is in the root of the drive and not inside a subfolder.&lt;br /&gt;
&lt;br /&gt;
== What the two files do ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt; runs once at power-on, before anything else.  It sets the drive label, enables the USB drive, and sets the USB manufacturer and product identity (VID &amp;lt;code&amp;gt;0x1209&amp;lt;/code&amp;gt;, PID &amp;lt;code&amp;gt;0x3811&amp;lt;/code&amp;gt;).  You never interact with it directly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;code.py&amp;lt;/code&amp;gt; is the main loop.  It watches the I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C bus for an EEPROM and the drive for HEX files, and programs the chip when it finds both.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;code&amp;gt;boot.py&amp;lt;/code&amp;gt; remounts the filesystem read-only &amp;#039;&amp;#039;to the board&amp;#039;s own code&amp;#039;&amp;#039;.  Your computer keeps write access, which is exactly what makes drag-and-drop programming work.&lt;br /&gt;
&lt;br /&gt;
== Reading the serial console ==&lt;br /&gt;
&lt;br /&gt;
For detailed logs — validation results, byte dumps, the reason a write failed — open the board&amp;#039;s serial REPL with a terminal program such as &amp;lt;code&amp;gt;screen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tio&amp;lt;/code&amp;gt;, PuTTY or the Mu editor.  Every action the loop takes is printed there.  This is the fastest way to diagnose a write that goes red for no obvious reason.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Programming an EEPROM with HEX files]]&lt;br /&gt;
* [[Building the FV-1 Sandbox pedal]]&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
[[Category:How-to]]&lt;/div&gt;</summary>
		<author><name>Matthew</name></author>
	</entry>
</feed>