Dedovanje z Arduinom

a.) Cilj učne aktivnosti
Razložiti uporabo dedovanja pri razredih na praktičnem primeru z uporabo zunanje periferije (Arduino + LED mini shield).
b.) Ciljna skupina
2. letnik tehniške gimnazije pri predmetu programiranje
c.) Podroben opis izvedbe učne aktivnosti

UVOD
Z dijaki bi ponovili osnovne pravila za konstrukcijo razreda in se bi spomnili našega razreda LED, nad katerim bi pokazali primer dedovanja. Nato bi skupaj analizirali spodnji izpeljani razred:

class MyRobot : public LED {
public:
    MyRobot(int a_ledPin) {
        pin = a_ledPin;
    }
};

Za domačo nalogo: http://www.cplusplus.com/doc/tutorial/inheritance/

Serijska komunikacija z Arduinom

a.) Cilj učne aktivnosti
Razložiti delovanje serijske komunikacije na praktičnem primeru z uporabo zunanje periferije (Arduino + LED mini shield).
b.) Ciljna skupina
2. letnik tehniške gimnazije pri predmetu programiranje
c.) Podroben opis izvedbe učne aktivnosti

UVOD
Z dijaki bi za uvod ponovili zgradbo Arduinota in kaj predstavljajo posamezne nažice (tu predpostavljam da bi dijaki že poznali Arduino, saj bi v primeru učenja programiranja z Arduinom to razložil že pri prvi uri tj. da bomo uporabljali Arduino kot didaktični pripomoček za učenje programiranja) in da za delovanje Arduina moramo poznati funkciji setup() in loop() (to predpostavljam tudi da bi učenci že poznali obe osnovni funkciji od prej). Napisali bi primer na tablo:

void setup() {
    // koda se izvede enkrat
}
void loop() {
    // koda se izvaja v neskončni zanki
}

SERIJSKA KOMUNIKACIJA
Razložil bi jim, da ko vzpostavimo povezavo ArduinoPC preko USB, se nožice D0 in D1 na Arduinu “zasedene” in da so rezervirane za serijsko komunikacijo (tako se prenese tudi program na Arduino). Predstavil bi jim uporabo knjižnice Serial. Napisali bi enostaven primer na tablo/projektor:

void setup() {
    Serial.begin(9600);
    Serial.println("Setting up ...");
}
void loop() {
    Serial.println("looping ...");
}

Dijakom bi razložil da to pride prav pri testiranju programa.

PRAKTIČNA VAJA
Dijakom bi razdelil Arduino, povezovalni kabel (USB) in mini LED shield*, ter bi jim dal za pretipkati spodnji program:

void setup() {
    Serial.begin(9600);
    Serial.println("Setting up ...");
}
void loop() {
    if (Serial.available() > 0) {
        
        int incomingByte = 0;
        // Preberemo znak za znakom
        incomingByte = Serial.read();

        // Izpišemo ...
        Serial.print("I received: ");
        Serial.println(incomingByte);
    }
}

Pokazal bi jim tudi kako pošiljamo/sprejemamo preko serijske povezave z računalnikom tj. “Serial monitor”, orodje s katerim spremljamo kako se naš program v Arduinu odvija. Pokazal bi jim kako beremo poslane podatke iz mikrokontrolerja na PC v Serial monitor, ter kako pošiljamo podatke iz PC –> mikrokontroler.

Omenil bi jim tudi knjižnico SoftwareSerial, s katero lahko naslovimo katerikoli digitalni vhod/izhod v serijsko komunikacijo z uporabo knjižnice SoftwareSerial.h

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
    mySerial.begin(9600);
    mySerial.println("Setting up ...");
}

Za domačo nalogo bi jim dal v razmislek komunikacija med dvema Arduino mikrokontrolerjema z uporabo SoftwareSerial.

Class z Arduinom

a.) Cilj učne aktivnosti
Razložiti uporabo razreda na praktičnem primeru z uporabo zunanje periferije (Arduino + LED mini shield)
b.) Ciljna skupina
2. letnik tehniške gimnazije pri predmetu programiranje
c.) Podroben opis izvedbe učne aktivnosti
UVOD
Za začetek bi na tablo napisali primer razreda:

class LED {
public:
    LED();  // konstruktor
    ~LED(); // destruktor
};

Razložil bi jim pomena besed konstruktor in destruktor, ter da se konstruktor metoda proži ko instanciramo spremenljivko tipa LED, ter da se destruktor proži, ko se gre spremenljivka tipa LED izven konteksta ali takrat ko jo ročno pobrišemo.

METODE (PO DOMAČE FUNKCIJE)
Dijakom bi razložil da funkcije v razredu kličemo metode, ter da poznamo metode ki vračajo vrednost (int, char, String, …) in metode ki ne vračajo vrednosti. Opozoril bi jih tudi na uporabo argumentov, ki so praktično vstopni podatki v naše metode, ter da lahko imamo več metod z istim imenom, z različnim številom vhodnih argumentov.

Dijakom bi razložil in na tablo narisal objekt, kocko ki bi predstavljala naš razred LED. Razložil bi pomen besed private in public, ki se uporabljajo v razredih in takoj bi formulirali eno privatno spremenljivko pin ter tri metode Init(), On() in Off(). V našo kocko na tabli bi slednje tudi napisali da si dijaki lažje predstavljajo o čem govorimo. Dijakom bi razdelil Arduino, povezovalni kabel (USB) in mini LED shield*, ter bi skupaj po nareku prepisali spodnji program:

class LED {
private:
    int pin;
public:
    // konstruktor
    LED(int a_pin) {
        pin = a_pin;
    }
    void Init() {
        pinMode(pin, OUTPUT);  // poudaril bi da se rezervirana funkcija pinMode mora klicati v setup();
    }
    void On() {
        digitalWrite(pin, HIGH);
    }
    void Off() {
        digitalWrite(pin, LOW);
    }
};

Za tem ko bi naš razred prepisali (in zbuildali brez napak), bi ga tudi testirali z enim enostavnim programom, ki ga bi podal na projektor:

LED led1(2);

void setup() {
    led1.Init();
}
void loop() {
    led1.On();
}

Z dijaki bi razširili metodo On(), tako da bi napisali še eno metodo On(int a_delay) ter podali še kot argument, število trajanja zakasnitve.

void On(int a_delay) {
    digitalWrite(pin, HIGH);
    delay(a_delay);     // zakasnitev
}

Skupaj z dijaki bi svoj razred razširili tako, da bi dodali še metodi Off(a_delay) in Blink(a_on, int a_off);

void Off(int a_delay) {
    digitalWrite(pin, LOW);
    delay(a_delay);     // zakasnitev
}

void Blink(int a_on, int a_off) {
    digitalWrite(pin, HIGH);
    delay(a_on);     // zakasnitev
    digitalWrite(pin, LOW);
    delay(a_on);     // zakasnitev
}

VAJE
Sledile bi praktične vaje z individualno pomočjo in frontalno podajanje skupnih nasvetov in napotkov pri pisanju programa.

Vaje bi skupaj prebrali in na hitro formulirali algoritme poteka na tablo z uporabo gradnikov: kvader, elipsa, romb in paralelogram.

1.) Z uporabo pravkar narejenega razreda LED instancirajte tri LED in jih poimenujte led1, led2 in led3. Led1 naj bo na nožici 2, led2 na nožici 3 ter led3 na nožici 4.
Rešitev:

LED led1(2);
LED led2(3);
LED led3(4);

2.) Inicializirajte pravkar instancirane led1, led2 in led3 v funkciji setup();

led1.Init();
led2.Init();
led3.Init();

3.) Napišite program ki prižiga in ugaša LED od led1 -> led3 in potem nazaj, od led3 -> led1. Vmes naj bo vsaj toliko premora da ga lahko zaznamo.

led1.Blink(100, 50);
led2.Blink(100, 50);
led3.Blink(100, 50);

Za domačo nalogo: http://www.cplusplus.com/doc/tutorial/classes/

Pogojni stavek z Arduinom

a.) Cilj učne aktivnosti
Razložiti uporabo if in switch pogojnega stavka na praktičnem primeru z uporabo zunanje periferije (Arduino + LED mini shield + stikalo)
b.) Ciljna skupina
2. letnik tehniške gimnazije pri predmetu programiranje
c.) Podroben opis izvedbe učne aktivnosti
UVOD
Z dijaki bi za uvod ponovili zgradbo Arduinota in kaj predstavljajo posamezne nažice (tu predpostavljam da bi dijaki že poznali Arduino, saj bi v primeru učenja programiranja z Arduinom to razložil že pri prvi uri tj. da bomo uporabljali Arduino kot didaktični pripomoček za učenje programiranja) in da za delovanje Arduina moramo poznati funkciji setup() in loop() (to predpostavljam tudi da bi učenci že poznali obe osnovni funkciji od prej). Napisali bi primer na tablo:

void setup() {
    // koda se izvede enkrat
}
void loop() {
    // koda se izvaja v neskončni zanki
}

O POGOJNEM STAVKU
Dijakom bi razložil da je pogojni stavek IF osnovni in najbolj pogosto uporabljen pogojni stavek v programiranju in da z njim lahko dosežemo to da program dela po določenih “pravilih”. Takoj bi na tablo podali primer pogojnega stavka IF:

int rezultat = 7*7;
if (rezultat > 30) {
    //
} else {

}

O OPERATORJIH
Z dijaki bi ponovili pomembnost operatorjev (za opreratorje se predstavlja da smo jih že obravnavali prej). Ponovili bi osnovne primerjalne operatorje: >, =, <=, ==, != in logične operatorje: &&, ||, !. Ponovili bi tudi osnovne prireditvene operatorje.

PRAKTIČNE VAJE
Dijakom bi razdelil Arduino, povezovalni kabel (USB), mini LED shield* in stikalo, ter jim dal za pretipkat spodnji program, ki vžge/ugasne LED v odvisnosti od stanja stikala:

void setup() {
    pinMode(3,  OUTPUT);
    pinMode(12, INPUT);
}

void loop() {
    if (digitalRead(12) == true) {
        digitalWrite(3, HIGH);
    } else {
        digitalWrite(3, LOW);
    }
}

Program bi skupaj analizirali in narisali algoritem poteka na tablo.

VAJE
Sledile bi praktične vaje z individualno pomočjo in frontalno podajanje skupnih nasvetov in napotkov pri pisanju programa.

Vaje bi skupaj prebrali in na hitro formulirali algoritme poteka na tablo z uporabo gradnikov: kvader, elipsa, romb in paralelogram. Povdarek bi dali na rom, saj v tem primeru predstavlja pogojni stavek.

1.) Pravkar napisani program, ki glede na stanje stikala prižiga/ugaša LED, popravite tako da naredi ravno obratno tj. da ob pritisku na tipko ugasne LED.
2.) Napišite nov program, ki ob pritisku na tipko naredi to, da LED začne utripati. Ko tipko spustimo se LED ugasne.
3.) Program 2.) popravite tako, da po pritisku na tipko LED začne utripati vedno hitreje. Ko tipko spustimo se LED ugasne.

Zanke z Arduinom

a.) Cilj učne aktivnosti
Razložiti uporabo for in while zanke na praktičnem primeru z uporabo zunanje periferije (Arduino + LED mini shield)
b.) Ciljna skupina
2. letnik tehniške gimnazije pri predmetu programiranje
c.) Podroben opis izvedbe učne aktivnosti
UVOD
Z dijaki bi za uvod ponovili zgradbo Arduinota in kaj predstavljajo posamezne nažice (tu predpostavljam da bi dijaki že poznali Arduino, saj bi v primeru učenja programiranja z Arduinom to razložil že pri prvi uri tj. da bomo uporabljali Arduino kot didaktični pripomoček za učenje programiranja) in da za delovanje Arduina moramo poznati funkciji setup() in loop() (to predpostavljam tudi da bi učenci že poznali obe osnovni funkciji od prej). Napisali bi primer na tablo:

void setup() {
/  / koda se izvede enkrat
}
void loop() {
  // koda se izvaja v neskončni zanki
}

O ZANKAH
Poudaril bi da so zanke koristne takrat ko želimo enega ali več stavkov izvršiti večkrat. Takoj bi na tablo/projektor napisali primera obeh zank:

Primer for zanke:

for (int i = 0; i < 10; ++i) {
  /* code */
}

Primer while zanke:

int i = 0;
while (i < 10) {
  /* code */
  i++;
}

Povdaril bi da so zgoraj napisane zanke ekvivalentne.

PRAKTIČNE VAJE

Dijakom bi razdelil Arduino, povezovalni kabel (USB) in mini LED shield*, ter bi jim dal za pretipkati spodnji program, s katerim dosežemo da ena LED utripa:

void setup() {
  pinMode(3,  OUTPUT);

}

void loop() {
  digitalWrite(3, HIGH);
  delay(100);
  digitalWrite(3, LOW);
  delay(100);
}

Z dijaki bi skupaj rešili nalogo, program, ki prižiga LED diode od leve proti desni, tako da hkrati gori lahko samo ena LED. Program bi skupaj analizirali in vsak bi svoj program testiral na primeru:

void setup() {
  pinMode(2,  OUTPUT);
  pinMode(3,  OUTPUT);
  pinMode(4,  OUTPUT);
  pinMode(5,  OUTPUT);
  pinMode(6,  OUTPUT);
  pinMode(7,  OUTPUT);
  pinMode(8,  OUTPUT);
}

void loop() {
  for (int i = 2; i <= 8; ++i) {
    digitalWrite(i, HIGH);
    delay(100);
    digitalWrite(i, LOW);
  }
}

Vmes bi postavil vprašanje: koliko je lahko najmajnši delaj (v ms), da še vidimo da LED utripa (predmetno povezovanje z Biologijo – OKO).

VAJE
Sledile bi praktične vaje z individualno pomočjo in frontalno podajanje skupnih nasvetov in napotkov pri pisanju programa.

Vaje bi skupaj prebrali in na hitro formulirali algoritme poteka na tablo z uporabo gradnikov: kvader, elipsa, romb in paralelogram.

1.) Z uporabo for zanke napišite program, ki prižge LED na nožici 2, nato led na nožici 3, itn. vse dokler se ne prižgejo vse LED. Med posameznimi vžigi naj LED gori vsaj 100 ms. Ko so prižgane vse LED, naj program počaka še 1 s in nato naj se vse LED ugasnejo.
2.) Program 1.) popravite tako da uporabite while zanko.
3.) Program 1.) popravite tako da na koncu programa, LED ugašajo v nasprotni smeri (uporabite zanko ki teče v nasprotno smer)
4.) Program 4.) napišite z uporabo while zanke.
5.) Napišite program, z uporabo ene for (ali while) zanke, ki prižiga LED tako, da v prvem koraku prižge prvo in zadnjo LED, v drugem koraku drugo in predzadnjo LED itn. Vmes naj program čaka vsaj 25 ms (najmajn kar lahko naše oko zazna, od tod tudi podatek za kamere, ki delujejo z ~25 fps)