keskiviikko 28. helmikuuta 2018

Lisää micro:bit:in ohjelmointia C++:lla mbed:in kautta

Jatkoin tänään tutustumista micro:bit:in ohjelmointiin C++:lla. Nyt kokeilulistalla oli ulkoiset GPIO-pinnit. micro:bit:in leveät pinnit P0, P1 ja P2 ovat yleispinnejä, eli ne voivat toimia sekä digitaali- että analogiapinneinä niin input kuin output -moodeissa ja pinnin toimintamoodia voi jopa vaihtaa lennossa! Tein tallaisen perinteisen ledin himmentimen, jossa valovastukselta luettu analoginen arvo (0-1024) syötetään sellaisenaan ledille. Kun valon määrä kasvaa, ledi himmenee.

Valovastus ja ledi kytkettynä micro:bit:iin koekytkentälevyn avulla
Koodi on lyhyt:

#include "MicroBit.h"

MicroBit uBit;

int main()
{
    uBit.init();
    
    while(1){
    int valo = uBit.io.P1.getAnalogValue();    
    uBit.io.P0.setAnalogValue(valo);          
    uBit.display.scrollAsync(valo);
    uBit.sleep(10);
    }
}

Valosensorin antamaa arvoa oli kätevä tutkia tulostamalla se ledinäytölle (uBit.display.scroll), mutta tämä aiheutti ohjelmaan hitautta, koska säie jäi odottamaan metodin paluuta. Pienen tutkimisen jälkeen löysin asynkronisen scroll-metodin, joka palaa heti ja jää suorittamaan scrollausta taustalla (uBit.display.scrollAsync). Näin sen homman pitää toimia :-)

Toinen kokeilu liittyi ledin vilkutteluun digitaalimoodissa (on/off) ja kuvioiden tulostamiseen ledinäytölle. A-nappia painamalla ledi alkaa vilkkumaan päälle ja pois sekunnin välein, B-napista tulostuu risti keskelle näyttöä, ja P1-pinnin yhdistäminen GND:n kanssa saa aikaan ristikuvion liikkumisen ledinäytön vasemmasta yläkulmasta oikeaan alakulmaan.

Kuvan saaminen ledinäytölle vaikuttaa helpolta, MicroBitImage-objekti luodaan antamalla ledien valaistusarvot (0-255) merkkijonona vaakariveittäin pilkulla erotettuna (rivin loppussa rivinvaihto \n).

Ledin vilkuttelua ja ristin liikuttelua näytöllä

#include "MicroBit.h"


MicroBit uBit;
MicroBitImage cross("0,255,0\n255,255,255\n0,255,0\n");

void printCross(int x, int y){
        MicroBitImage image(5,5);
        image.paste(cross, x, y);
        uBit.display.print(image);
}

void onButton(MicroBitEvent e)
{
    if (e.source == MICROBIT_ID_BUTTON_A){
       for(int i=0; i<3; i++){
            uBit.io.P0.setDigitalValue(1);
            uBit.sleep(1000);
            uBit.io.P0.setDigitalValue(0);
            uBit.sleep(1000);
            }
        }

    if (e.source == MICROBIT_ID_BUTTON_B)
        printCross(1, 1);

    if (e.source == MICROBIT_ID_IO_P1){
        for(int i=0; i<3; i++){
            printCross(i, i);
            uBit.sleep(1000);
        }
    }
}

int main()
{
    uBit.init();

    uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, onButton);
    uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, onButton);
    uBit.messageBus.listen(MICROBIT_ID_IO_P1, MICROBIT_EVT_ANY, onButton);
    uBit.io.P1.isTouched();
     
    while (1)
        uBit.sleep(10000);
}  

Ainakin näiden kokeilujen perusteella dokumentaatio on selkeää ja koodin saa toimimaan vaivattomasti. Mainio systeemi tämä mbed micro:bit! 

Ainoa ihmettelyn aihe tänään on se, miksi micro:bit tekee kaiken kolmeen kertaan (teksti skrollaa ruudulla kolme kertaa, ledit vilkkuvat kolme kertaa enemmän kuin koodin mukaan pitäisi). Ehkä tällekin löytyy vielä jokin selitys :-)  

Ei kommentteja:

Lähetä kommentti