A comprehensive guide for controlling Pinscape Pico devices using hidapitester from the command line.
- VID/PID:
1209:eaeb
- Usage Page:
6
(Generic Device) - Usage:
0
(Undefined) - Report ID:
4
(Feedback Controller Interface) - Report Length:
64
bytes
Command | Code | Description | Response |
---|---|---|---|
Device ID Query | 0x01 |
Get device information | Yes |
Set Wall Clock | 0x14 |
Set current date/time | No |
All Ports Off | 0x20 |
Turn off all outputs | No |
Set Port Block | 0x21 |
Set contiguous ports | No |
Set Output Ports | 0x22 |
Set random ports | No |
Query device information including unit number, name, port count, and hardware details.
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x01 --read-input
[0] = HID report ID (4)
[1] = Command code (0x01)
[2] = Unit number (1-16)
[3..34] = Unit name (32-byte null-padded string)
[35..36] = Protocol version (UINT16, little-endian)
[37..44] = Hardware ID (8-byte binary string)
[45..46] = Number of output ports (UINT16, little-endian)
[47..48] = Plunger type (UINT16, little-endian)
Note: Always run this first to understand your device configuration and port count.
Sets the device's internal clock for time-of-day features like attract mode scheduling, power management, and event-based effects.
Byte 1: Command (0x14)
Byte 2-3: Year (UINT16, little-endian)
Byte 4: Month (1-12)
Byte 5: Day (1-31)
Byte 6: Hour (0-23)
Byte 7: Minute (0-59)
Byte 8: Second (0-59)
# Set to June 17, 2025, 15:30:45
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x14,233,7,6,17,15,30,45
# Set to Christmas 2025, midnight
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x14,233,7,12,25,0,0,0
Important: Year is little-endian UINT16. For 2025:
233,7
(233 + 7×256 = 2025)
Emergency stop - immediately turns off all output ports.
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x20
Sets up to 60 contiguous output ports in a single command. Most efficient for updating ranges of consecutive ports.
Byte 1: Command (0x21)
Byte 2: Number of ports to set
Byte 3: First port number (1-based)
Byte 4+: Port values (0-255)
# Set ports 1-3 to values 64, 128, 255
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x21,3,1,64,128,255
# Set ports 10-15 to full brightness
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x21,6,10,255,255,255,255,255,255
# Fade effect on ports 5-9
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x21,5,5,51,102,153,204,255
Sets up to 30 randomly addressed ports in a single command. Most efficient for updating scattered individual ports.
Byte 1: Command (0x22)
Byte 2: Number of ports to set
Byte 3: First port number (1-based)
Byte 4: First port value (0-255)
Byte 5: Second port number
Byte 6: Second port value
... (continue for up to 30 ports)
# Set single port 8 to maximum brightness
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x22,1,8,255
# Set multiple scattered ports
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x22,3,2,100,7,200,15,50
# Turn off specific ports
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open --send-output 4,0x22,4,1,0,5,0,10,0,20,0
# Monitor all device responses
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --timeout 1000 --open --read-input-forever
# Verbose monitoring with hex output
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --timeout 1000 --verbose --base 16 --open --read-input-forever
# List all Pinscape Pico devices
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 --list-detail
# Get HID report descriptor
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 --open --get-report-descriptor
# Full device setup: identify, set time, turn all off
sudo hidapitester --vidpid 1209:eaeb --usagePage 6 --usage 0 -l 64 --open \
--send-output 4,0x01 --read-input \
--send-output 4,0x14,233,7,6,17,15,30,0 \
--send-output 4,0x20
- Ports are numbered starting from 1, not 0
- Port values range from 0 (off) to 255 (maximum)
- Use 0x21 for contiguous port ranges
- Use 0x22 for scattered individual ports
- DOF software automatically chooses the most efficient method
- Device ID Query (
0x01
) - Learn port count and device info - Set Wall Clock (
0x14
) - Optional, enables time-based features - Configure outputs as needed
- Attract Mode: Different patterns for day/night
- Power Management: Auto-dimming during late hours
- Event Effects: Holiday themes, birthday celebrations
- Logging: Timestamp game sessions and usage analytics
Note
On macOS, accessing HID devices with usage page 0x06 and usage 0x00 (like Pinscape Pico) requires elevated permissions. You must run as sudo to communicate with the device.
This device presents as a composite HID device with three interfaces:
- Keyboard (Report ID 1) - Button/key inputs
- Consumer Control (Report ID 2) - Media control buttons
- Feedback Controller (Report ID 4) - DOF output control ⭐
The feedback controller interface uses:
- Usage Page 6 (Generic Device)
- Usage 0 (Undefined)
- String descriptor: "PinscapeFeedbackController/X" (where X = protocol version)
#!/bin/bash
set -e
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-mac.tar.bz2
tar -xjf gcc-arm-none-eabi-10.3-2021.10-mac.tar.bz2
export PATH="$PWD/gcc-arm-none-eabi-10.3-2021.10/bin:$PATH"
git clone --recurse-submodules [email protected]:mjrgh/PinscapePico.git
cd PinscapePico/Firmware
export PICO_SDK_FETCH_FROM_GIT=1
cmake .
make -j4
Create a new 99-pinscape-pico.rules
file:
sudo vi /etc/udev/rules.d/99-pinscape-pico.rules
Add the following line:
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="eaeb", MODE="0660", GROUP="plugdev"
Add your user to the plugdev
group:
sudo usermod -aG plugdev $USER
newgrp plugdev
Reload the udev rules:
sudo udevadm control --reload
sudo udevadm trigger
Then unplug and replug the USB device.
ij_l7,0,0,0,0,0,0,0,L88 Blink fu500 fd550
test_basic,0,0,0,0,0,0,0,L88
test_fade,0,0,0,0,0,0,0,L88 fu500 fd550
test_blink,0,0,0,0,0,0,0,L88 Blink
test_both,0,0,0,0,0,0,0,L88 Blink fu500 fd550
Some content generated from DOF source code analysis. Commands tested on Pinscape Pico hardware.
directoutputconfig51.ini:
directoutputconfig120.ini:
pico_config.json: