Arduino: zvučnik (piezo) i RGB LED dioda

Lekcija 3 od 28 · Arduino i ESP32

Do sada je Arduino samo palio i gasio LED diode. U ovoj lekciji dobija glas – piezo zvučnik koji svira tonove i melodije – i boje – RGB LED diodu koja mešanjem crvene, zelene i plave svetlosti može da pokaže skoro svaku boju. Na kraju sve spajamo u mali alarm.

Piezo zvučnik

Piezo zvučnik na eksperimentalnoj ploči
Piezo zvučnik na eksperimentalnoj ploči

U piezo zvučniku je tanka pločica koja se savija kada se na nju dovede napon. Ako je napon uključujemo i isključujemo stotinama puta u sekundi, pločica treperi i čujemo ton. Što je treperenje brže, ton je viši.

Aktivni zvučnikPasivni zvučnik
kako se pušta zvukdigitalWrite(pin, HIGH)tone(pin, frekvencija)
visina tonauvek istabiramo je
melodijane možemože
kako ga prepoznatipisne kad se priključi na 5 Vna 5 V samo „klikne“

Povezivanje: nožica označena sa + (obično duža) ide na pin 8, a druga na GND. Ako je zvuk preglasan, između pina i zvučnika možeš staviti otpornik od 100 Ω.

Program 1: tone() i noTone()

// Arduino – pasivni zvučnik (piezo) na pinu 8: kratak pisak svake sekunde
const int ZVUCNIK = 8;

void setup() {
  pinMode(ZVUCNIK, OUTPUT);
}

void loop() {
  tone(ZVUCNIK, 1000);          // ton od 1000 Hz
  delay(200);
  noTone(ZVUCNIK);              // tišina
  delay(800);
}
NaredbaŠta radi
tone(8, 1000)pušta ton od 1000 Hz na pinu 8 dok ga ne zaustavimo
tone(8, 1000, 200)pušta ton 200 ms, pa sam staje (program ne čeka!)
noTone(8)zaustavlja ton

Frekvencija se meri u hercima (Hz) – koliko puta u sekundi pločica zatreperi. Čovek čuje otprilike od 20 Hz do 20 000 Hz, a mali piezo zvučnik najglasnije svira između 2000 i 4000 Hz.

Program 2: sirena

// Arduino – sirena: visina tona raste i opada
const int ZVUCNIK = 8;

void setup() {
}

void loop() {
  for (int f = 400; f <= 1200; f += 10) {   // od 400 Hz do 1200 Hz
    tone(ZVUCNIK, f);
    delay(5);
  }
  for (int f = 1200; f >= 400; f -= 10) {   // i nazad
    tone(ZVUCNIK, f);
    delay(5);
  }
}

Petlja for povećava frekvenciju u koracima od 10 Hz, pa je smanjuje. Probaj da promeniš korak ili pauzu – sirena će zvučati drugačije.

Program 3: melodija

Melodija je niz tonova određene visine i trajanja. Visine pamtimo u jednom nizu, a trajanja u drugom. Ovo je početak „Ode radosti“ – kompozicije iz 1824. godine:

Notado (C4)re (D4)mi (E4)fa (F4)sol (G4)la (A4)
Frekvencija (Hz)262294330349392440
// Arduino – melodija: početak „Ode radosti“ (L. van Betoven, 1824)
const int ZVUCNIK = 8;

// frekvencije tonova (Hz) u četvrtoj oktavi
const int C4 = 262, D4 = 294, E4 = 330, F4 = 349, G4 = 392;

int note[]    = { E4, E4, F4, G4, G4, F4, E4, D4, C4, C4, D4, E4, E4, D4, D4 };
int trajanje[] = { 4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  3,  8,  2 };
// 4 = četvrtina, 8 = osmina, 2 = polovina, 3 = četvrtina sa tačkom (približno)

const int BROJ_NOTA = sizeof(note) / sizeof(note[0]);

void setup() {
  for (int i = 0; i < BROJ_NOTA; i++) {
    int ms = 1600 / trajanje[i];          // četvrtina traje 400 ms
    tone(ZVUCNIK, note[i], ms);
    delay(ms * 1.3);                      // kratka pauza između nota
  }
  noTone(ZVUCNIK);
}

void loop() {
}

Izraz sizeof(note) / sizeof(note[0]) računa koliko elemenata ima niz, pa ne moramo sami da ih brojimo. Melodija je u setup(), pa se svira samo jednom – za ponovno slušanje pritisni RESET.

RGB LED dioda

Arduino Uno i RGB LED dioda na eksperimentalnoj ploči, dioda svetli plavo
Arduino Uno i RGB LED dioda na eksperimentalnoj ploči, dioda svetli plavo

RGB LED dioda u jednom kućištu ima tri diode: crvenu (R), zelenu (G) i plavu (B). Ima četiri nožice – najduža je zajednička. Kod diode sa zajedničkom katodom najduža nožica ide na GND; kod diode sa zajedničkom anodom ide na 5V.

NožicaPovezuje se na
R (crvena)pin 9 preko otpornika 220 Ω
najduža (zajednička katoda)GND
G (zelena)pin 10 preko otpornika 220 Ω
B (plava)pin 6 preko otpornika 220 Ω
Zašto pin 6, a ne 11? Na Arduinu Uno funkcija tone() koristi isti unutrašnji tajmer kao PWM na pinovima 3 i 11. Dok zvučnik svira, jačina diode na tim pinovima ne bi radila. Pinovi 9, 10 i 6 nemaju taj problem.

Program 4: mešanje boja

Jačinu svake boje menjamo funkcijom analogWrite(pin, 0–255) (PWM). Mešanjem tri osnovne boje svetlosti dobijamo ostale:

// Arduino – RGB LED (zajednička katoda na GND): osnovne boje
const int R = 9;                // crvena nožica preko otpornika 220 oma
const int G = 10;               // zelena
const int B = 6;                // plava (sva tri pina imaju PWM ~)

// boja(r, g, b): svaki broj od 0 (ugašeno) do 255 (najjače)
void boja(int r, int g, int b) {
  analogWrite(R, r);
  analogWrite(G, g);
  analogWrite(B, b);
}

void setup() {
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
}

void loop() {
  boja(255, 0, 0);     delay(1000);   // crvena
  boja(0, 255, 0);     delay(1000);   // zelena
  boja(0, 0, 255);     delay(1000);   // plava
  boja(255, 255, 0);   delay(1000);   // žuta = crvena + zelena
  boja(0, 255, 255);   delay(1000);   // tirkizna = zelena + plava
  boja(255, 0, 255);   delay(1000);   // ljubičasta = crvena + plava
  boja(255, 255, 255); delay(1000);   // bela = sve tri
  boja(0, 0, 0);       delay(1000);   // ugašeno
}
RGBBoja
25500crvena
2552550žuta
0255255tirkizna
2550255ljubičasta
2551000narandžasta
255255255bela
Dioda sa zajedničkom anodom radi obrnuto: 0 znači najjače, a 255 ugašeno. Tada u funkciji boja() piši analogWrite(R, 255 - r); i isto za G i B.

Program 5: duga

// Arduino – RGB LED: boje se polako pretapaju (duga)
const int R = 9;
const int G = 10;
const int B = 6;

void boja(int r, int g, int b) {
  analogWrite(R, r);
  analogWrite(G, g);
  analogWrite(B, b);
}

void setup() {
}

void loop() {
  for (int i = 0; i <= 255; i++) { boja(255 - i, i, 0); delay(8); }   // crvena->zelena
  for (int i = 0; i <= 255; i++) { boja(0, 255 - i, i); delay(8); }   // zelena->plava
  for (int i = 0; i <= 255; i++) { boja(i, 0, 255 - i); delay(8); }   // plava->crvena
}

Dok jedna boja slabi, druga jača – zato se boje neprimetno pretapaju. Ceo krug traje oko 6 sekundi (3 × 256 koraka po 8 ms).

Sve zajedno: alarm

Spajamo sve iz ove i prethodne lekcije: taster na pinu 2 uključuje i isključuje alarm, RGB LED trepće crveno-plavo, a zvučnik naizmenično svira dva tona.

// Arduino – taster, RGB LED i zvučnik zajedno: „alarm“
// Pritisak tastera uključuje i isključuje alarm.
// Dok alarm radi, LED trepće crveno-plavo i čuje se sirena.
const int R = 9, G = 10, B = 6;
const int ZVUCNIK = 8;
const int TASTER = 2;

bool alarm = false;
int prethodno = HIGH;

void boja(int r, int g, int b) {
  analogWrite(R, r);
  analogWrite(G, g);
  analogWrite(B, b);
}

void setup() {
  pinMode(TASTER, INPUT_PULLUP);
  boja(0, 40, 0);                         // slabo zeleno: sve je u redu
}

void loop() {
  int sada = digitalRead(TASTER);
  if (prethodno == HIGH && sada == LOW) {
    alarm = !alarm;
    if (!alarm) {
      noTone(ZVUCNIK);
      boja(0, 40, 0);
    }
    delay(30);
  }
  prethodno = sada;

  if (alarm) {
    boja(255, 0, 0);
    tone(ZVUCNIK, 880);
    delay(250);
    boja(0, 0, 255);
    tone(ZVUCNIK, 660);
    delay(250);
  }
}

Zadaci za vežbu

Pokušaj prvo sam da rešiš zadatak, pa tek onda otvori rešenje.

  1. Napravi klavir sa tri tastera (pinovi 2, 3 i 4): dok je taster pritisnut, svira ton do, mi ili sol.
  2. Svaki pritisak tastera na pinu 2 neka menja boju RGB LED diode, redom kroz sedam boja.
  3. Napravi RGB termometar: potenciometar na A0 „glumi“ temperaturu od 0 do 40 °C. Ispod 18 °C dioda je plava, od 18 do 25 °C zelena, a iznad 25 °C crvena. Iznad 35 °C neka se čuje i kratak pisak.
Rešenje 1: klavir sa tri tastera
// Zadatak – „klavir“ sa tri tastera (pinovi 2, 3, 4): svaki taster svira svoj ton
const int ZVUCNIK = 8;
const int TASTERI[3] = { 2, 3, 4 };
const int TONOVI[3] = { 262, 330, 392 };   // do, mi, sol

void setup() {
  for (int i = 0; i < 3; i++) {
    pinMode(TASTERI[i], INPUT_PULLUP);
  }
}

void loop() {
  int svira = -1;
  for (int i = 0; i < 3; i++) {
    if (digitalRead(TASTERI[i]) == LOW) {
      svira = i;
    }
  }
  if (svira >= 0) {
    tone(ZVUCNIK, TONOVI[svira]);
  } else {
    noTone(ZVUCNIK);
  }
}
Rešenje 2: boja na taster
// Zadatak – svaki pritisak tastera menja boju RGB LED diode (7 boja u krug)
const int R = 9, G = 10, B = 6;
const int TASTER = 2;

const int BOJE[7][3] = {
  {255, 0, 0}, {0, 255, 0}, {0, 0, 255}, {255, 255, 0},
  {0, 255, 255}, {255, 0, 255}, {255, 255, 255}
};
int k = 0;
int prethodno = HIGH;

void prikazi() {
  analogWrite(R, BOJE[k][0]);
  analogWrite(G, BOJE[k][1]);
  analogWrite(B, BOJE[k][2]);
}

void setup() {
  pinMode(TASTER, INPUT_PULLUP);
  prikazi();
}

void loop() {
  int sada = digitalRead(TASTER);
  if (prethodno == HIGH && sada == LOW) {
    k = (k + 1) % 7;
    prikazi();
    delay(30);
  }
  prethodno = sada;
}
Rešenje 3: RGB termometar
// Zadatak – RGB „termometar“: potenciometar na A0 glumi temperaturu (0–40 °C)
// ispod 18 °C plavo, od 18 do 25 °C zeleno, iznad 25 °C crveno; iznad 35 °C i pisak
const int R = 9, G = 10, B = 6;
const int ZVUCNIK = 8;

void boja(int r, int g, int b) {
  analogWrite(R, r);
  analogWrite(G, g);
  analogWrite(B, b);
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  int t = map(analogRead(A0), 0, 1023, 0, 40);
  Serial.println(t);
  if (t < 18) {
    boja(0, 0, 255);
  } else if (t <= 25) {
    boja(0, 255, 0);
  } else {
    boja(255, 0, 0);
  }
  if (t > 35) {
    tone(ZVUCNIK, 1500, 100);
  }
  delay(300);
}

Proveri znanje

Otvori kviz

Kviz: zvučnik i RGB LED

1. Šta radi tone(8, 440)?




2. Koja vrsta zvučnika može da svira melodiju?




3. Koju boju daje boja(255, 255, 0) kod RGB diode sa zajedničkom katodom?




4. Zašto je plava nožica RGB diode na pinu 6, a ne na pinu 11?