5. Summerin soittaminen

Alunperin julkaistu: 22.5.2024

Viimeksi muokattu: perjantai 24.5.2024

Tämä sivu on osa Arduino Opas 2:sta. Oppaassa käytetyt koodit löytyvät GitHubista: https://github.com/hutasunet/ArduinoOpas2.

Ääntä tarvitaan usein jonkin toiminnon suorituksen merkiksi, esimerkiksi näppäimen painallus tai muu kytkimen asennon muutos. Voi olla myös, että tarvitaan jonkinlainen hälytin tai varoitusääni tai halutaan toistaa jotakin muuta ääntä tai musiikkia. Käyttötapauksia on paljon erilaisia. Tässä kappaleessa käydään läpi pari erilaista tapaa tuottaa ääntä Arduino Miniman avulla.

Lisätään kytkentään ääntä summerin avulla, jotta tekemisestä saadaan mielenkiintoisempaa. Ääntä voidaan yksinkertaisimmillaan ohjata Arduinon sisäänrakennetun kirjaston tone-funktion avulla. Funktion parametrit ovat pinninumero, josta PWM-ohjaus tulee ulos, haluttu taajuus ja äänen kesto. Äänen aikaiseksi saamiseksi kytketään Piezo-summeri porttipinniin 3, kuten kuvassa alla.

Toteutetaan summerin ohjaus ensin "perinteisellä Arduinon tavalla" eli käytetään summerin ohjaukseen PWM:ää. Sen jälkeen toteutetaan äänen tuottaminen enemmän analogisesti eli RA4M1-mikrokontrollerin DAC (Digital-to-Analog) muuntimen avulla. Jälkimmäinen tapa hyödyntää uuden Arduino R4:n ominaisuuksia ja kyseinen koodi ei toimi R3 levyjen kanssa. Toteutetaan aluksi kytkentä Piezo summerille. Kytketään Piezo porttipinniin 3. Kytkennässä on käytetty 1 kilo-ohmin vastusta rinnan kytkettynä Piezon kanssa.

Piirikaavioon piirrettynä kytkennät näyttävät nyt tältä:

5.1 Äänen tuotto PWM:llä (Pulse Width Modulation)

PWM-ohjaus on yksinkertaisesti pulssisuhteen muutoksella tehtävää ohjausta, jolloin ohjaus menee vuorotellen päälle ja pois tietyllä taajuudella. Pulssisuhde puolestaan tarkoittaa sitä suhdetta, miten pitkään signaali on "1"-tilassa ja miten pitkään "0"-tilassa. Usein tätä suhdetta ilmaistaan prosenteilla, sillä suhdeluvut ovat aina helpoiten esitettävissä nimenomaan prosenteilla. Alla olevassa kuvassa on esitetty 80 %, 50 %:n ja 20 %:n pulssisuhteet. Tarkemmin PWM:stä voit lukea tältä sivulta: https://www.hutasu.net/elektroniikka/sulautettu-elektroniikka/pulse-width-modulation-eli-pwm-ohjaus/.

Seuraavaksi kirjoitetaan koodi, missä summeria ohjataan PWM:n avulla.

Huom!
Tone()-funktio vaikuttaa PWM-lähtöihin pinneissä 3 ja 11, joten jos sinulla on näihin kytkettynä ohjattavia laitteita, niin niiden toiminta voi häiriintyä. Oletuksena tone()-antaa ulos 50 % pulssisuhdetta.
Lisää tarkentavaa tietoa Arduinon Timereista ja PWM:stä löydät täältä (https://docs.arduino.cc/tutorials/generic/secrets-of-arduino-pwm/)

5.2 Äänen tuotto DAC:lla (Digital to Analog Converter)

Seuraavaksi toteutetaan sama toiminto mutta hieman edistyneemmällä tavalla. Käytetään digitaalimuunninta, joka muuntaa annetun numeroarvon (bitit) analogiseksi jännitteeksi mikroprosessorin lähtöjalkaan.

Siinä missä PWM on vain "0" ja "1" signaalia, DAC-piirin lähdöstä saatava signaali on lähes mitä tahansa nollan ja käyttöjännitteen välillä. Alla olevassa kuvassa on esitetty 8-bittisen muuntimen piirikaaviosymboli, joka hieman avaa kytkennän toimintaa. D0-D7 on 8-bittinen luku, joka syötetään muuntimelle ja ulos lähtee yksi jännitesignaali, joka perustuu tähän lukuun. Muuntimia on paljon erilaisia ja eri bittisiä, Arduino R4:ssä DAC on 12-bittinen eli ulostulojännitteen maksimiarvo voidaan jakaa 212=4096 eri osaan (resoluutio).

DAC toimii sisäisesti niin, että operaatiovahvistinkytkentä muuttaa bittien painoarvot jännitteeksi sen mukaan, mikä kunkin bitin arvo on. Tarkemmin kytkentöjen toiminnasta voit lukea esimerkiksi täältä: https://www.electricaltechnology.org/2020/04/digital-to-analog-converter-dac.html.

Arduino Uno R4:ssä on mahdollista oletuksena DAC:sta saada ulos kolmea signaalityyppiä: kanttiaaltoa (PWM joka tehtiin mutta kylläkin timerin avulla), siniaaltoa ja kolmioaaltoa. Kokeilemme näitä kaikkia Piezo summerin soittamiseksi.

Ensiksi pitää kuitenkin muokata kytkentää, sillä DAC-lähtö ei  olekaan enää sama kuin aiempi PWM-lähtö. Siirretään summerin johto lähtöön A0.

Siniaallon tuottamiseksi Arduino Minima R4 koodia muokataan nyt seuraavanlaisesti.

Ylimpänä #include komennolla otetaan sisäänrakennettu kirjasto "analogWave.h" käyttöön, minkä avulla aaltomuotoja on kätevämpi ja helpompi tuottaa. Kaikkea ei todellakaan kannata itse alkaa alusta asti tekemään, joten on näppärää kun on valmista koodia mitä käyttää.

Koodin pitäisi kuitenkin suurinpiirtein olla itsestään selvää: alustetaan DAC, asetetaan se 12-bitin moodiin, alustetaan haluttu aaltomuoto ja nappia painettaessa tuotetaan aaltomuoto A0-lähtöön. Äänen soittamisen jälkeen pidetään 1 sekunnin tauko, sillä jos nappia ei paineta niin äänen toisto lopetetaan, sillä muutoin ääntä ei kerkeäisi kuulemaan.

Kun signaalia tarkastellaan oskilloskoopin avulla, voidaan huomata että siniaalto sieltä löytyy, se tosin on rakennettu ikäänkuin pykälistä. Mutta niin se vain DAC toimii.

Seuraavaksi muutetaan aaltomuodoksi sahalaita-aalloksi ja se tapahtuu yhden rivin muutoksella koodissa setup()-funktion sisällä. Olen korostanut muuttuneen rivin keltaisella taustavärillä, muut koodit ovat täysin samoja kuin edellä.

Ohjelmoidaan Minima nyt tällä muutoksella ja tarkistetaan oskilloskoopilla signaalin muoto:

Siniaalto on nyt muuttunut sahalaita-aalloksi, kuten pitääkin.

Seuraavaksi muutetaan aaltomuodoksi kanttiaalto ja se tapahtuu yhden rivin muutoksella koodissa setup()-funktion sisällä. Olen korostanut muuttuneen rivin keltaisella taustavärillä, muut koodit ovat täysin samoja kuin edellä.

Ja kun aaltomuotoa tarkastellaan jälleen oskilloskoopin avulla, niin nähdään että kanttiaaltoa saadaan DAC:sta ulos.

Huom! Oskilloskooppikuvissa näkyvät taajuudet eivät ole oikein, koska sinisellä näkyvät tiedot ovat kursorien, eli pystysuuntaiset siniset viivat, välien mittauksia. Kuvasta voidaan kuitenkin nähdä, että yksi ruutu on 0,5 millisekuntia ja jakson pituus on noin 4,5 ruutua eli 2,25 millisekuntia, joka tarkoittaa noin 444 hertsin taajuutta.