Doom spelen op 555-timers

Inleiding

Door de jaren heen zijn mensen erin geslaagd om Doom op vrijwel alles te draaien. Rekenmachines, camera's, geldautomaten, printers en talloze andere apparaten die nooit bedoeld waren voor een first-person shooter, zijn in dienst genomen. Daarom besloot ik te kijken of ik Doom kon spelen op een paar 555-timers.

Nou ja, bijna.

Dit project draait niet daadwerkelijk het spel Doom. In plaats daarvan speelt het de openingsriff van "At Doom's Gate", de muziek uit het eerste level van het originele spel. Dit gebeurt zonder microcontroller, computer of enige vorm van software.

Het circuit maakt gebruik van twee 555-timers, enkele 7400-serie logische chips, een diode-matrix, analoge schakelaars en een kleine audioversterker. Eén 555-timer bepaalt het tempo, terwijl de tweede de eigenlijke noten genereert. Alles daartussen houdt bij waar het circuit zich in de riff bevindt en vertelt de audio-oscillator welke toonhoogte hij moet genereren.

Hoe het werkt

Het circuit kan worden onderverdeeld in vijf hoofdonderdelen:

  1. Tempoklok
  2. Sequentie-teller en decoder
  3. Diode-notematrix
  4. Toonhoogteselectie en audio-oscillator
  5. Audioversterker

Het volledige signaalpad ziet er als volgt uit:

  • 555 tempoklok
  • → 74LS161 binaire teller
  • → 74LS154 4-naar-16 decoder
  • → 1N4148 diode-matrix
  • → 74HCT14
  • → 2 x CD4066 analoge schakelaars
  • → 555 audio-oscillator
  • → PAM8302
  • → luidspreker

Het tempo instellen

De eerste NE555 is geconfigureerd als een astabiele oscillator. Een condensator laadt herhaaldelijk op en ontlaadt via een paar weerstanden, waardoor de output op pin 3 continu schakelt tussen hoog en laag.

Deze oscillator draait op ongeveer 7,33 Hz, wat betekent dat er elke 136 milliseconden een nieuwe klokpuls wordt gegenereerd. Op dit punt produceert de 555 nog geen audio; zijn enige taak is het bepalen van de timing van de riff.

Een trimmer-potentiometer in het timingnetwerk maakt het mogelijk om de klokfrequentie nauwkeurig af te stellen. Dit is gedaan door pin 3 te meten met een logic analyzer.

Tellen door de noten

De klokoutput gaat direct naar een 74LS161N, een vierbits synchrone binaire teller. Elke klokpuls verhoogt de teller met één:

  • 0000
  • 0001
  • 0010
  • 0011
  • 0100
  • ...

Vier bits zorgen voor 16 mogelijke toestanden, wat goed uitkomt aangezien dit circuit 15 posities nodig heeft voor het gedeelte van de riff dat wordt afgespeeld.

De vier teller-outputs voeden een 74LS154N 4-naar-16 decoder. In plaats van elders in het circuit met een vierbits binair getal te moeten werken, levert de decoder een individuele output voor elke tel. Wanneer de teller op nul staat, wordt Y0 geselecteerd; bij één wordt Y1 geselecteerd, enzovoort.

De 74LS154-outputs zijn 'active-low', wat betekent dat de momenteel geselecteerde output laag wordt, terwijl alle andere hoog blijven. Hierdoor heeft het circuit één fysieke draad die correspondeert met elke positie in de sequentie.

Een teller van 15 stappen maken

Er zijn 16 mogelijke tellertoestanden, maar er zijn er slechts 15 nodig. De laatste decoder-output, Y15, wordt daarom gebruikt om de teller te resetten in plaats van een nieuwe noot te spelen.

Y15 bestuurt een klein inverter/driver-circuit dat is opgebouwd uit twee 2N3904 NPN-transistoren. Wanneer Y15 actief wordt, trekt het transistorcircuit de active-low CLEAR-ingang van de 74LS161 laag. De teller keert onmiddellijk terug naar nul. Een drukknop die is aangesloten op de CLEAR-ingang zorgt daarnaast voor een handmatige reset.

De muziek opslaan met diodes

De teller weet nu waar hij zich in de riff bevindt, maar er is iets nodig dat bepaalt welke toonhoogte bij elke positie hoort. Dit wordt afgehandeld door 15 1N4148-diodes.

Er zijn 15 nootposities in de sequentie, maar slechts zes verschillende toonhoogtes. Er zijn zes noot-bussen gecreëerd die corresponderen met deze toonhoogtes. Elke output van de 74LS154 is via een diode verbonden met de bus voor de betreffende toonhoogte.