Arduino učionica: 3. -Fading LED

Okej, svetleći krug smo savladali (nadam se), sada ćemo ponovo raditi sa LED, ali ovog puta samo sa jednom. U ovom tutorijalu pokazaćemo kako manuelno možemo smanjivati i pojačavati osvetljenje LED korišćenjem PWM signala.

Potrebno:

  • Arduino
  • Kratkosponici
  • 1 LED
  • 330R  otpornik
  • Obrtni potenciometar

Ono što je novo je to što do sada nismo radili sa PWM signalima (šta je PWM – pročitaj OVDE), kao i to što ćemo po prvi put koristiti analogni ulaz na Arduinu.

Obrtni potenciometri su grupa otpornika sa promenljivom otpornošću (o otpornicima možete pročitati u OVOM tutorijalu). Oni predstavljaju otpornike koji menjaju svoje otpornosti prilikom obrtanja kliznog kontakta koji klizi između 2 kraja otporničke trake, što se može predstaviti i kao razdelnik napona. Oni su mehanički sklop pa su zato podložni brzom habanju, ali za naše potrebe kvalitet nije od presudne važnosti.

potenciometar

Povezivanje

Potenciometar se povezuje tako što ćemo njegov srednji izvod povezati sa analognim ulazom na Arduinu, a ostala 2 izvoda povezati za GND i +5V. Arduino poseduje 10-bitni A/D konvertor koji analogne vrednosti konvertuje u digitalne u rasponu od 0-1023 (2na10), a PWM izlaz ima 8-bitni opseg, tačnije od 0-255 (2na8). Razlike u rasponima ćemo regulisati softverski.

LED povezati kao i u dosadašnjim tutorijalima, s tim što ovaj put moramo obratiti pažnju na to da li digitalni izlaz na koji povezujemo LED ima mogućnost generisanja PWM signala (kod Uno modela to su pinovi 3, 5, 6, 9, 10, 11). Katodu preko 330R otpornika ćemo povezati na GND

Pisanje koda

Sada ćemo se susreti sa novim funkcijama, a to su analogRead(), analogWrite() i map().

AnalogRead funkcija radi iščitavanje zadatog analognog ulaza, i to u rasponu vrednosti od 0 do 1023.

Sintaksa analogRead funkcije

analogRead(kojiPin);

Obično se koristi u 2 oblika:

Jedan od upotreba ove funkcije je u nekom uslovu gde se piše recimo:

If(analogRead(0) > 100){}

Gde se postavlja uslov „Ako je iščitavanje analognog ulaza 0 veće od 100…“

I drugi način je, kao i što ćemo mi koristiti:

Iščitavanje = analogRead(0);

Gde promenljivoj iščitavanje dodeljujemo vrednost sa analognog ulaza 0, tako da u nastavku koda ovu promenljivu posmatramo kao promenljivu koja ima 1 vrednost koja se očitala u tom trenutku.


Funkcija analogWrite se po upotrebi ne razlikuje mnogo od funkcije digitalWrite koju smo koristili do sada, samo što u ovom slučaju umesto HIGH i LOW pišemo konkretnu vrednost u rasponu od 0 do 255, jer je reč o imitiranju analognog izlaza, kada želimo da postignemo neko postepeno aktiviranje pina, ili se koristi za upravljanje nekih drugih elektronskih sklopova, kao i za pokretanje i upravljanje određenih motora i aktuatora.

Sintaksa analogWrite funkcije

analogWrite(kojiPin,vrednost);

Kada koristimo ovu funkciju, na mestu gde treba upisati vrednost možemo koristiti i određene promenljive, a ne samo konkretne brojeve od 0 do 255. U našem slučaju pisaćemo:

analogWrite(ledPin,pwmVal);


Dok funkcija map služi za „mapiranje“, tačnije za usklađivanje, modifikovanje i kreiranje različitih raspona. Mi ćemo je koristiti jer moramo da uskladimo ulazni raspon od 0-1023 sa izlaznim PWM rasponom od 0-255.

Sintaksa map funkcije

map(promenljiva, odMin, odMax, doMin, doMax);

Kada bi pisalo recimo:

map(nekaProm, 0, 150, 10, 300);

Ulazne vrednosti su od 0-150 i one bi se izjednačile sa izlaznim rasponom od 10-300, tačnije ulazna vrednost 0 na izlazu bi imala vrednost 10, ili ulazna vrednost 150 na izlazu bi imala vrednost 300.

Sada možete videti celokupan kod, gde će vam implementacijom ovih funkcija njihova svrha biti jasnija:


int potPin = A0; //definisanje pina na koji ce biti prikacen srednji izvod potenciometra - pin A0
int potVal;      //deklarisanje promenljive koja ce predstavljati iscitanu vrednost potenciometra

int ledPin = 2;  //definisanje pina na koji ce biti prikacena LED, mora biti PWM - pin 2
int pwmVal;      //deklarisanje promenljive koja ce predstavljati upravljacku rednost osvetljenja LED - pwm

void setup(){
  pinMode(potPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop(){
  potVal = analogRead(potPin);        //definisanje promenljive potVal, dodeljujemo joj iscitanu vrednost funkcijom analogRead(imePina)
  
  pwmVal = map(potVal,0,1023,0,255);  //definisemo vrednost promenljive pwmVal, uz pomoc funkcije map(kojaPromenljiva, odMin, odMax, doMin, doMax), sluzi za ujednacavanje raspona i opsega, tzv mapiranje
  
  analogWrite(ledPin,pwmVal);         //zadavanje vrednosti LED, kontrola osvetljnja
}

Očekujem pitanja, sugestije, kritike ili predloge! Veliki pozdrav do sledećeg teksta 🙂

Autor:

Aleksa Ristić

Student, bloger u pokušaju, veliki entuzijast i kreativac

Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s