Stap 12: geluiden
Alle geluiden die waren gegenereerd op basis van een ATtiny84. Er was geen ruimte voor een ander bord. En de ATtiny was er hoe dan ook, het lezen van de trigger en selector wijzerplaat en PWM te sturen naar de LED-drivers.
In feite, leveraged ik een bord dat ik voor dit gewerkt heb; het heeft een ATtiny84, een ICSP programmering header en vier LC135 constant-current drivers. De laatste zijn een koele kleine chip die levert een gereglementeerde 350 milliampère op een high-power LED, vindt PWM, en kan worden gestapeld (of eerder, parallel lopen).
De Raad van bestuur moest worden sterk gewijzigd voor deze prop, natuurlijk.
Het is relatief eenvoudig te doen tonen op een ATtiny. Het draait (met enkele belangrijke waarschuwingen) de tone() bibliotheek voor de Arduino. Het is ook geschikt voor wavetable synthese. De theorie is eenvoudig genoeg. Een van de ingebouwde hardware timers is ingesteld voor analoge spanning uitvoer; vaststellen van de frequentie, variabele cut-off (PWM, eigenlijk). Een tweede timer wordt gebruikt voor het genereren van een hardware-interrupt. Wanneer de interrupt service routine heet, het pakt de volgende waarde uit een wavetable en past de ingestelde spanning output van de eerste timer.
Deze truc vereist een paar dingen. Het vereist de tweede timer actief zijn op de gewenste frequentie X de lengte van de wavetable. Het vereist de eerste timer enkele kloostercongregaties sneller (anders zal er grappige aliasing gaande) worden uitgevoerd. En het vereist dat het programma niet besteden veel van cycli doen anders dan klaar voor de volgende interrupt worden verwerkt.
Dat laatste bleek moeilijk. Ik liep software PWM voor de LED (er waren geen meer hardware-timers beschikbaar op deze chip), ik moest nemen trigger lezingen en analoge lezingen uit het wiel en de soorten geluiden wilde ik nodig om te evolueren in de tijd. Dus ik gaf op de Golf van de volledige tabel, en eenvoudige vierkante of zaagtand golven gegenereerd. En dat betekende dat ik kon reserveonderdelen de cycli van het programma als u wilt optellen of aftrekken van getallen op de frequentie (dat wil zeggen het basistarief als welke wijzigingen worden aangebracht in de gevraagde analoge uitgang van timer1.)
Het betekende nog steeds dat de geluiden radicaal veranderd elke keer als ik in een nieuwe "Als" verklaring, en ze ook sterk afhankelijk van de basisfrequentie gekozen voor de PWM waren. Maar met een eerlijk bedrag van trial and error ik was in staat om bepaalde sjirps, warbles en klikken voor de diverse opnamen en de functie klinkt (power up, selector dial beweging, enz.)
In feite, was de aliasing en algemene "korrel" een voordeel. Met behulp van soortgelijke technieken aan de wavetable synthese boven een wit of roze lawaai van verschillende smaken kunt maken, maar dat bleek niet nodig. Als ik was met behulp van een sneller en krachtiger chip, zoals gevonden in een Arduino Nano, zou ik waarschijnlijk digitaal combineren verschillende wavetables en verwerken voordat die op de laatste analoge uitgang worden verzonden.
Alle de programmering werd nominaal gedaan in de Arduino IDE. Om de invloed van de hardware-timers in de manier waarop die ik moest, was ik het aanpakken van hen direct zonder de hulp van een Arduino-bibliotheken. Maar het voordeel van de programmering op een prop uitzien is je kunt bedenken "schets", gooien samen wat slordige code werkt, en noemen het goed genoeg.