DOOM draaien op Sonoff Basic R2 (ITEAD)

Als je tot gisteren geen reden voelde om een Sonoff-apparaat te kopen, is dat moment nu aangebroken. Het kost minder dan een pizza en een biertje, het schakelt elke netspanningbelasting aan en uit, en nu draait er ook nog eens Doom op. Ja, dat Doom. Op de chip die normaal gesproken je badkamerlamp bedient.

Deze repository transformeert een Sonoff Basic waarvan de PCB is bedrukt met Sonoff RF R2 POWER V1.0 in twee dingen tegelijk:

  1. Een volwaardige slimme schakelaar: setup-portaal bij de eerste boot, admin-login, fysieke knop, HTTP API en herstel van de belastingstatus na stroomuitval.
  2. Een spelcomputer: een Doom-stijl FPS die draait op de Sonoff zelf (engine, map, imps, deuren, wapens) en wordt gespeeld via de browser, inclusief het originele menu, het gezicht van de marine, muziek en geluidseffecten uit je eigen doom1.wad.

Let op: Dit is geen videostream van een verborgen pc; het renderen wordt echt uitgevoerd door de ESP8285 in de SONOFF-relais.

Wat is een Sonoff (en waarom zou je er een willen)?

Sonoff is het smart-home merk van ITEAD. De familie is groot, maar het model dat hier relevant is, is de meest eenvoudige: de Sonoff Basic (ook verkocht als Basic R2). Dit is een klein kastje met een relais, 2,4 GHz Wi-Fi, twee ingangsterminals en twee uitgangsterminals. Je plaatst het in serie met een belasting (een lamp, ventilator, pomp, koffiezetapparaat) om deze op afstand bedienbaar te maken.

Volgens de handleiding van de fabrikant kan de Basic R2 tot 10 A / 2200 W aan, accepteert het 100–240 V AC en ondersteunt het uitsluitend 2,4 GHz Wi-Fi (IEEE 802.11 b/g/n, geen 5 GHz).

Waarom het een geweldig object is om te hacken:

  • Prijs: Ongeveer €7–9 (afhankelijk van de winkel en verzending).
  • Hardware: Een ESP8285: een ESP8266 met 1 MB flash ingebouwd in de chip. Ingebouwde Wi-Fi, programmeerbaar via de Arduino IDE.
  • Programmeerpads: 3V3, RX, TX en GND zijn zichtbaar op de printplaat; een goedkope USB-seriële adapter is voldoende.
  • Knop en LED: De on-board knop en LED zijn al aangesloten op de chip-pinnen.
  • Werkelijk nut: Zelfs als je nooit speelt, blijft het een uitstekende thuisschakelaar.

⚠️ Waarschuwing: Dit project is geschreven en getest voor de PCB gemarkeerd met Sonoff RF R2 POWER V1.0 (Sonoff Basic). Controleer de bedrukking op je printplaat voordat je begint.

Over de naam: De "RF" in de bedrukking staat niet voor 433 MHz radio. Dit is de Wi-Fi-only revisie van de Basic, op de markt sinds ongeveer november 2018. Er bestaat een apart Sonoff-model met een 433 MHz ontvanger (de Sonoff RF); dit is niet het doelwit van dit project en de pinnen kunnen verschillen.

Integraties met originele firmware

Met de fabrieksfirmware werkt het apparaat via de eWeLink-app, Alexa, Google Home en IFTTT. Met de firmware uit deze repository wordt de originele software vervangen. Cloud-diensten werken dan niet meer, maar je krijgt in ruil daarvoor een lokale HTTP API zonder cloud of account.

Wat dit project doet

Het spel

  • Engine: Raycasting-engine op de ESP8285, 128 × 80 pixels, 256 kleuren, ongeveer 23–25 fps.
  • Graphics: Echte Doom-graphics, geëxtraheerd uit doom1.wad: muurtexturen, geanimeerde imps, pistool en shotgun, origineel palet en verlichting (COLORMAP tabel).
  • Menu: Klassiek Doom-menu bij opstarten met logo, knipperende schedel, moeilijkheidsgraad en drie optie-sliders.
  • Statusbalk: Originele statusbalk met munitie, gezondheid en het gezicht van de marine (reageert op schade en sterft uiteindelijk).
  • Wapens: Pistool en shotgun (7 pellets met spreiding). Wisselen via het muiswiel of toetsen 2/3.
  • Deuren: Echte deuren (BIGDOOR2 textuur) die omhoog schuiven met originele geluiden. Openen met 'E' of rechtermuisknop.
  • AI: Imps slapen totdat ze je zien of een schot horen, waarna ze je achtervolgen en zelf deuren openen.
  • Audio: Originele muziek (E1M1, E1M2, E1M3) afgespeeld door de browser met een synthesizer, plus geluidseffecten uit de WAD.
  • Cheats: IDDQD en IDKFA zijn "beleefd geweigerd" via een bericht in het Doom-lettertype.

De schakelaar

Onder de statusbalk bevinden zich twee Doom-stijl knoppen:

  • TOGGLE: Een puls van 30 ms op het relais (geschikt voor intercoms, poorten, etc.). Wordt groen tijdens het indrukken.
  • SWITCH: ON/OFF: Zet de belasting aan of uit.
  • Fysieke knop: Korte druk = toggle belasting. 10 seconden ingedrukt houden = fabrieksreset.
  • Status: Na stroomuitval keert de belasting terug naar de vorige staat.
  • API: HTTP API voor integratie in home automation.

De webpagina

De pagina bevat de titel, het gamescherm met statusbalk, een regel met live statistieken (HP, kills, fps, vrije RAM, frame timings, muziektrack, verbinding) en de schakelknoppen. Op brede schermen staat de besturingslegenda rechts; op smallere schermen staat deze onderaan.

Technische specificaties

Hardware

ComponentSpecificatie
ApparaatSonoff Basic (verkocht als Basic R2)
PCB BedrukkingSonoff RF R2 POWER V1.0
SoCESP8285 (ESP8266 + 1 MB ingebouwde flash), 2,4 GHz Wi-Fi
Data RAM80.192 bytes totaal (ca. 33 KB vrij tijdens het spel)
Flash1 MB
Firmware grootteca. 565 KB
Relais10 A / 2200 W
Arduino IDE boardGeneric ESP8285 Module

Gebruikte Pinnen:

  • GPIO 12: Relais (high = gesloten)
  • GPIO 13: LED (aan wanneer pin low)
  • GPIO 0: Fysieke knop (KEY pad)
  • GPIO 1 / 3: Seriële TX / RX (monitor op 115200 baud)

Gemeten prestaties

Gemeten op een echte Sonoff met open gamepagina:

  • Frames per seconde: ca. 23,7
  • Berekening per frame: ca. 6,4 ms
  • Verzending per frame via Wi-Fi: ca. 28,8 ms
  • Verkeer: ca. 242 KB/s
  • Bottleneck: De Wi-Fi, niet de rekenkracht.
  • Vrij RAM: ca. 33 KB

Hoe het werkt (en hoe het is gemaakt)

Het concept

Het originele Doom vereist minimaal 4 MB RAM. De Sonoff heeft slechts 80 KB (waarvan 33 KB vrij). Daarom kan de originele engine niet worden geport. De oplossing is een nieuwe engine, vanaf nul geschreven voor deze chip, die gebruikmaakt van echte Doom-data:

  • De geometrie is een 16 × 16 grid (raycaster, geen BSP renderer).
  • Texturen, sprites, palet en verlichting komen uit de WAD, worden op de PC geconverteerd en opgeslagen in de flash, waar ze direct worden gelezen zonder via het RAM te gaan.
  • De browser neemt de taken over die teveel RAM zouden kosten: het tekenen van het menu, de statusbalk, teksten en het afspelen van muziek en effecten.

Workflow: doom1.wad → wad2sonoff.py → doom_assets.h → Firmware op Sonoff → WebSocket naar Browser.

De engine op de Sonoff

  • Geen framebuffer: Een scherm van 128 × 80 pixels zou 10 KB kosten. De Sonoff rendert 16 kolommen tegelijk in een buffer van 1,3 KB en verzendt deze direct.
  • Efficiënte verzending: Vloer en plafond zijn uniforme kleuren per rij; de browser tekent deze zelf. De Sonoff verzendt alleen de delen die verschillen: muren, imps en het wapen.
  • Texturen uit flash: Muurtexturen en sprites worden kolom voor kolom gelezen met pgmreadbyte.
  • Verlichting: Gebruikt 16 van de 32 niveaus van de COLORMAP tabel op basis van afstand.
  • AI: Imps worden gewekt door zicht of geluid van schoten. Ze kunnen zelf deuren openen.
  • Muisbediening: De browser verzendt de totale rotatie. De Sonoff gebruikt het verschil en draait met een beperkte hoek per update om plotselinge spins te voorkomen.
  • 30 ms puls: Wordt afgehandeld door een hardware timer (timer1), zodat de puls exact 30 ms duurt, ongeacht of de engine een frame rendert.

De browser

De pagina (ca. 32 KB, gecomprimeerd tot 13 KB in de firmware):

  • Bouwt het beeld op uit de ontvangen kolommen en past het Doom-palet toe.
  • Tekent de interface met het originele WAD-lettertype.
  • Decodeert en speelt 4-bit ADPCM gecomprimeerde geluidseffecten af.
  • Speelt MUS-scores via een WebAudio synthesizer.

Data conversie: wad2sonoff.py

Een Python 3 script dat de WAD leest en doom_assets.h genereert:

  • Palet & Verlichting: PLAYPAL en COLORMAP.
  • Muren: Texturen geschaald naar 64 × 64.
  • Deuren: BIGDOOR2.
  • Imp: 10 frames (lopen, pijn, dood).
  • Wapens: Pistool en shotgun, voorgeschaald naar 128 × 80.
  • Audio: DMX samples geresampled en gecomprimeerd naar 4-bit ADPCM; MUS tracks gecomprimeerd.

Wat je nodig hebt

  • Hardware: Een Sonoff Basic met een Sonoff RF R2 POWER V1.0 PCB.
  • Adapter: 3,3 V USB-seriële adapter (CP2102, CH340, FT232... geen 5 V).
  • Bedrading: 4 Dupont-draden (3V3, GND, TX, RX).
  • Optioneel: Soldeerbout voor pin-headers.
  • Software:
  • Arduino IDE met de esp8266 core en de WebSockets library van Markus Sattler.
  • Python 3 (voor wad2sonoff.py).
  • doom1.wad (de shareware versie).
  • Een moderne browser (Chrome, Edge, Firefox).

☠️ ELEKTRISCHE VEILIGHEID De Sonoff wordt gevoed door netspanning. Tijdens het programmeren mag het apparaat niet aan het stroomnet zijn verbonden. Voed het alleen via de 3,3 V van de USB-adapter. Raak geen onderdelen aan die onder netspanning staan. Plaats de Sonoff terug in de behuizing voordat je hem weer aansluit op het stroomnet.

Game-data verkrijgen (Bring your own WAD)

Deze repository bevat geen Doom-data. Je hebt een eigen kopie van doom1.wad nodig.

  1. Download de shareware doom1.wad (versie 1.9).
  2. Plaats deze in de sonoff_doom/ map.
  3. Het script genereert doom_assets.h. Dit bestand is alleen voor persoonlijk gebruik; deel of commit dit bestand niet.

Stapsgewijze installatie

  1. Code downloaden: Download de repository en plaats doom1.wad in de sonoff_doom/ map.
  2. Assets genereren: Open een terminal in de sonoff_doom/ map en voer uit:

python wad2sonoff.py doom1.wad

  1. Arduino IDE configureren:
  • Voeg https://arduino.esp8266.com/stable/packageesp8266comindex.json toe aan de Additional Boards Manager URLs.
  • Installeer esp8266 via de Boards Manager.
  • Installeer de WebSockets library van Markus Sattler via de Library Manager.
  • Open sonoffdoom/sonoffdoom.ino.
  1. Board selecteren:
  • Board: Generic ESP8285 Module
  • CPU Frequency: 160 MHz
  • Flash Size: 1MB (FS:none OTA:~502KB)
  • Upload Speed: 115200
  1. Adapter aansluiten: Verbind de draden (TX → RX, RX → TX, 3V3 → 3V3, GND → GND).
  2. Backup (Aanbevolen): Sla de originele flash op met esptool voordat je overschrijft.
  3. Firmware uploaden:
  • Houd de Sonoff-knop ingedrukt terwijl je de adapter aansluit op de PC.
  • Klik op 'Upload' in de Arduino IDE.
  • Verwijder de stroom en start het apparaat opnieuw op zonder de knop in te drukken.

Eerste opstart

Bij de eerste boot (of na een reset) is de Sonoff nog niet geconfigureerd:

  1. De LED knippert langzaam en het Wi-Fi netwerk SONOFF-DOOM-SETUP verschijnt.
  2. Verbind hiermee en ga naar http://192.168.4.1.
  3. Vul je Wi-Fi gegevens en een admin-gebruiker en wachtwoord (min. 8 tekens) in.
  4. Sla op; de Sonoff start opnieuw op en verbindt met je netwerk.
  5. Open het apparaat via http://sonoff-doom.local of het IP-adres.

Hoe te gebruiken

Besturing van het spel

ToetsActie
W / SVooruit / Achteruit
A / DStrafe (draaien als muis niet actief is)
MuisDraaien en richten
Klik / Spatie / CtrlVuren
Wiel / 2 / 3Wissel Pistool / Shotgun
E / RechtermuisknopDeuren openen
ESCMenu / Pauze
RHerstarten
M / NMuziek aan-uit / volgende track

Bediening van het apparaat

BedieningEffect
TOGGLE (web)30 ms puls op relais. LED licht op tijdens puls.
SWITCH: ON/OFF (web)Belasting aan of uit.
Fysieke knop (kort)Toggelt de belasting.
Fysieke knop (10s)Fabrieksreset.
LEDBrandt als relais gesloten is; flitst bij elk schot; knippert langzaam in setup-modus.

API en Home Automation

Elk verzoek vereist HTTP Basic-authenticatie met de admin-gebruiker en het wachtwoord.

  • Aanzetten: curl -u user:pass "http://sonoff-doom.local/relay?cmd=on"
  • Uitzetten: curl -u user:pass "http://sonoff-doom.local/relay?cmd=off"
  • Inverteren (Switch): curl -u user:pass "http://sonoff-doom.local/relay?cmd=toggle"
  • Puls (Toggle knop): curl -u user:pass "http://sonoff-doom.local/relay?cmd=pulse"
  • Status opvragen: curl -u user:pass "http://sonoff-doom.local/relay" (Retouren JSON: {"relay":"on"})

Home Assistant voorbeeld (untested)

In configuration.yaml:

command_line:
  - switch:
      name: "Sonoff Doom"
      command_on: 'curl -s -u "doom-admin:YOUR_PASSWORD" "http://sonoff-doom.local/relay?cmd=on"'
      command_off: 'curl -s -u "doom-admin:YOUR_PASSWORD" "http://sonoff-doom.local/relay?cmd=off"'
      command_state: 'curl -s -u "doom-admin:YOUR_PASSWORD" "http://sonoff-doom.local/relay"'
      value_template: "{{ value_json.relay == 'on' }}"

Beveiliging

  • Alle pagina's, de API en de uploadpagina vereisen een wachtwoord.
  • De WebSocket-verbinding accepteert alleen ingelogde browsers.
  • Waarschuwing: Alles gaat via plain HTTP. Wachtwoorden en commando's zijn zichtbaar voor iedereen op het netwerk. Stel de Sonoff niet open naar het internet.

Repository-structuur

  • docs/: GIF's en screenshots.
  • sonoff_doom/:
  • sonoff_doom.ino: Firmware (engine, netwerk, relais).
  • index_html.h: Broncode van de webpagina.
  • wad2sonoff.py: Script voor conversie van WAD naar doom_assets.h.
  • doom1.wad: (Niet inbegrepen) Jouw eigen WAD-bestand.
  • doom_assets.h: (Niet inbegrepen) Gegenereerd door het script.

Opties voor wad2sonoff.py

OptieFunctie
--listLijst textures en muziek uit de WAD
--walls A,B,CKies de 3 map-muren (default: STARTAN3, COMPTALL, BROWN1)
--door NAMEDoor textuur (default: BIGDOOR2)
--music ...Specifieke tracks toevoegen
--sfx-rate 8000Resample effecten naar lagere rate om flash te besparen
--html-onlyAlleen de webpagina verversen (geen WAD nodig)

Probleemoplossing

SymptoomControleer het volgende
Build stopt bij "doom_assets.h missing"Heb je python wad2sonoff.py doom1.wad uitgevoerd?
"Connecting..." tijdens uploadKnop niet ingedrukt bij start, TX/RX niet gekruist, of adapter is 5 V.
Sonoff boot niet na uploadVerkeerd board geselecteerd; moet Generic ESP8285 Module zijn.
SETUP-netwerk verschijnt nietApparaat is al geconfigureerd; houd knop 10s in voor reset.
Geen muziekBrowsers vereisen een klik/toetsdruk voordat audio start.
Muis "schiet weg"Verlaag de gevoeligheid in de Options.

Bekende beperkingen

  • Eén enkele 16 × 16 map met muren van gelijke hoogte (Wolfenstein-stijl raycaster).
  • Slechts één vijandtype (4 imps) die alleen in melee aanvalt.
  • Geen pickups; gedode imps geven een paar schoten (projectkeuze).
  • Geen save-functie.
  • Slechts één speler tegelijk.
  • Eenvoudige muziek synthesizer.
  • Geen HTTPS ondersteuning.
  • Geen OTA updates (firmware is te groot); alleen via serieel.

Versiegeschiedenis & Credits

  • v1: Raycaster op ESP8285 met gegenereerde graphics, frames verzonden naar browser.
  • Project door: Piuppi, geschreven met Claude Opus 5.5.
  • Licentie: De code is released onder de MIT-licentie. Dit geldt niet voor de Doom-data.
  • Disclaimer: Doom is een handelsmerk van id Software. Dit project is niet gelieerd aan of goedgekeurd door ITEAD, Sonoff of id Software.