LEGO USB IR tower (RIS 2.0)
Protocol documented, never tested here.
LEGO's own sanctioned way to fill a Micro Scout's P slot, and the standard link for an RCX. It carries two channels on two LEDs: a visible red one for VLL and a 940 nm one for the RCX serial link.
LEGO customer service put it plainly: filling the P program over VLL "requires Robotic Invention System 2.0 with the USB IR tower" — see LEGO FAQ — P program & IR tower.
What it proves
It is the precedent that proves VLL works, and it proves nothing about infrared. The tower sent VLL on visible red, per LEGO's own specification. That the Micro Scout sensor also reads infrared was established separately, on hardware — see IR LED (invisible VLL).
For an RCX the same tower is a full two-way serial link: How the links work.
Two variants
The serial tower on a DB9 at 2400 baud, which LegoRcxPy drives. The USB tower is the RIS 2.0 one LEGO named, and it works with NQC · BrickCC or the legousbtower drivers.
Sending VLL, documented
The whole VLL protocol sits in the official LEGO USB Tower Interface Reference (1999–2000): no reverse-engineering needed, and no Windows either.
- The tower is a vendor-specific USB device (two interrupt endpoints; EP2 = host→device), driven by USB vendor control requests.
SET_PARM(bmRequest 0x02) withLTW_PARM_MODE(0x01) =LTW_MODE_VLL(0x01) → switches the tower to VLL mode (wValue = 0x0101,wIndex = 0).- Then write the 7-bit VLL code byte to the host→device endpoint; the tower clocks the VLL waveform itself (VLL speed is fixed in firmware).
- VLL goes out on a dedicated red LED (
LTW_LED_VLL= "the red led, normally used to carry out VLL communications") — visible red, not IR.
So on macOS / Linux / any desktop via pyusb / libusb: open the tower (VID 0x0694), send the SET_PARM→VLL control transfer, write the code byte. The only physical extra is a clear optical tube (tapered hollow LEGO pegs) to funnel the output into the Micro Scout's sensor.
WinVLL is the Windows app that does this (WinVLL); it also offers a no-tower "WinVLL Probe" LED driven from the sound-card output. The open Linux legousbtower driver is raw read/write (RCX-oriented), so a Mac route uses pyusb + the documented vendor requests directly.
Best for
Period-correct programming, from any desktop rather than from Windows alone. The LED routes (lego-blockly, IR LED (invisible VLL), Powered Up hub (Pybricks VLL)) need neither tower nor tube — see VLL emitters — options & status.
Links
- WinVLL — Windows app that drives the tower (and a no-tower "WinVLL Probe" LED via sound-card output)
Modern replacements and browser tooling (2024–2026)
The tower is scarce, but it no longer has to be bought:
- DiyIrTower: open-hardware clone of the serial tower: ATtiny13A + Vishay TSOP4338/4838 38 kHz receiver + TSAL6200 940 nm LED, GPL-3.0 firmware and, since January 2026, a KiCad project under CERN-OHL-W v2. Its docs handle the self-echo problem the original towers also have.
- WebPBrick — compiles NQC in the browser (WebAssembly) and downloads to the RCX.
Emulate the serial tower, not the USB one. WebPBrick's WebUSB path is a proof-of-concept with its button commented out: the maintainer stated in August 2024 that it is "not fully supported and only in an experimental state" with data lost between RCX and browser, still true at v0.2.0 in August 2026. The serial tower is a transparent UART↔IR converter (2400 8-O-1, or 4800 8-N-1 in firmdl3 fast mode) with no host-side command protocol at all: bidirectional, tunnellable, and nothing on the host to reimplement.