elektronika
o.O wtFAQ – We Tinker, Fix and Question
◀ Ponavljanje osnova elektronike i mjerenja

Arduino - korak po korak
Od ručne kontrole do automatskog svjetla

Kontrola svjetla

Primjena iz svakodnevnog života: svjetlo u hladnjaku

Gotovo svaki hladnjak ima svjetlo koje se automatski uključi kada otvorimo vrata i ugasi kada ih zatvorimo.

U jednostavnijim hladnjacima to radi prekidač u okviru vrata. Kada su vrata zatvorena, vrata pritisnu prekidač i svjetlo se ugasi. Kada otvorimo vrata, prekidač se otpusti i svjetlo se uključi.

Na ovoj radionici nećemo rastavljati ni spajati pravi hladnjak. Umjesto toga izradit ćemo sigurni niskonaponski model koji pokazuje isti princip upravljanja svjetlom.

otvorena vrata ⇒ prekidač je otpušten ⇒ svjetlo je uključeno zatvorena vrata ⇒ prekidač je pritisnut ⇒ svjetlo je isključeno

Najprije ćemo isti princip isprobati običnim tipkalom. Tipkalo će predstavljati prekidač vrata hladnjaka.

Klasičan pristup kontrole svjetla

Promotrimo prvo ovu shemu:

shema

Kada pritisnemo tipku, LED će zasvijetliti.

Možete li prepoznati problem u primjeni ovog sklopa u hladnjaku?
Vrata hladnjaka će, prilikom zatvaranja, pritisnuti prekidač i LED-ica će zasvijetliti. Samo, nama ne treba svjetlo dok su vrata zatvorena, već kada su otvorena.

Cilj ove radionice je razumjeti kako mala promjena u upravljačkom dijelu sklopa može uključiti LED-icu preko NPN tranzistora.

1. tipkalo, potenciometar i tranzistor

shema

Ovo je najjednostavniji početni sklop. Promjenjivi otpornik dovodi mali upravljački signal (napon) na bazu NPN tranzistora, koji drži tranzistor uključenim i kroz LED-icu može poteći struja. Kada se tipkalo pritisne, upravljački napon nestaje (tipkalo ga spaja na GND, tj. na 0 V).

Ovdje koristimo promjenjivi otpornik, kojim reguliramo jačinu struje kroz bazu tranzistora (upravljački signal).

Uveli smo dva nova elektronička elementa: promjenjivi otpornik i tranzistor.

Promjenjivi otpornik: potenciometar
Promjenjivi otpornik

Potenciometar je otpornik čiju vrijednost možemo mijenjati okretanjem osovine. U sebi ima otpornu stazu i pomični kontakt, koji zovemo klizač. Zbog toga ima tri izvoda: dva krajnja izvoda i srednji izvod klizača.

Između dva krajnja izvoda otpor je uvijek jednak nazivnoj vrijednosti potenciometra, primjerice 10 kΩ. Kada okrećemo osovinu, mijenja se otpor između srednjeg izvoda, odnosno klizača, i svakog krajnjeg izvoda.

U ovom sklopu ne koristimo potenciometar kao klasični djelitelj napona s tri odvojena priključka. Koristimo ga kao promjenjivi otpornik, koji se naziva i reostat. Srednji izvod klizača spajamo sa jednim krajnjim izvodom i tako dobijamo otpornik promjenjive vrijednosti. Tako je između +5 V i upravljačke točke uvijek neki promjenjivi otpor: od približno 0 Ω do približno 10 kΩ.

Kako radi NPN tranzistor?

NPN tranzistor je elektronička komponenta s tri priključka: baza (B), kolektor (C) i emiter (E).

2N2222 2N2222

U našem sklopu tranzistor radi kao elektronički prekidač. Mala promjena napona i struje na bazi određuje može li veća struja prolaziti između kolektora i emitera.

  • Kada na bazi nema dovoljnog napona, tranzistor je zatvoren. Struja ne prolazi od kolektora prema emiteru, pa LED-ica ne svijetli.
  • Kada baza dobije dovoljan napon u odnosu na emiter, tranzistor se otvara. Tada struja može proći kroz LED-icu, kolektor i emiter prema GND.

Obrati pažnju da struja koju propuštamo kroz bazu utječe na otvaranje tranzistora, tj. na jačinu struje između kolektora i emitera. U sklopu tranzistora kao prekidač je struja kroz bazu dovoljno velika da dopusti maksimalno dozvoljenu struju između kolektora i emitera.

Zašto je potreban R1?

Promjenjivi otpornik R1 od 10 kΩ naziva se pull-up otpornik.

Kada tipkalo nije pritisnuto, on povlači bazu tranzistora prema +5 V. Tako baza nije u zraku, tranzistor ostaje pouzdano uključen, a LED-ica upaljena.

Bez pull-up otpornika baza može uhvatiti smetnje ili slučajni napon. Tada LED može slabo svijetliti, treperiti ili se ponašati nepredvidljivo.

Shema spajanja na breadboardu:

Kontrola svjetla

2. Fotootpornik (LDR), potenciometar i tranzistor

shema

U drugom sklopu tipkalo zamjenjujemo LDR-om, odnosno fotootpornikom.
LDR je otpornik čija se vrijednost mijenja ovisno o količini svjetla:

  • više svjetla ⇒ manji otpor LDR-a
  • manje svjetla ⇒ veći otpor LDR-a

U ovom sklopu potenciometar R1 i LDR R4 čine djelitelj napona.
Napon na upravljačkoj točki zatim kroz otpornik R2 dolazi na bazu tranzistora.

Što je djelitelj napona?

Djelitelj napona (ili *djelilo* napona) je jednostavan sklop s dva otpornika spojena jedan za drugim između plusa napajanja i mase, odnosno GND.

Na mjestu između otpornika dobivamo novi napon. Taj napon može biti manji od napona izvora i mijenja se ovisno o vrijednostima otpornika.

Djelilo napona

U našem sklopu LDR i promjenjivi otpornik od 10 kΩ zajedno stvaraju djelitelj napona. Kada se promijeni količina svjetla, promijeni se otpor LDR-a. Zato se promijeni i napon na bazi tranzistora T1

Kako sklop reagira na svjetlo?

Kada je LDR osvijetljen, njegov je otpor mali. On tada lakše povlači upravljačku točku prema GND, te više struje prolazi kroz njega, a manje kroz bazu tranzistora, što rezultira njegovim zatvaranjem.

Kada prekrijemo LDR i postane tamnije, njegov otpor raste. Potenciometar tada može povući upravljačku točku prema +5 V.

Za ovaj djelitelj napona vrijedi:

\[ U_d = U \times \frac{R_1}{R_1 + R_4} \]

Potenciometar podešava prag tame
LDR određuje koliko je svijetlo ili tamno. Potenciometar određuje pri kojoj količini svjetla želimo da se LED-ica počne uključivati.
Drugim riječima: LDR je senzor, a potenciometar je ručno podešavanje osjetljivosti.

Zašto postoji R2?

Otpornik R2 od 10 kΩ nalazi se između izlaza djelitelja napona i baze NPN tranzistora.

On:

  • ograničava struju koja može ući u bazu tranzistora
  • štiti tranzistor i ostale komponente
  • sprječava da upravljački dio sklopa nepotrebno troši veliku struju
  • odvaja djelitelj napona od baze tranzistora

Bez R2 baza tranzistora mogla bi povući previše struje, osobito kada je potenciometar postavljen na mali otpor, a LDR je u tami.

3. Arduino verzija: LDR očitava svjetlo, program upravlja LED-icom

U prethodnom sklopu LDR, promjenjivi otpornik i NPN tranzistor zajedno su određivali kada LED-ica svijetli. Sada Arduino preuzima dio posla: očitava količinu svjetla, programom odlučuje kako LED-ica treba reagirati, a zatim PWM signalom upravlja tranzistorom.

shema

U ovoj verziji Arduino ne napaja LED-icu izravno preko svog pina. Pin D9 šalje upravljački signal prema bazi tranzistora T2, a tranzistor upravlja strujom kroz LED-icu. Tako učimo važan princip koji ćemo koristiti i kasnije uz motore, jače LED-ice, releje i druge potrošače:

Princip upravljanja Arduinom
Arduino pin šalje upravljački signal, a tranzistor omogućuje upravljanje zasebnim strujnim putem za potrošač.

Kako je spojen sklop?

Shema ima tri glavna dijela:

  1. LDR i promjenjivi otpornik ⇒ analogni ulaz A0
  2. Arduino PWM izlaz D9 ⇒ bazni otpornik R2 ⇒ baza NPN tranzistora
  3. +5 V ⇒ LED otpornik R3 ⇒ LED D1 ⇒ tranzistor ⇒ GND

Svi dijelovi sklopa moraju dijeliti zajedničku masu, odnosno GND. To znači da su Arduino GND, minus napajanja, donji kraj LDR-a i emiter tranzistora povezani na istu točku.

Zajednički GND je obavezan
Arduino može pravilno upravljati tranzistorom samo ako Arduino i ostatak sklopa imaju zajedničku masu. Ako GND nije povezan, Arduino D9 signal nema zajedničku referencu i LED-ica se može ponašati nepredvidljivo ili uopće neće reagirati.

LDR i analogni ulaz A0

LDR je fotootpornik. Njegov otpor mijenja se ovisno o količini svjetla:

  • više svjetla ⇒ manji otpor LDR-a
  • manje svjetla ⇒ veći otpor LDR-a

U ovoj shemi LDR je spojen prema GND, a potenciometar RV1 prema +5 V. Potenciometar i LDR tvore djelitelj napona.

Potenciometar R1 koristi se kao promjenjivi otpornik: srednji izvod, klizač, spojen je s jednim krajnjim izvodom. Zato se njegov otpor između +5 V i točke A0 može mijenjati od približno 0 Ω do približno 10 kΩ.

Kada je LDR jako osvijetljen, njegov je otpor manji. Tada lakše povlači točku A0 prema GND, pa Arduino očitava manji napon.

Kada LDR prekrijemo i postane tamnije, njegov otpor raste. Tada se točka A0 preko potenciometra više povlači prema +5 V, pa Arduino očitava veći napon.

  • više svjetla ⇒ manji otpor LDR-a ⇒ manji napon na A0 ⇒ manja vrijednost analogRead()
  • manje svjetla ⇒ veći otpor LDR-a ⇒ veći napon na A0 ⇒ veća vrijednost analogRead()

Arduino analogni ulaz ne očitava svjetlo izravno. On mjeri napon na pinu A0 i pretvara ga u broj. Na klasičnim Arduino Uno i Nano pločicama analogRead() najčešće vraća vrijednost od 0 do 1023.

int svjetlo = analogRead(A0);

D9, PWM i tranzistor

Arduino pin D9 je PWM pin. To znači da može vrlo brzo mijenjati stanje između HIGH i LOW.

PWM je skraćenica za Pulse Width Modulation. Ako je pin uključen kratko, LED-ica izgleda slabije osvijetljena. Ako je uključen veći dio vremena, LED-ica izgleda jače osvijetljena.

PWM

Arduino program upravlja PWM-om funkcijom analogWrite():

  • analogWrite(9, 0); - LED je ugašena
  • analogWrite(9, 64); - LED svijetli slabo
  • analogWrite(9, 128); - LED svijetli srednje jako
  • analogWrite(9, 255); - LED svijetli najjače
    PWM signal s pina D9 ne ide izravno na LED-icu. Najprije prolazi kroz bazni otpornik R2 od 10 kΩ, a zatim dolazi na bazu NPN tranzistora T1.

Otpornik R2 ograničava baznu struju. Bez njega bi Arduino pin i tranzistor mogli biti nepotrebno opterećeni.

Kada je Arduino D9 većinom u stanju HIGH, baza tranzistora dobiva napon, tranzistor provodi i LED-ica svijetli. Kada je D9 u stanju LOW, tranzistor se zatvara i LED-ica se gasi.

  • D9 = LOW ⇒ tranzistor zatvoren ⇒ LED ugašena
  • D9 = HIGH ⇒ tranzistor provodi ⇒ LED svijetli

Kada Arduino šalje PWM signal, tranzistor se vrlo brzo uključuje i isključuje. Zbog toga LED-ica izgleda kao da joj se jačina mijenja postupno.

Shema spajanja na breadboardu:

Kontrola svjetla

Program: LED jače svijetli u tami

U ovoj shemi veća vrijednost na A0 znači više tame. Zato veću vrijednost senzora pretvaramo u veću PWM vrijednost za pin D9.

Program radi ovim redoslijedom:

  1. analogRead(ldrPin) očitava napon na A0.
  2. U našem sklopu više tame daje veću očitanu vrijednost.
  3. map() pretvara raspon 0–1023 u PWM raspon 0–255.
  4. analogWrite() šalje PWM signal na D9.
  5. D9 preko R1 upravlja bazom tranzistora.
  6. Tranzistor upravlja strujom kroz LED-icu.
  7. LED-ica svijetli jače kada je LDR u tami.
// C++
const int ldrPin = A0;
const int ledPin = 9;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int svjetlo = analogRead(ldrPin);

  int jacinaLedice = map(svjetlo, 0, 1023, 0, 255);
  jacinaLedice = constrain(jacinaLedice, 0, 255);

  analogWrite(ledPin, jacinaLedice);

  Serial.print("Svjetlo: ");
  Serial.print(svjetlo);
  Serial.print("  PWM LED: ");
  Serial.println(jacinaLedice);

  delay(50);
}

Testiranje i podešavanje

Nakon učitavanja programa otvorimo Serial Monitor pri brzini 9600 baud.

Zatim:

  1. Usmjerimo svjetlo prema LDR-u.
  2. Prekrijemo LDR rukom ili kartonom.
  3. Promatramo mijenja li se broj na serijskom monitoru.
  4. Promatramo reagira li LED-ica promjenom jačine.
  5. Okrećemo potenciometar R1 i promatramo kako se mijenja osjetljivost sklopa.
  6. Provjeravamo svijetli li LED-ica jače kada je LDR prekriven.

Ako LED svijetli jače kada je LDR osvijetljen, najprije provjeravamo je li LDR stvarno spojen prema GND, a potenciometar prema +5 V. Ako je sklop pravilno povezan, a želimo obrnuto ponašanje, možemo promijeniti redoslijed brojeva u map() funkciji:

int jacinaLedice = map(svjetlo, 0, 1023, 255, 0);

Tada manja vrijednost s A0 daje veću PWM vrijednost na D9.

Ako sklop ne radi

Vrijednost u serijskom monitoru se ne mijenja

  • Mogući uzrok: LDR ili potenciometar nisu pravilno spojeni
  • Provjeriti: Vezu +5 VR1A0 ⇒ LDR ⇒ GND

Arduino stalno očitava 0

  • Mogući uzrok: A0 je kratko spojen na GND ili LDR dio nije napajan
  • Provjeriti: Spoj A0, LDR i GND

Arduino stalno očitava 1023

  • Mogući uzrok: A0 je stalno na +5 V ili LDR nema vezu prema GND-u
  • Provjeriti: Vezu potenciometra, LDR-a i A0

Vrijednost se mijenja, ali LED ne svijetli

  • Mogući uzrok: Pogrešan polaritet LED-ice, pogrešan tranzistor ili pinout
  • Provjeriti: LED, C-B-E priključke T1, vezu D9R2 ⇒ baza

LED stalno svijetli

  • Mogući uzrok: Baza tranzistora stalno dobiva napon ili tranzistor nije pravilno spojen
  • Provjeriti: R2, bazu T1, emiter na GND

LED samo se pali/gasi, bez vidljive promjene jačine

  • Mogući uzrok: Program ne koristi analogWrite() ili D9 nije stvarno spojen
  • Provjeriti: Kod, pin D9, bazni otpornik

Arduino se resetira nakon spajanja

  • Mogući uzrok: Kratki spoj između +5 V i GND ili pogrešno postavljen tranzistor
  • Provjeriti: Odspoji USB, provjeri sve vodove, zatim ponovno spoji

Mali kviz

1. Što je LDR?
LDR je fotootpornik, odnosno otpornik čija se vrijednost mijenja ovisno o količini svjetla. Pri jačem svjetlu njegov je otpor obično manji, a u tami veći.
2. Čita li Arduino pin A0 svjetlo izravno?
Ne. Arduino na pinu A0 očitava napon. LDR i potenciometar u našem sklopu stvaraju djelitelj napona, pa se promjena količine svjetla pretvara u promjenu napona koji Arduino može izmjeriti.
3. Što je djelitelj napona?
Djelitelj napona je sklop s dva otpora spojena između izvora napajanja i mase. Napon na točki između njih ovisi o vrijednostima ta dva otpora.
4. Koje komponente čine djelitelj napona u našem Arduino sklopu?
Djelitelj napona čine promjenjivi otpor potenciometra RV1 između +5V i točke A0 te LDR između točke A0 i GND-a.
5. Kako u ovom sklopu koristimo potenciometar?
Potenciometar koristimo kao promjenjivi otpornik. Srednji izvod, klizač, spojen je s jednim krajnjim izvodom, pa promjenom položaja mijenjamo otpor između +5V i upravljačke točke sklopa.
6. Što se događa s otporom LDR-a kada ga osvijetlimo?
Otpor LDR-a se smanjuje. Kada je LDR u tami, njegov se otpor povećava.
7. Što se u našoj shemi događa s naponom na A0 kada LDR prekrijemo i postane tamnije?
Otpor LDR-a raste, pa se točka A0 preko potenciometra više povlači prema +5V. Napon na A0 raste i Arduino najčešće očitava veću vrijednost.
8. Koju funkciju koristimo za očitavanje LDR-a na pinu A0?
Koristimo funkciju analogRead(), primjerice: int svjetlo = analogRead(A0);
9. Koji raspon vrijednosti najčešće vraća analogRead() na klasičnim Arduino Uno i Nano pločicama?
Funkcija analogRead() najčešće vraća broj od 0 do 1023.
10. Koji Arduino pin koristimo za PWM upravljanje tranzistorom i LED-icom u ovom sklopu?
Koristimo digitalni pin D9. On preko otpornika R1 upravlja bazom NPN tranzistora.
11. Zašto između pina D9 i baze tranzistora postoji otpornik R1 od 10 kΩ?
Otpornik R1 ograničava struju koja ulazi u bazu tranzistora. Time štiti Arduino pin i tranzistor od prevelike struje.
12. Zašto LED-ica ima zaseban otpornik R2 od 220 Ω?
Otpornik R2 ograničava struju kroz LED-icu. Bez njega bi kroz LED-icu moglo proći previše struje i LED-ica ili Arduino sklop mogli bi se oštetiti.
13. Što je uloga NPN tranzistora T2 u Arduino sklopu?
NPN tranzistor djeluje kao elektronički prekidač. Mali upravljački signal s pina D9 preko baze određuje može li struja prolaziti kroz LED-icu prema GND-u.
14. Što znači da Arduino i ostatak sklopa moraju imati zajednički GND?
To znači da Arduino GND, minus napajanja, LDR i emiter tranzistora moraju biti električno povezani. Bez zajedničkog GND-a Arduino D9 signal nema zajedničku referencu i sklop ne može pouzdano raditi.
15. Što je PWM?
PWM je način upravljanja kod kojeg Arduino pin vrlo brzo prelazi između stanja HIGH i LOW. Promjenom vremena tijekom kojeg je pin uključen LED-ica izgleda slabije ili jače osvijetljena.
16. Koju funkciju koristimo za PWM upravljanje pinom D9?
Koristimo funkciju analogWrite(), primjerice: analogWrite(9, jacinaLedice);
17. Što radi funkcija map() u našem programu?
Funkcija map() pretvara vrijednost iz jednog raspona u drugi. U ovom projektu pretvara očitanje LDR-a od 0 do 1023 u PWM vrijednost za LED-icu od 0 do 255.
18. Kako možemo promijeniti ponašanje tako da LED svijetli jače na svjetlu umjesto u tami?
Možemo promijeniti redoslijed završnih vrijednosti u funkciji map(). Primjerice, map(svjetlo, 0, 1023, 0, 255) daje veću PWM vrijednost kada Arduino očita veću vrijednost svjetla.
19. Što prvo provjeravamo ako se vrijednost na serijskom monitoru ne mijenja kada osvijetlimo ili prekrijemo LDR?
Prvo provjeravamo vezu +5V ⇒ RV1 ⇒ A0 ⇒ LDR ⇒ GND, zatim provjeravamo je li A0 spojen na srednju točku djelitelja napona te jesu li +5V i GND pravilno povezani.
20. Koji je pravilan redoslijed rada u automatiziranom sustavu poput ovoga?
Senzor prepoznaje promjenu iz okoline, elektronički sklop stvara signal, Arduino očitava signal, program donosi odluku, a izlaz upravlja uređajem. Ukratko: senzor ⇒ mjerenje ⇒ program ⇒ reakcija.

ligtbulb Što smo naučili?

  • Povezali smo analognu elektroniku i Arduino programiranje kroz jedan praktičan uređaj: automatsko upravljanje LED-icom prema količini svjetla.
  • Najprije smo vidjeli da se isti problem može riješiti bez Arduina. U analognom sklopu LDR, promjenjivi otpornik i NPN tranzistor zajedno određuju hoće li LED-ica svijetliti. LDR reagira na svjetlo, potenciometar podešava osjetljivost, a tranzistor upravlja strujom kroz LED-icu.
  • Zatim smo sličan princip izveli uz Arduino. Arduino ne vidi svjetlo izravno: on očitava napon na analognom ulazu A0. LDR i promjenjivi otpornik stvaraju djelitelj napona, pa se promjenom svjetla mijenja i napon koji Arduino mjeri. Fotootpornik ima manji otpor pri jačem svjetlu, a veći pri slabijem svjetlu; djelitelj napona tu promjenu pretvara u signal koji Arduino može očitati.
  • Elektronička shema prikazuje električne veze i uloge komponenti, a ne stvarni raspored na breadboardu.
  • LDR, odnosno fotootpornik, mijenja svoj otpor ovisno o količini svjetla.
  • Više svjetla najčešće znači manji otpor LDR-a, a manje svjetla veći otpor.
  • Potenciometar ima tri izvoda, ali ga možemo koristiti kao promjenjivi otpornik kada srednji izvod spojimo s jednim krajnjim izvodom.
  • U našem sklopu potenciometar i LDR čine djelitelj napona između +5 V i GND.
  • Djelitelj napona pretvara promjenu otpora u promjenu napona na točki spojenoj na A0.
  • Arduino funkcijom analogRead() očitava vrijednost analognog ulaza.
  • Pin D9 šalje PWM signal koji preko baznog otpornika R2 upravlja NPN tranzistorom.
  • NPN tranzistor omogućuje da mali upravljački signal s Arduino pina kontrolira zaseban strujni put kroz LED-icu.
  • Otpornik R2 od 10 kΩ ograničava struju baze tranzistora.
  • Otpornik R3 od 220 Ω ograničava struju kroz LED-icu.
  • LED-ica i Arduino dio sklopa moraju imati zajednički GND.
  • PWM nije pravi promjenjivi napon: Arduino vrlo brzo mijenja stanja HIGH i LOW, a LED-ica zbog toga izgleda slabije ili jače osvijetljena.
  • Funkcija map() pretvara raspon očitanja senzora u raspon PWM vrijednosti za LED-icu.
  • Promjenom programa možemo odlučiti hoće li LED svijetliti jače na svjetlu ili u tami, bez promjene fizičkog sklopa.
Najvažnija ideja
Senzor pretvara promjenu iz stvarnog svijeta u električni signal. Arduino taj signal očita, program donese odluku, a izlaz upravlja uređajem. To je osnovni obrazac mnogih automatiziranih sustava:

senzor ⇒ mjerenje ⇒ program ⇒ reakcija.

◀ Ponavljanje osnova elektronike i mjerenja