> SYS_INIT v2.2 // PROJECT DETAIL

Porg Shooting Gallery

A three-part laser shooting gallery: a blaster, a control case and a bar of Porg targets that calibrate themselves and count how many you saved.

PROJECT: RELEASED PUBLISHED: 2023-08-11 UPDATED: 2026-08-02 VERSION: 3.0.3
Five grey painted Porg figures standing on a dark wooden beam, each with a small sensor module on its chest, above a blue scrolling LED matrix display reading Wait for gun

Project overview

The Porg Shooting Gallery is a laser shooting game in three separate boxes. A printed E-11 blaster, a control case and a target bar talk to each other over ESP-NOW, with no cable between them except the mains lead. Presenting an RFID card to the control case starts a round: ten shots to hit six of the Porgs sitting on the bar.

The targets are Porgs rather than cans or ducks, and the closing message on the display reads that you saved a number of them. The birds stay exactly where they are when hit, which leaves the question of what actually happened to them open — that ambiguity is the joke.

This is the third generation of the machine. The first ran on a Nerf gun. The second used individual satellite targets connected by cable, each with a light sensor chip and a potentiometer that had to be set by hand before a session. This one automates almost all of that and moved to Porgs.

The project is not open source. It was built collaboratively under the Devious City License, and no design files or firmware are published. Star Wars, the Porg and all associated designs are the property of Lucasfilm and The Walt Disney Company; this is a fan-made installation and none of those elements are covered by that licence.

Electronics and control

Three ESP32 boards, one per box, connected only by ESP-NOW. The messages between them are small numeric codes rather than a protocol — a hit, a reset, a set of game parameters — which is all a game with ten shots and six targets needs.

The blaster is a printed E-11. It is battery powered and carries the laser, the trigger, a NeoPixel and a 128 x 32 SSD1306 as its ammunition display. It counts its own shots and reports them, so the round ends correctly even if a shot misses everything.

The control case holds the electronics, the speaker and the operator controls: a 20 x 4 LCD, a DFPlayer for the voice lines, a rotary encoder for volume, a ten-segment Grove LED bar as the shot counter, a reset button, and the MFRC522 whose card starts the game.

The target bar does the measuring. Each Porg has a light sensor on its chest and the sensors are read by two ADS1115 converters at 0x48 and 0x4A, four channels each, so the bar supports up to eight targets. A row of sixteen MAX7219 matrix modules runs the full length of the front as a scrolling display, driven by MD_Parola, and a WS2812B per position marks which Porg is currently active and turns red on a hit.

Hit detection compares the live reading of the active target against a baseline value stored for that target. Above the baseline means the laser is on it.

Mechanical construction

The Porgs and the E-11 blaster were printed in Prusament PLA on a Prusa MK3 and MK4. The Porgs were painted by club members, which is why the five of them do not look identical — that variation is worth more here than five matching birds would have been.

They sit on a dark wooden beam that runs the width of the installation, with all the electronics hidden inside it below the birds. The only visible parts are the sensors on the Porgs and the LED matrix strip along the front face.

Software

The interesting part happens before anyone shoots. At startup the target bar runs a scan across all eight ADC channels. Channels that return an implausible value are treated as empty, and the rest are counted as usable targets and have their baseline recorded. The bar reports how many Porgs it found and plays with that number.

That single routine replaces what the previous generation needed a person for. On generation two, every satellite had a potentiometer that had to be adjusted against the ambient light of the room before play. Here the room is measured instead of compensated for, and adding or removing a Porg needs nothing but plugging it in.

During a round the bar picks an active target, waits for its reading to rise above the recorded baseline, counts the hit, and reports it to the other two boxes. At ten shots the round closes and the display scrolls the result.

Lessons learned

Calibration that a person has to do will eventually not get done. Generation two worked, but only if someone went along the row with a screwdriver first. On an event day that step gets rushed or skipped, and a badly set target either never registers or registers constantly. Moving the calibration into the startup routine removed the failure mode rather than documenting it.

PLA does not survive storage in the sun. The Porgs stood in a living room in direct sunlight between events. After a few weeks they had deformed completely, and the feet under the wooden beam had softened and slumped. Nothing about that happened during use — it happened while the installation was standing still. A prop that lives for years and spends most of that time in storage has to be judged by where it is kept, not by what it does on an event day, and PLA is the wrong material for anything that might end up near a window.

The repair used the same property that caused the damage: the Porgs were reshaped with a heat gun rather than reprinted. A material soft enough to slump in a sunlit room is also soft enough to be pushed back into shape, which made the fix an afternoon instead of a print queue.

Let the hardware report itself. Because the bar detects how many targets are connected instead of being told, a Porg can be left out — damaged, in transport, not enough space on a table — and the game adjusts. The count is not a configuration value anywhere in the firmware.

Bill of materials

Qty Component Description Notes
3 ESP32 development board One each for the control case, the blaster and the target bar
2 ADS1115 16-bit ADC Read the light sensors of up to eight targets, at I2C addresses 0x48 and 0x4A
5 Light sensor module One per Porg, mounted on the chest facing the shooter
16 MAX7219 LED matrix module Scrolling display along the front of the target bar, driven with MD_Parola
1 Laser module Fitted in the blaster, fired on the trigger
1 SSD1306 OLED, 128 x 32 Ammunition display on the blaster
1 MFRC522 RFID reader Card reader in the control case; presenting a card starts a round
2 LCD 20 x 4 with I2C backpack Service displays in the control case and the target bar, both at 0x27
1 Rotary encoder Volume control on the control case
1 Grove LED bar, 10 segments Shot counter on the control case
2 DFPlayer Mini Sound in the control case and in the target bar
1 Speaker Mounted in the control case
1 PLA filament, Prusament Material for the Porgs and the E-11 blaster Printed on a Prusa MK3 and MK4; PLA turned out to be the wrong choice, see lessons learned
8 WS2812B LED One per target position, marking the active Porg and confirming a hit
View all projects →

A twelve-module escape game in one case: ESP32 puzzle stations talking over MQTT, a fifteen-minute timer and a touch console for the game master.

ESP32ElectronicsInteractive3D Printing
View project →

An interactive Star Wars themed console for a fan club stand: RFID acrylic cards call up ship blueprints, and an ultrasonic radar sweeps the room.

ElectronicsProp Making3D PrintingInteractive
View project →

A resin-printed Star Wars thermal detonator prop with self-built electronics: a red arming LED, three blinking front LEDs and a synchronised sound sequence.

Electronics3D PrintingProp MakingStar Wars
View project →