====== Projekt 2 LED-i juhtimine potentsiomeetriga ======
Ühendada Arduino plaadiga potentsiomeeter. Potentsiomeetri keskmine klemm ühendatakse analoogsisendisse ja äärmistest üks maa ning teine toitega.\\
{{:et:arduino:buttons:projekt2.jpg?400|}}
Korrektsel ühendamisel tekib mikrokontrolleri sisendviigu ja maa vahele potentsiomeetri asendist sõltuv pinge. Kui potentsiomeetrit pöörata ühest äärmusest teise, siis sisendpinge muutub vahemikus 0 kuni 5 V. Tekkinud ahelat nimetatakse pingejaguriks, mis jagab sisendpinge kahe takisti vahel proportsionaalselt takistuste väärtustele. Mikrokontroller muundab analoogsignaali (pingenivoo) digitaalsele kujule, mis jääb vahemikku 0-1023. Maksimaalne väärtus sõltub mikrokontrolleri analoog-digitaalmuunduri (ADC) resolutsioonist. Arduino-l on ADC üldjuhul 10 bitti ehk maksimum väärtus (2^10) - 1 = 1023, kuid saab seadistada ka 8 biti peale. Täpsemalt Arduino analoogsisendite kohta saab lugeda siit: [[https://www.arduino.cc/en/Tutorial/AnalogInputPins|]]
===== Näide #2.1 Potentsiomeetri pööramisel üle nivoo süttib LED =====
Mikrokontrolleril on sisendi digitaalsel kujul lugemisel kindel pingenivoo, millest alates väärtustatakse sisend kõrgeks. Keerates aeglaselt potentsiomeetrit on võimalik see lülitumise punkt üles leida. Muutusest annab märku LED viigul D13.
/*
Nimetus: Näide #2.1
Kirjeldus: Potentsiomeetri pööramisel üle nivoo süttib LED
*/
// Viik kuhu on ühendatud potentsiomeeter
const int pote = A1;
// Viik kuhu on ühendatud LED
const int led = 13;
// Potentsiomeetri muutuja väärtuse salvestamine ja selle algväärtustamine
int poteOlek = 0;
void setup()
{
/* Mikrokontrolleri viigud on tavaolekus sisendid ja seega ei pea
potentsiomeetri sisendit eraldi seadistama */
pinMode(led, OUTPUT); // Seadistame LED viigu väljundiks
}
void loop()
{
// Viigu muutuja hetkeväärtuse salvestamine
poteOlek = digitalRead(pote);
// Kui sisendviik on kõrge, siis seame LED viigu kõrgeks
if(poteOlek > 0)
{
digitalWrite(led, HIGH);
}
// Muul juhul seame led viigu madalaks
else
{
digitalWrite(led, LOW);
}
}
===== Näide #2.2 LED-i vilkumise sagedus sõltub potentsiomeetri asendist =====
Antud näide käsitleb LED-i vilgutamist analoogsisendi järgi. Sisendiks on eelmisest näitest tuttav potentsiomeeter. Sõltuvalt potentsiomeetri asendist muutuvad programmis viidete pikkused, mida on visuaalselt näha LED-i vilkumisest. Lühemate viidete korral vilkumise sagedus suureneb ja pikemate korral väheneb.
/* Nimetus: Näide #2.2
Kirjeldus: LED-i vilkumise sagedus sõltub potentsiomeetri asendist
*/
// Algus identne näitega #2.1 (kommenteeritud koodi vaata sealt)
const int pote = A1;
const int led = 13;
int poteOlek = 0;
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
// Potentsiomeetri muutuja hetkeväärtuse salvestamine
poteOlek = analogRead(pote);
// LED viigu oleku kõrgeks seadmine
digitalWrite(led, HIGH);
// Viite tekitamine, mille pikkus on võrdne potentsiomeetri sisendi väärtusega
delay(poteOlek);
// LED viigu oleku madalaks seadmine
digitalWrite(led, LOW);
// Viite tekitamine, mille pikkus on võrdne potentsiomeetri sisendi väärtusega
delay(poteOlek);
}
===== Näide #2.3 LED-i ereduse juhtimine potentsiomeetri asendi järgi =====
Arduino Unol puudub digitaal-analoogmuundur (DAC), mistõttu tuleb LED-i ereduse juhtimiseks seda kiirelt sisse ja välja lülitada. Teostades lülitusi piisaval kiirusel ei ole inimese silmaga LED-i vilkumine märgatav ning tekib tunne, et LED põleb ühtlaselt. Viigu oleku muutmine ise võtab mikrokontrolleril aega vaid mõni mikrosekund. Seega LED-i ereduse juhtimiseks tuleb kasutada viiteid lülituste vahel. Vajalike lühiajaliste viidete teostamiseks saab kasutada käsku //delayMicroseconds()//, mille minimaalne suurus on 1 mikrosekund ehk 0,001 ms. Võtame näiteks signaali pulsi perioodiks 1023 mikrosekundit. Sellest osa aega paneme LED-i põlema ja ülejäänud aja alati kustu. Niiviisi perioodis põlemas ja kustus oleku suhte reguleerimisega muutub ka LED-i eredus.
/* Nimetus: Näide #2.3
Kirjeldus: LED-i ereduse juhtimine potentsiomeetri asendi järgi */
// Algus identne näitega #2.1 (kommenteeritud koodi vaata sealt)
const int pote = A1;
const int led = 13;
int poteOlek = 0;
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
// Potentsiomeetri muutuja hetkeväärtuse salvestamine
poteOlek = analogRead(pote);
/* Kui potentsiomeetri väärtus on suurem kui 0, siis seame LED viigu kõrgeks,
seejärel programm ootab potentsiomeetri väärtusega võrdse arvu mikrosekundeid */
if (poteOlek > 0)
{
digitalWrite(led, HIGH);
delayMicroseconds(poteOlek);
}
// Seame LED viigu madalasse olekusse
digitalWrite(led, LOW);
// Programm ootab ülejäänud arvu mikrosekundeid perioodist
delayMicroseconds(1023 - poteOlek);
}
===== Harjutused =====
=== Harjutus #2.1 ===
Modifitseerida näitekoodi nii, et LED läheb põlema viigu kõrgest olekust madalasse olekusse minekul. Potentsiomeetri kogu pöördenurk vastab pingevahemikule 0-5 V. Leida ligilähedane pinge väärtus, mille juures Arduino sisend muutub madalast olekust kõrgesse olekusse ja vastupidi. Kas esineb hüsterees lülitumiste vahel? Tulemuse saamiseks võib kasutada potentsiomeetri nurka või jadapordi monitori.
=== Harjutus #2.2 ===
Modifitseerida näiteprogrammi nii, et potentsiomeetri keskpunktist (väärtus ~512) ühele poole reguleeritakse LED-i põlemas oleku viidet ja teisele poole kustus oleku viidet. Viite pikkuse reguleerimisel peab maksimaalne viite väärtus olema keskpunkti lähedal ja minimaalne lõpp-punktides. Fikseeritud viite pikkus peab olema 512 millisekundit. Seejuures reguleeritav viite pikkus peab jääma vahemikku 0 kuni 511. Tulemusena peaks ühes potentsiomeetri äärmuses LED olema püsivalt põlemas ja teises püsivalt kustus ning keskel võrdselt põlemas ja kustus.
=== Harjutus #2.3 ===
Modifitseerida näiteprogrammi nii, et LED põleb ainult potentsiomeetri pööramise ajal. LED-i põlemise eredus sõltub potentsiomeetri pööramise kiirusest.