perjantai 2. maaliskuuta 2018

Buzzer-ongelman ratkaisu eli jälleen kerran lisää micro:bit:in ohjelmointia C++:lla mbed:in kautta

Ja pienen mutkan jälkeen sain summerinkin (piezo buzzer) soittamaan melodioita C++:lla mbedin kautta. Tähän tarvittiin PWM_tone_library. Kirjaston asentaminen mbed-ympäristössä on helppoa, riittää että menee kirjaston sivulle ja painaa esimerkkiohjelman kohdalla "import program". Tämä tekee uuden projektin mbed-ympäristöön ja imaisee mukaansa kaikki esimerkkiohjelman vaatimat kirjastot (tässä mukaan tulee siis PWM_tone_library sekä mbed-kirjasto).

Piezo buzzer -kirjaston asennus mbed:issä
Jotta tämän saa toimimaan micro:bit:in kanssa, projektiin pitää kopioida myös MicroBit - kirjasto (sen voi hakea jostain vanhasta projektista copy-paste:lla). 

Projektissa pitää olla microbit, mbed ja PWM_Tone_Library
Malliohjelmaa pitää muokata kahdesta kohtaa:
  1. lisää MicroBit - kirjasto #include "MicroBit.h"
  2. Vaihda "D5":n (pinnin nimi) tilalle käyttämäsi analogiapinni esim.  MICROBIT_PIN_P1
Ja sitten vain kiinnittämään summeria pinnin P1 ja GND:n väliin ja lataamaan ohjelmaa micro:bit:iin. Jos haluaa samalla tutkia ledinäytöllä missä mennään lisäsin tähän koodiin pieniä tulosteita (jotka asynkronisen toiminnan ansiosta toimivat samaan aikaan kuin melodia):

#include "mbed.h"
#include "MicroBit.h"
#include "pwm_tone.h"

MicroBit uBit;

PwmOut Buzzer(MICROBIT_PIN_P1);

float C_3 = 1000000/Do3,
       Cs_3 = 1000000/Do3s,
       D_3 = 1000000/Re3,
       Ds_3 = 1000000/Re3s,
       E_3 = 1000000/Mi3,
       F_3 = 1000000/Fa3,
       Fs_3 = 1000000/Fa3s,
       G_3 = 1000000/So3,
       Gs_3 = 1000000/So3s,
       A_3 = 1000000/La3,
       As_3 = 1000000/La3s,
       B_3 = 1000000/Ti3,
       C_4 = 1000000/Do4,
       Cs_4 = 1000000/Do4s,
       D_4 = 1000000/Re4,
       Ds_4 = 1000000/Re4s,
       E_4 = 1000000/Mi4,
       F_4 = 1000000/Fa4,
       Fs_4 = 1000000/Fa4s,
       G_4 = 1000000/So4,
       Gs_4 = 1000000/So4s,
       A_4 = 1000000/La4,
       As_4 = 1000000/La4s,
       B_4 = 1000000/Ti4,
       C_5 = 1000000/Do5,
       Cs_5 = 1000000/Do5s,
       D_5 = 1000000/Re5,
       Ds_5 = 1000000/Re5s,
       E_5 = 1000000/Mi5,
       F_5 = 1000000/Fa5,
       Fs_5 = 1000000/Fa5s,
       G_5 = 1000000/So5,
       Gs_5 = 1000000/So5s,
       A_5 = 1000000/La5,
       As_5 = 1000000/La5s,
       B_5 = 1000000/Ti5;

int tones[] = {E_4, D_4, C_4, D_4, E_4, E_4, E_4, 0, D_4, D_4, D_4, 0, E_4, G_4, G_4, 0, 
                             E_4, D_4, C_4, D_4, E_4, E_4, E_4, 0, D_4, D_4, E_4, D_4, C_4, 0, 0, 0};
int tones_num = 32;

int main(void)
{
    uBit.init();
    uBit.display.printAsync('C');
    Tune(Buzzer, C_4, 4);  //4 Octave C beat 4/16
    wait_ms(250);
    uBit.display.printAsync('D');
    Tune(Buzzer, D_4, 4);  //4 Octave D beat 4/16
    wait_ms(250);
    uBit.display.printAsync('E');
    Tune(Buzzer, E_4, 4);  //4 Octave E beat 4/16
    wait_ms(250);
    
    int i;
    
    uBit.display.scrollAsync("melody");
    
    for(i=0; i<tones_num; i++)
    {
        Auto_tunes(Buzzer, tones[i], 4); // Auto performance
        Stop_tunes(Buzzer);
    }
}

Eihän tämä lopulta vaikeaa ollut mutta sitäkin palkitsevampaa kun tuo pieni melodia lopulta tuli ulos :-) Se mitä tässä tarvittiin oli kirjasto, joka osaa tehdä PWM:ää (Pulse Width Modulation) analogiapinnille (PwmOut-rajapinta mbed-kirjastossa), tietoa eri sävelten taajuuksista (pwm_tone.h-tiedostossa). Esimerkkikoodissa muunnettiin sävelen taajuus värähdysajaksi (värähdysaika on taajuuden käänteisluku) mikrosekunneissa (µs). Esim. PWM värähdysaika 440Hz sävelelle on 1000000/440. Ja tuolla jaksonajalla vaihteleva jännite saa pietsoelementin sisällä olevan metallilevyn tuottamaan jotakuinkin yksiviivaista a:ta vastaavaa ääntä. Kaikkea sitä oppii kun näiden kanssa pelaa... 

Ja tilanne mbed-ArduinoCC micro:bit:in osalta on nyt virallisesti 2-0.

Ei kommentteja:

Lähetä kommentti