keskiviikko 28. helmikuuta 2018

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

BBC micro:bit:in ohjelmointi onnistuu monella eri välineellä: graafisesti JS Blocks:in kautta tai Micropython:illa. Näissä on kuitenkin omat rajoitteensa. Jos haluaa päästä katsomaan mitä konepellin alle on piilotettu, kannattaa tarttua kiinni hieman alemman tason rajapintaan ja ohjelmoida suoraan käyttäen microbit-dal:ia (Device Abstraction Layer). Se onnistuu näppärästi nettiselaimessa toimivan mbed - ympäristön avulla. mbed vaatii kirjautumisen ja sen jälkeen voit jo aloittaa lataamalla demokoodeja. Kääntäminen ja hex-tiedoston siirtäminen micro:bit:iin toimii samalla tavalla kuin muissakin selainpohjaisissa ympäristöissä: hex - tiedosto siirretään ladatuista tiedostoista USB-portissa näkyvälle micro:bit-levylle.

mbed-ohjelmointiympäristö toimii nettiselaimessa (tarvittavat microbit-kirjastot latautuivat siihen itsestään)
Yksinkertaisin esimerkki on Hello World, joka saa tekstin skrollaamaan micro:bitin näytöllä:

#include "MicroBit.h"
MicroBit uBit;

int main()
{
    uBit.init();
    uBit.display.scroll("Hello World!");
    release_fiber();
}

Huomattavaa koodissa on se, että Microbit-objektin instanssi (uBit) pitää luoda ennen main():iä, jotta se on globaalimuuttuja. Main:in sisällä se ensin alustetaan init-metodilla ja sen jälkeen sitä käytetään ledimatriisin (display) ohjaamiseen. fiber tarkoittanee lähinnä säiettä, joka lopuksi vapautetaan. 

Tässä esimerkissä reagoidaan nappeihin A, B sekä P0-pinnin kosketukseen GND:n kanssa (laita jotakin sähköäjohtavaa P0:n ja GND:n väliin).

#include "MicroBit.h"
MicroBit uBit;

void onButton(MicroBitEvent e)
{
    if (e.source == MICROBIT_ID_BUTTON_A)
        uBit.display.printChar('A');

    if (e.source == MICROBIT_ID_BUTTON_B)
        uBit.display.printChar('B');

    if (e.source == MICROBIT_ID_IO_P0)
        uBit.display.printChar('0');
}

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_P0, MICROBIT_EVT_ANY, onButton);
    uBit.io.P0.isTouched();

    while (1)
        uBit.sleep(10000);
}

Tässä esimerkissä käytetään erilaisia eventtejä. Jotta ohjelma saa ne, niiden kuunteluun pitää ensin rekisteröityä messageBus.listen - metodilla. Samalla kerrotaan eventhandler-funktion nimi (onButton). Ennen kun koodi laitetaan odottamaan eventtejä (sleep) alustetaan P0 - pinni toimimaan "on/off" moodissa eli reagoimaan kosketukseen kuin painonappi.  Eventhandler-funktiossa tutkitaan eventin tyyppiä ehtolauseiden avulla ja näytetään eri merkkejä näytöllä. 

Sormi johtaa sen verran sähköä, että P0-pinni yhdistyy GND:hen ja syntyy virtapiiri
 Dokumentti tämän kirjaston käyttöön löytyy täältä. Vaikka itse en ole graafisten ympäristöjen ystävä, oppilaiden kanssa niistä on aloitettava. Jää nähtäväksi kuinka monelle se jää yläkoulun aikana liian pieneksi pääsemme kiinni C++:aan...   

Ei kommentteja:

Lähetä kommentti