perjantai 2. maaliskuuta 2018

micro:bit:in ohjelmointia ArduinoCC:llä

Koska seinä nousi pystyyn summerin soitossa mbed:in kanssa, päätin kokeilla toista C/C++ tyylistä ohjelmointiympäristöä ArduinoCC:tä micro:bit:in ohjelmointiin. micro:bit ei ole suoraan tuettu ArduinoCC:ssä (korttivalikosta ei löydy heti heittämällä micro:bit:iä), mutta sen voi ladata helposti. Valitse Tiedosto -> Asetukset ja lisää kohtaan "Additional Boards Managers URL"-kohtaan: https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json ja valitse ok. Tämän jälkeen avaa Työkalut -> Kortti -> Boards manager ja kirjoita hakukentään nRF5, valitse Nordic Semiconductors by Sandeep Mistry ja paina "asenna". Nyt voit käydä valitsemassa Työkalut -> Kortti -listasta micro:bit:in, muista myös valita oikea COM-portti kuten Arduinonkin kanssa. Valitse vielä Työkalut -> Softdevice valikosta "S110". Nyt sinulla on yhteys micro:bit:iin ja voit ohjelmoida sitä kuin Arduino:a. Koodi latautuu suoraan micro:bit:iin, eli sitä ei tarvitse erikseen siirtää kuten mbed:in tai JS Blocks:in kanssa.

micro:bit - tuen lisääminen ArduinoCC:hen (ensimmäinen vaihe)
micro:bit - tuen lisääminen ArduinoCC:hen (toinen vaihe)
Tässä pieni koodin pätkä, jossa ohjataan ledinäytön vasemman yläkulman lediä. Kun A-napista painetaan ledi alkaa vilkkua, kun napista B painetaan se pimenee ja kun mitään ei paineta, se palaa koko ajan.

const int COL1 = 3;
const int LED = 26;
const int buttonA = 5;     // the number of the pushbutton pin
const int buttonB = 11;    // the number of the pushbutton pin

void setup() {
  pinMode(COL1, OUTPUT);
  digitalWrite(COL1, LOW);
  pinMode(LED, OUTPUT);
  pinMode(buttonA, INPUT);  
  pinMode(buttonB, INPUT);   
}

void loop() {
  if (! digitalRead(buttonA)) {
    digitalWrite(LED, HIGH);
    delay(500);
    digitalWrite(LED, LOW);
    delay(500);
  } else if (! digitalRead(buttonB)) {
    digitalWrite(LED, LOW);
  } else {
    digitalWrite(LED, HIGH);
    }

  delay(10);
} 

Koska ledi näytön 25 lediä ohjataan 12 pinnillä oman logiikkansa mukaisesti (ledit multipleksattu, katso lisätietoa), sen käyttäminen ilman apukirjastoa on hieman sekavaa ja työlästä. Onneksi näytön ohjaamiseen on tarjolla kirjasto ja sen asentaminen onnistuu yhtä vaivattomasti kuin edellinenkin laajennos. Lataa github:ista seuraava zip-tietosto:  https://github.com/ht-deko/microbit_Screen/archive/master.zip ja avaa valikosta Sketsi -> Sisällytä kirjasto -> Tuo .ZIP kirjasto.

Kirjaston asentaminen ArduinoCC:hen
Valitse lataamasi .ZIP - tiedosto, jonka jälkeen voit lisätä sen koodiisi valikosta Sketsi -> Sisällytä kirjasto -> microbit_Screen-master. Tämän jälkeen koodiisi ilmestyy seuraava rivi koodia, joka ottaa kirjaston käytöön:

#include <microbit_Screen.h>

Tämän kirjaston avulla ledinäytölle saa vaivattomasti tekstiä, esimerkkinä se kuuluisa "Hello World!":

#include <microbit_Screen.h>

void setup() {
  SCREEN.begin();
}

void loop() {
  SCREEN.showString("Hello,World!");    
}

Vielä täytyy testata miten sen potentiometrillä ohjattavan RGB:n ledin ja summerin koodi oikein ArduinoCC:llä taittuisi... ja eihän se sitten lopulta toiminut. tone - funktiota ei löytynyt micro:bit:ille ja muutenkin koodin toiminta "pätki" eli ledi ei reagoinut reaaliajassa potentiometrin pyöritykseen kuten mbed:in kanssa. 1-0 mbed:ille ja 0-0 summerin käytössä :-)

Tässä kuitenkin koodi:

#include <microbit_Screen.h>

const int POTIKKA = 0;
const int SUMMERI = 1;
const int RGB_R = 8;
const int RGB_B = 3;
const int RGB_G = 16;

void setup() {
  SCREEN.begin();
  pinMode(RGB_R, OUTPUT);
  pinMode(RGB_B, OUTPUT); 
  pinMode(RGB_G, OUTPUT); 
  pinMode(SUMMERI, OUTPUT);
  pinMode(POTIKKA, INPUT);
}

void loop() {
    int sensorvalue = analogRead(POTIKKA);   // P1: 0 - 1024 
    SCREEN.showString(String(sensorvalue));
  //    tone(SUMMERI, sensorvalue);
    if(sensorvalue <= 340){
        digitalWrite(RGB_R, HIGH);
        digitalWrite(RGB_B, LOW);
        digitalWrite(RGB_G, LOW);        
        } else if(sensorvalue > 340 && sensorvalue <=680){
          digitalWrite(RGB_R, LOW);
          digitalWrite(RGB_B, HIGH);
          digitalWrite(RGB_G, LOW);
          } else {
            digitalWrite(RGB_R, LOW);
            digitalWrite(RGB_B, LOW);
            digitalWrite(RGB_G, HIGH);
            }
  delay(10);
}

Testikytkentä: potentiometri, RGB-ledi, summeri ja ledinäyttö

Ei kommentteja:

Lähetä kommentti