Toy Pad Emulator for Lego Dimensions (Unofficial Fan Project)
MIT License
Allows you to connect an emulated Toy Pad to your PC or video-game console.
First demo video on Cemu emulator: https://www.youtube.com/watch?v=7CBa9u2ip-Y
Installation tutorial on a virtual machine: https://www.youtube.com/watch?v=5PARAnrt1jU
Quick usage showcase on RPCS3: https://www.youtube.com/watch?v=KIKDO0dxYl4
There are two options. Please choose the installation method that suits your needs best.
Make a new virtual machine with Debian in your software of choice. Select your ISO file and choose the appropriate operating system (Linux -> Debian 11.x 64-bit) if you're asked. To make sure your VM is accessible on the network, please follow the instructions in the troubleshooting section on this page (either for VirtualBox or VMware).
When first booting the Debian VM, select Graphical install
. In the configuration, leave everything on default. Only change your language, set debian
as hostname, don't set a root password, choose an account name and password, set partition to "yes" and /dev/sda
for the GRUB bootloader.
After rebooting, log in with your password. Then click the menu on the upper left corner, search for "Terminal" and open it.
Run the following commands (you can copy and paste with right click):
sudo apt update
sudo apt install -y git usbip hwdata curl python build-essential libusb-1.0-0-dev libudev-dev
echo "usbip-core" | sudo tee -a /etc/modules
echo "usbip-vudc" | sudo tee -a /etc/modules
echo "vhci-hcd" | sudo tee -a /etc/modules
echo "dtoverlay=dwc2" | sudo tee -a /boot/config.txt
echo "dwc2" | sudo tee -a /etc/modules
echo "libcomposite" | sudo tee -a /etc/modules
echo "usb_f_rndis" | sudo tee -a /etc/modules
git config pull.rebase false
git clone https://github.com/Berny23/LD-ToyPad-Emulator.git
cd LD-ToyPad-Emulator
printf '\necho "usbip-vudc.0" > UDC\nusbipd -D --device\nsleep 2;\nusbip attach -r debian -b usbip-vudc.0\nchmod a+rw /dev/hidg0' >> usb_setup_script.sh
sudo curl https://raw.githubusercontent.com/virtualhere/script/main/install_server | sudo sh
sudo cp usb_setup_script.sh /usr/local/bin/toypad_usb_setup.sh
sudo chmod +x /usr/local/bin/toypad_usb_setup.sh
(sudo crontab -l 2>/dev/null; echo "@reboot sudo /usr/local/bin/toypad_usb_setup.sh") | sudo crontab -
Reboot you device with this command:
sudo shutdown -r now
Log in again and run the following commands in the terminal:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
nvm install 11
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
npm install --global [email protected]
npm config set node_gyp $(npm prefix -g)/lib/node_modules/node-gyp/bin/node-gyp.js
cd LD-ToyPad-Emulator
npm install
Start the virtual machine if it's not already running. Then start the VirtualHere USB Client and double click on LEGO READER V2.10
.
Run the emulator server with this command if you are in the correct folder (otherwise run cd LD-ToyPad-Emulator
first):
node index.js
Type http://debian
in a browser to use the emulator.
If you want to turn it off, just press Ctrl + C
in the terminal, then use the command sudo shutdown now
to power off the virtual machine or just pause it from the host.
Finally, start your console emulator and the game itself (e.g. Cemu).
USB/Power Splitter for Raspberry Pi
from Ali or USB-C/PWR Splitter
from pishop.us) or similar single board computer with Network support
If you're using a Raspberry Pi Zero W, flash Raspberry Pi OS Lite to your SD card using the Raspberry Pi Imager tool and follow this as well as this instruction for headless installation.
Connect your device to your PC via USB cable (don't use the port on the edge of the Pi Zero!).
Use SSH to run the following commands (Don't know the IP address? Try this IP scanner.):
sudo apt update
sudo apt install -y git libusb-1.0-0-dev libudev-dev
[[ -f /boot/firmware/config.txt ]] && ( echo "dtoverlay=dwc2" | sudo tee -a /boot/firmware/config.txt ) || ( echo "dtoverlay=dwc2" | sudo tee -a /boot/config.txt )
echo "dwc2" | sudo tee -a /etc/modules
echo "libcomposite" | sudo tee -a /etc/modules
echo "usb_f_rndis" | sudo tee -a /etc/modules
git config pull.rebase false
git clone https://github.com/Berny23/LD-ToyPad-Emulator.git
cd LD-ToyPad-Emulator
printf '\necho "$UDC" > UDC\nsleep 2;\nchmod a+rw /dev/hidg0' >> usb_setup_script.sh
sudo cp usb_setup_script.sh /usr/local/bin/toypad_usb_setup.sh
sudo chmod +x /usr/local/bin/toypad_usb_setup.sh
(sudo crontab -l 2>/dev/null; echo "@reboot sudo /usr/local/bin/toypad_usb_setup.sh") | sudo crontab -
Reboot you device with this command:
sudo shutdown -r now
Connect via SSH again and run the following commands:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
nvm install 11
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
npm install --global [email protected]
npm config set node_gyp $(npm prefix -g)/lib/node_modules/node-gyp/bin/node-gyp.js
cd LD-ToyPad-Emulator
npm install
Run the emulator server with this command if you are in the correct folder (otherwise run cd LD-ToyPad-Emulator
first):
node index.js
Type your single board computer's IP address in a browser to use the emulator.
If you want to turn it off, just press Ctrl + C
in the cmd window, then use the command sudo shutdown now
to safely power off the device.
To update this software, just get the latest changes by running the following commands while inside the LD-ToyPad-Emulator
folder:
git fetch
git checkout origin/HEAD && git checkout origin/HEAD package-lock.json
npm install
If you would like your tags to have custom images over them to personalize your experience, name your image (ID).png and place them in server/images inside the Toypad Emulator folder. If you want them to cover the entirety of the tag with no blank space, make sure your image is either 100x100 or can be scaled to that size.
Character IDs can be found here
Vehicle IDs can be found here
This solution works only for RPCS3 and will break the Toy Pad detection with every other emulator!
Download and run Zadig.
Click on Options
and tick List All Devices
. Select LEGO READER V2.10
in the dropdown menu, then select WinUSB
if it's not already selected, click on the Replace Driver
button and on Yes
in the dialog.
After the installation has finished, exit Zadig and restart RPCS3. If you get stuck on the main menu, just close the game, right-click on it in the RPCS3 games list, select Change Custom Configuration
, switch to the Network
tab and choose Disconnected
in both drop-down menus. The game will now correctly detect the Toy Pad.
To undo the changes from Zadig, you have to rollback the driver:
Device Manager
, scroll down to USB devices
and expand the section.LEGO READER V2.10
.Driver
tab, click Previous Driver
, select the first option and click yes.Solution for Linux systems
In order to fix this, you will need to add a custom udev rule in your system, so the software can comunicate with the game. The udev rule is in the root of the server folder. (thanks to wof for sharing the rule).
To add the rule, simply just move the 99-dimensions.rules
file to /etc/udev/rules.d/
(a reboot might be required)
If moving the file is not allowed, just open a terminal inside the rules.d
folder and run this command: sudo nano 99-dimensions.rule
, open the rule file in the server root in a text editor, copy the contents and paste it in the terminal then press Ctrl + X to save the file.
Shutdown your virtual machine (icon in the upper right corner). In VirtualBox's manager, click your image and open Settings
. Under Network
change Attached to:
to Bridged Adapter
and click ok
. Start your virtual machine.
Shutdown your virtual machine (icon in the upper right corner). Right-click on your virtual machine's name in VMware Workstation or VMware Player and click Settings...
. Click on Network Adapter
and select Bridged
. Click OK
and start your virtual machine.
Either close any other software that is using the port 80 or manually edit the last line of index.js (with nano index.js
, edit the line, then press Ctrl + O
, Enter
and Ctrl + X
).
If you did this, you may need to append your selected port to the address in the browser (like http://debian:500
or http://192.168.0.165:500
if your port is 500).
When installing the virtual machine, you have to set the hostname to debian
.
Alternatively, copy the following command and replace YOUR_IP_ADDRESS
with your virtual machine's IP address (it looks like 192.168.X.X
, run hostname -I
to show it). After you've done this, run the modified command while you're inside the LD-ToyPad-Emulator
folder.
git reset --hard ; printf '\necho "usbip-vudc.0" > UDC\nusbipd -D --device\nsleep 2;\nusbip attach -r YOUR_IP_ADDRESS -b usbip-vudc.0\nchmod a+rw /dev/hidg0' >> usb_setup_script.sh ; sudo cp usb_setup_script.sh /usr/local/bin/toypad_usb_setup.sh
When double clicking on "LEGO READER V2.10", if it returns Error "Operation not permitted" (-1) trying to use this device.
. Try these steps:
onReset.$VENDOR_ID$.$PRODUCT_ID$=
Then try using the device again.
If you're using a virtual machine, make sure you've applied the solution specific to your software first (VirtualBox or VMware)!
After that, run the command hostname -I
in your virtual machine (or on your single board computer) and type the IP address that looks like 192.168.X.X
in your webbrowser.
ags131 for writing one of the main NodeJS libraries I'm using: https://www.npmjs.com/package/node-ld. My project would've been impossible to create without this guy's research.
cort1237 for implementing writing data (like vehicle upgrades) to toy tags, as well as several user interface updates and support for saving toy tags locally.
benlucaslaws for improving the user experience and implementing a complete filtering system for vehicle/character abilities and game worlds.
DaPiMan for helping with missing or misplaced vehicle IDs and other improvements.
Luigimeansme for adding/fixing character and vehicle abilities and other data improvements.
VladimirKuletski for creating/updating CI workflows for automated testing via GitHub Actions.