SPOKE Board Troubleshooting Guide

Are the lights on your SPOKE board working?
Is MIDI being sent from the SPOKE board?
Is the SPOKE board showing up in File Explorer as a CIRCUITPY device?
Is the device being recognized as an RPI (Raspberry Pi) device instead?

Power Issue Detected

Problem: No lights means the board isn't receiving power.

Solution:

  • Check that your USB cable is properly connected
  • Try a different USB port on your computer
  • Test with a different USB cable (ensure it's a data+power cable, not power-only)
  • Verify your computer's USB port is working by testing another device

Cable Issue Detected

Problem: Lights are working but the device isn't recognized in File Explorer. This indicates you're using a power-only cable.

Solution:

  • Replace your current USB cable with a data+power cable
  • Many USB cables are power-only (designed only for charging)
  • Try a cable that you know works for data transfer (like one that came with a phone or external hard drive)
  • After replacing the cable, reconnect the SPOKE board and check File Explorer again

Code Issue Detected

Problem: The CIRCUITPY device is recognized but no MIDI is being sent. This is likely a code issue.

Solution:

  • Copy the example code below using the "Copy Code" button
  • Open File Explorer and navigate to the CIRCUITPY drive
  • Open the code.py file in Thonny or a text editor
  • Delete all existing code and paste the example code
  • Save the file - the board should automatically restart
  • Test MIDI functionality again
# This is the default code for the main SPOKE board. If you have the mini version or an older version with a visible Raspbery Pi Pico board attached, then use the code in the /SPOKE-mini folder on Github
#This code sets up the touch pins as capacitive touch sensors, it also sets up the neopixels to match the touch sensor it is next to. The MIDI-out in this example os polyphonic on/off. Read through the code to see what each section does and edit the parts you need!
import time
import board
import touchio
import digitalio
import usb_midi
import adafruit_midi
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
import neopixel
from rainbowio import colorwheel
# MIDI note numbers corresponding to each touch pin
midi_notes = [98, 96, 93, 91, 88, 86, 84, 81, 79, 76, 74, 72, 69, 67, 64, 62, 60, 57, 55, 52, 50, 48, 45, 43, 40, 38, 36]
# Define the touch pins
touch_pins = [
    board.GP1, board.GP2, board.GP3, board.GP4, board.GP5, board.GP6, board.GP7, board.GP8,
    board.GP9, board.GP10, board.GP11, board.GP12, board.GP13, board.GP14, board.GP15, board.GP16,
    board.GP17, board.GP18, board.GP19, board.GP20, board.GP21, board.GP22, board.GP23, board.GP24,
    board.GP25, board.GP28, board.VOLTAGE_MONITOR
]
# Initialize touch sensors
touch_sensors = []
for pin in touch_pins:
    try:
        touch_sensors.append(touchio.TouchIn(pin))
    except ValueError:
        print(f"No pulldown resistor found on pin {pin}, skipping...")
# MIDI setup
midi = adafruit_midi.MIDI(midi_out=usb_midi.ports[1], out_channel=0)
# State tracking
note_played = [False] * len(touch_pins)
# NeoPixel setup
num_pixels = len(touch_sensors)
pixels = neopixel.NeoPixel(board.GP0, num_pixels, brightness=0.03, auto_write=True)
# Startup animation
def rainbow(speed, duration, step_size=10):
    start_time = time.monotonic()
    while time.monotonic() - start_time < duration:
        for j in range(0, 256, step_size):
            for i in range(num_pixels):
                pixel_index = (i * 256 // num_pixels + j) % 256
                pixels[i] = colorwheel(pixel_index)
            pixels.show()
            if time.monotonic() - start_time >= duration:
                return
            time.sleep(speed)
# Fill all pixels blue
def all_blue():
    pixels.fill((0, 0, 255))
    pixels.show()
# Start
rainbow(0.01, 2, step_size=10)
all_blue()
# Main loop
while True:
    for i, touch_sensor in enumerate(touch_sensors):
        if touch_sensor.value:
            if not note_played[i]:
                midi.send(NoteOn(midi_notes[i], 120))
                note_played[i] = True
                pixels[i] = (255, 0, 255)
        else:
            if note_played[i]:
                midi.send(NoteOff(midi_notes[i], 120))
                note_played[i] = False
                pixels[i] = (0, 0, 255)

Firmware Installation Required

Problem: The device is being recognized as a Raspberry Pi (RPI) device instead of CircuitPython. The firmware needs to be installed.

Solution - Follow these firmware installation steps:

  • Step 1: Download the latest CircuitPython firmware (.uf2 file) for your board
  • Step 2: Put the board into bootloader mode:
    • Unplug the board
    • Hold down the BOOTSEL button
    • While holding BOOTSEL, plug in the USB cable
    • Release BOOTSEL after plugging in
  • Step 3: The board should appear as an RPI-RP2 drive in File Explorer
  • Step 4: Drag and drop the .uf2 firmware file onto the RPI-RP2 drive
  • Step 5: The board will automatically restart and should now appear as CIRCUITPY
  • Step 6: Copy the example code below to the code.py file on the CIRCUITPY drive
# This is the default code for the main SPOKE board. If you have the mini version or an older version with a visible Raspbery Pi Pico board attached, then use the code in the /SPOKE-mini folder on Github
#This code sets up the touch pins as capacitive touch sensors, it also sets up the neopixels to match the touch sensor it is next to. The MIDI-out in this example os polyphonic on/off. Read through the code to see what each section does and edit the parts you need!
import time
import board
import touchio
import digitalio
import usb_midi
import adafruit_midi
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
import neopixel
from rainbowio import colorwheel
# MIDI note numbers corresponding to each touch pin
midi_notes = [98, 96, 93, 91, 88, 86, 84, 81, 79, 76, 74, 72, 69, 67, 64, 62, 60, 57, 55, 52, 50, 48, 45, 43, 40, 38, 36]
# Define the touch pins
touch_pins = [
    board.GP1, board.GP2, board.GP3, board.GP4, board.GP5, board.GP6, board.GP7, board.GP8,
    board.GP9, board.GP10, board.GP11, board.GP12, board.GP13, board.GP14, board.GP15, board.GP16,
    board.GP17, board.GP18, board.GP19, board.GP20, board.GP21, board.GP22, board.GP23, board.GP24,
    board.GP25, board.GP28, board.VOLTAGE_MONITOR
]
# Initialize touch sensors
touch_sensors = []
for pin in touch_pins:
    try:
        touch_sensors.append(touchio.TouchIn(pin))
    except ValueError:
        print(f"No pulldown resistor found on pin {pin}, skipping...")
# MIDI setup
midi = adafruit_midi.MIDI(midi_out=usb_midi.ports[1], out_channel=0)
# State tracking
note_played = [False] * len(touch_pins)
# NeoPixel setup
num_pixels = len(touch_sensors)
pixels = neopixel.NeoPixel(board.GP0, num_pixels, brightness=0.03, auto_write=True)
# Startup animation
def rainbow(speed, duration, step_size=10):
    start_time = time.monotonic()
    while time.monotonic() - start_time < duration:
        for j in range(0, 256, step_size):
            for i in range(num_pixels):
                pixel_index = (i * 256 // num_pixels + j) % 256
                pixels[i] = colorwheel(pixel_index)
            pixels.show()
            if time.monotonic() - start_time >= duration:
                return
            time.sleep(speed)
# Fill all pixels blue
def all_blue():
    pixels.fill((0, 0, 255))
    pixels.show()
# Start
rainbow(0.01, 2, step_size=10)
all_blue()
# Main loop
while True:
    for i, touch_sensor in enumerate(touch_sensors):
        if touch_sensor.value:
            if not note_played[i]:
                midi.send(NoteOn(midi_notes[i], 120))
                note_played[i] = True
                pixels[i] = (255, 0, 255)
        else:
            if note_played[i]:
                midi.send(NoteOff(midi_notes[i], 120))
                note_played[i] = False
                pixels[i] = (0, 0, 255)

Download CircuitPython Firmware

Everything Working

Your SPOKE board appears to be functioning correctly. The lights are on and MIDI is being sent properly.

If you're experiencing other issues not covered by this troubleshooting guide, please consult the documentation or contact support.

0
Skip to Content
SPOKE
Home
Play
Build
Code
Learning
Built-With-SPOKE
DIY
Contact
SPOKE
Home
Play
Build
Code
Learning
Built-With-SPOKE
DIY
Contact
Home
Play
Build
Code
Learning
Built-With-SPOKE
DIY
Contact