Saturday, August 22, 2026

Using Lego RCX in 2026 | Lego USB Tower IDE for Windows 11

If you still have a LEGO RCX 2.0 in a box somewhere, the odds are good that it works. The brick works. The motors work. The USB IR Tower still lights up when you plug it in. The only thing that died was the software and it died completely.

LEGO RCX 2.0


The original LEGO drivers were written for Windows XP and never made the jump. NQC, the classic command-line compiler everyone used back then, still compiles programs perfectly, but it talks to the tower through that dead kernel driver, so on a modern machine it compiles and then has nothing to send to. On Windows 11 you get a device that enumerates, blinks, and does nothing.

That problem is already solved. What I'm adding is the last mile: a graphical front-end, so the whole thing is buttons instead of terminal commands.

Credit where it belongs

The piece that solves the actual hard problem is lego-tower-rcx by beckmx. It's a Python tool, rcx_tool.py, that talks to the USB IR Tower directly over libusb instead of the old LEGO driver. It handles the tower, the handshake with the brick, firmware uploads and program downloads. Without it, none of this is possible.

Read this before you start. This post stays deliberately general about the driver and the toolkit setup. If you have any questions about installing the USB tower driver, or about downloading the folder that contains rcx_tool.py, go straight to beckmx's repository his README is the authority on all of that, and it's more detailed than anything I'd write here. What I'm focused on in this post is the GUI, and getting its .exe in place.

The groundwork, in brief

Four things have to be true before the GUI is of any use. All of them are covered properly in beckmx's README; this is just the shape of it so you know what you're in for.

  1. Python 3.10 or newer, plus pyusb. In my case I installed Python 3 from the Microsoft Store, which is the path of least resistance on Windows 11 — it lands on your PATH by itself and you're done. Then pip install pyusb.
  2. Download the toolkit from the repository and unzip it somewhere you'll remember. That folder is where everything lives.
  3. Replace the tower's driver with libusbK, using Zadig, run as administrator: Options → List All Devices, select "LEGO USB Tower" (confirm the USB ID reads 0694 0001), set the target to libusbK, click Install Driver.
  4. Prove it works from the command line before adding anything on top: python rcx_tool.py tower, then turn the brick on, point its IR window at the tower from about 10 cm, and python rcx_tool.py ping.

That last step is not optional. If ping doesn't answer, nothing built on top of it will either, and you'll waste an afternoon blaming the wrong layer.

If the tower responds but the brick doesn't, it probably has no firmware — an RCX that loses power completely also loses its operating system, and after twenty years in a box that's the normal state. python rcx_tool.py firmware firm0332.lgo fixes it. It takes a while, since it's pushing the whole RCX operating system through an infrared link at 1980s speeds. Let it finish, don't move the brick, and wait for the beep and the running-man icon on the LCD.

Know what you're giving up. Installing libusbK replaces the default driver, which means the old nqc -Susb and BricxCC will no longer talk to the tower at all. From here on rcx_tool.py is how you communicate with the brick, and NQC is used only as a compiler. That's the trade, and it's worth it — the alternative is a tower that does nothing.

The part this post is actually about: the GUI


              

Once the command line works, everything above becomes plumbing you never have to touch again. RCX Tower GUI is a single .exe that wraps rcx_tool.py and nqc.exe in a window. 

Download RCXTowerGUI.exe and copy it into the same folder as rcx_tool.py:

lego-tower-rcx/
├── rcx_tool.py
├── nqc.exe
├── firm0332.lgo
├── libusb-1.0.dll
└── RCXTowerGUI.exe   <- here

That location is the whole trick. On launch the app looks inside its own folder for rcx_tool.py, nqc.exe, python.exe and the firmware file, so every path field is already filled in when the window opens. Double-click it — there's no installer, no runtime to download, and nothing written to the registry.

Each button is a command you'd otherwise type:

ButtonWhat it runs
Towerpython rcx_tool.py tower
Pingpython rcx_tool.py ping
Infopython rcx_tool.py info — battery and firmware version
Compile & Downloadnqc -Trcx2 "program.nqc", then sends the resulting .rcx to the brick
Send firmwarepython rcx_tool.py firmware "firm0332.lgo"
Downloadpython rcx_tool.py download "program.rcx"
Force release / CancelKills the running process and frees the tower

Everything the tools print streams into the console pane while it happens: the command in yellow, output in green, errors in red. Compiler errors land there too, with their line numbers, so a typo in your NQC shows up as a normal error message instead of a silent failure.

Two details that came out of using it rather than designing it. There's a watchdog that releases the panel after 8 seconds if a command hangs, so a failed ping can't freeze the window — but firmware uploads are the deliberate exception and get 180 seconds, because flashing the brick legitimately takes longer than that, and killing a transfer halfway through is exactly what you don't want. And the window is resizable: drag it small and it switches to a compact layout, drag it big and the console takes the extra room.

Windows will show a SmartScreen warning the first time, because the executable isn't code-signed. More info → Run anyway. If you'd rather not trust a stranger's binary, the repository includes build.bat, which compiles the app using the C# compiler that already ships inside Windows — no SDK, no downloads, and then the binary is yours.

I've been running it on Windows 11 and it works great. Python 3 from the Microsoft Store, the toolkit folder, the .exe dropped next to it, that's the entire setup.





Your first program

Programs are written in NQC (Not Quite C), Dave Baum's language for the RCX. It looks like C with the sharp edges removed. Save this as robot.nqc in the same folder:

task main()
{
    SetPower(OUT_A + OUT_C, 7);   // full power, motors A and C

    OnFwd(OUT_A + OUT_C);         // forward
    Wait(200);                    // 200 ticks = 2 seconds

    OnRev(OUT_A + OUT_C);         // reverse
    Wait(200);

    Off(OUT_A + OUT_C);
}

Two things worth knowing: Wait() counts hundredths of a second, not milliseconds, and SetPower takes 0 to 7, not a percentage.

Put the path to robot.nqc in the NQC compiler field and press Compile & Download. One button does both halves — it compiles your source and, if that succeeds, immediately sends the result to the brick. Press Run on the RCX itself, and the thing you built in 2001 starts moving again.

When it doesn't work

SymptomCause
Anything about the tower or the driverGo to beckmx's repository. That's the right place for driver and toolkit problems, and his README covers them properly.
Tower answers, brick doesn'tBrick off, aimed away, too far, or no firmware. Try Send firmware.
Random dropouts mid-transferInfrared. Sunlight, fluorescent lights and distance all interfere. Move closer, close the blinds.
"rcx_tool.py not found"The .exe isn't in the toolkit folder. Move it there, or point the Project folder field at the right directory.
Buttons greyed outA command is still running. Press Force release / Cancel.

Links

Again: beckmx did the hard part. Reverse-engineering a USB protocol for hardware whose vendor abandoned it two decades ago is real work. The GUI is a convenience layer on top it just means you press a green button instead of learning command-line arguments first.

The brick is 25 years old and it still runs the program you send it.

BrickCode Studio

  BrickCode Studio A native GTK4 + C editor that brings classic robot bricks back to life, in one window: NQC  for the RCX, Scout, CyberMast...