Ühendada Arduino plaadiga potentsiomeeter. Potentsiomeetri keskmine klemm ühendatakse analoogsisendisse ja äärmistest üks maa ning teine toitega.
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
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); } }
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); }
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); }
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.
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.
Modifitseerida näiteprogrammi nii, et LED põleb ainult potentsiomeetri pööramise ajal. LED-i põlemise eredus sõltub potentsiomeetri pööramise kiirusest.