torstai 1. maaliskuuta 2018

Vieläkin lisää micro:bit:in ohjelmointia C++:llä mbed:in kautta

Kuten aika usein, nälkä kasvaa syödessä. Kolmas päivä putkeen micro:bit:in ja C++:n kanssa (no onneksi on loma).

Tänään otin esille Kitronik breakout boardin, jonka avulla pääsee eroon hauenleukajohdoista ja samalla saa käyttöönsä myös ne pienemmät pinnit, joihin hauenleukaa ei edes saa kiinni.

Ensimmäiseksi tein digitaalisen lämpömittarin, joka näyttää lämpötilalukemaa ledinäytöllä. micro:bit:issä on myös sisäinen lämpömittari, mutta sen lämpötila kuvaa lähinnä piirilevyn lämpötilaa, ei huoneen lämpötilaa. Testauksessa myön paristokotelo, jonka avulla laitteen voi irrottaa tietokoneesta. Tällainen kytkentä siitä tuli:

Kitronik breakout board, lämpötilasensori LM35 ja paristokotelo
Ja koodina tällainen:

#include "MicroBit.h"

MicroBit uBit;

float rawToTemp(int x){
  float temp = 0;
  temp = (3.0*x*100)/1024;
  return temp;
}    

int main()
{
    uBit.init();
    
    while(1){
    int sensorvalue = uBit.io.P0.getAnalogValue();   
    int t = static_cast<int>(rawToTemp(sensorvalue));
    uBit.display.scrollAsync(t);
    uBit.sleep(2);
    }
}

Aluksi idea oli kytkeä mukaan myös summeri (buzzer) mutta käytetyssä rajapinnassa ei ollutkaan tukea äänille, ja digitaalinen on/off sai aikaan vain napsumista ja analoginen jännitteen säätö vaimeaa pörinää. Lämpötilan vaihtuminen oli myös hyvin jähmeää, puhaltelemalla se ei meinannut nousta ollenkaan ja pakkasessakin lämpötila laski hyvin hitaasti (ei alle +6 asteen, vaikka ulkona oli -15 astetta). Ei kovin optimaalinen mittari siis.

Seuraava kokeilu toimikin jo paremmin: RGB-ledin ohjaaminen potentiometrillä. Kytkin potentiometrin pinniin P0 ja RGB-ledin pinneihin P1, P2 ja P16. Koska halusin näyttää  potentiometrin antaman lukeman ledinäyttöä, käyttööni ei jäänyt yhtään vapaata analogiapinniä (ovat ledinäytön kanssa yhteisiä), joten jouduin tyytymään digitaaliseen toimintaan (pinni P16 on vain digitaalinen), ja tämä rajoitti hieman RGB-ledin käyttöä. Ohjelma toimii niin, että pienillä potentiometrin arvoilla ledi näyttää punaista, keskivälillä vihreä ja suurilla arvoilla sinistä valoa.

Tässä koodi:

#include "MicroBit.h"

MicroBit uBit;

int main()
{
    uBit.init();
    
    while(1){
    int sensorvalue = uBit.io.P0.getAnalogValue();
    uBit.display.scrollAsync(sensorvalue);
    if(sensorvalue <= 340){
        uBit.io.P1.setDigitalValue(1);
        uBit.io.P2.setDigitalValue(0);
        uBit.io.P16.setDigitalValue(0);
        } else if(sensorvalue > 340 && sensorvalue <=680){
            uBit.io.P1.setDigitalValue(0);
            uBit.io.P2.setDigitalValue(1);  
            uBit.io.P16.setDigitalValue(0);
            } else {
                uBit.io.P1.setDigitalValue(0);
                uBit.io.P2.setDigitalValue(0);   
                uBit.io.P16.setDigitalValue(1);
                }
        }
}

RGB-ledi punainen

RGB-ledi vihreä

RGB-ledi sininen

Breakout board on kyllä kätevä verrattuna hauenleukoihin mutta varsinaisesti sitä tarvitsee vasta sitten kun GPIO-pinnejä tarvitaan enemmän kuin kolme. micro:bit:in pinnien käyttö on hieman sekavampaa kuin Arduinossa mutta tämän kuvan ja taulukon avulla siitäkin saa tolkkua.

PS: Ja sen summerin saa soimaan JS Blocks micro:bit:in avulla 440Hz:n taajuudella tällä koodilla (ääni on niin hiljainen, että mikään varashälytin tämä ei ole :-)):


Ei kommentteja:

Lähetä kommentti