Super Mario tunnusmusiikki piezo-kaiuttimella

Tämän pienimuotoisen rakentelun idea lähti eräästä toisen harrastelijan projektista, mihin olisi hyvä saada ääntä aikaiseksi. Itsekin olin jo hetken aikaa mietiskellyt mihin voisin käyttää viallisesta siivousrobotista irroittamaani piezo-elementtiä. Kyseinen elementti oli siinä käytössä ollut jonkinlainen pölyntunnistin, enkä ollut varma toimisiko tämä elementti kaiuttimena ylipäätään. "No ei auta kuin kokeilla" ja siitäpä projekti lähti etenemään.

Tutkin aluksi miten "hyvää" ääntä elementti ylipäätään tuottaa ja huomasin, että yksinään kaikesta irrallaan oleva elementti tuottaa aika heikon äänen. Ääntä tuotin Launchpadille ohjelmoidulla koodinpätkällä, joka tuottaa tasaisen 1 kHz:n kanttiaallon. Sain äänentasoon parannusta kun painelin elementtiä paperia vasten josta sain idean liimata elementin paperiin kiinni pikaliimalla. Alla olevassa kuvassa näkyy kyseinen elementti liimattuna paperin palaseen kiinni:

Piezo-elementti itsessään on n. 20 mm pyöreä ja 0.7 mm paksu ja paperinpala on kaksinkertaista A4:sta 5,5 x 6 cm kanttiinsa. Paperinpala toimii "äänen vahvistimena" elementille, kun se värisee elementin mukana liimauksen ansiosta.

Ääniongelman ratkaisun jälkeen siirryin koodin pariin. Etsiskelin ensin internetistä vastaavanlaisia projekteja, joihin olisi valmiina olemassa "nuotteja". Yksi tällainen löytyi instructables -sivustolta, mistä kopioin koodiini tarvittavat "nuotit" (linkki).

Koodi itsessään on aika yksinkertainen. "Nuotteihin" tarvitaan 3 taulukkoa joiden indeksit vastaavat toisiaan (eli saman kokoisia taulukoita). Taulukoissa on tiedot tarvittavaan taajuuteen eli nuottiin, nuotin pituuteen ja taukoihin nuottien välissä. Taulukoissa on 156 tavua, mihin tieto on tallennettu ja taulukoita on 3 kappaletta.

Itse soittaminen tapahtuu timer-ohjauksella, missä muutetaan timerin taajuutta joka saa aikaan nuotin. Alla on lähdekoodin pätkä, mistä nähdään PlaySong funktio, joka hoitaa taulukoista tiedon lukemisen ja timerin ohjaamisen:

void PlaySong()
{
unsigned char n = 0;
for(n = 0; n < 156; n++)
{
CCR0 = freq[n] * 10; // taajuus eli nuotti ladataan rekisteriin TACCR0
TACTL = TASSEL_2 + MC_1 + ID_0 + TACLR; // timerin käynnistys
SleepDelay(length[n] * 1.4); // nuotin pituus
TACTL = TASSEL_2 + MC_0;  // nuotti pois päältä
SleepDelay(delay[n]);   // tauko nuotin jälkeen
}
}

Tarkemmin lähdekoodia pääsee tutkailemaan, kun lataa tälle rakentelulle luodun CCSv5 projektin tästä linkistä. Alla näkyy kytkentä kokonaisuudessaan.

Kytkennässä on siis ohjaavana mikrokontrollerina MSP430G2231, minkä nasta P1.1 (#3) on kytketty piezo-kaiuttimen plus johtimeen. Samaisesta nastasta on myös kytketty schottcky-diodi käyttöjännitteeseen (+3.3 V) suojaamaan mikrokontrolleria jännitepiikeiltä (piezo-elementti tuottaa jännitteen kun siihen kohdistetaan voimaa).

Loppuhuipennuksena vielä video mistä nähdään ja ennen kaikkea kuullaan laitteen toiminta:

Lopputuloksena ihan tyydyttävä muutaman tunnin tuotos. Tunnusmusiikki ei ole täydellinen kun en jaksanut nuotteja alkaa hiomaan.