====== 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.