Prvé kolo: Rozdiel medzi revíziami
Bez shrnutí editace |
|||
| Riadok 365: | Riadok 365: | ||
* Funkcia <code>delayMicroseconds()</code> umožňuje pracovať s časovými intervalmi v mikrosekundách. | * Funkcia <code>delayMicroseconds()</code> umožňuje pracovať s časovými intervalmi v mikrosekundách. | ||
* Kombináciou viacerých komponentov (bzučiak + LED) vieme simulovať reálne zariadenia. | * Kombináciou viacerých komponentov (bzučiak + LED) vieme simulovať reálne zariadenia. | ||
==== | ==== 5. Mikrofón ==== | ||
Vieme ako zvuk generovať – teraz ho ideme aj zachytiť. Pomôže nám modul '''KY-038'''. | Vieme ako zvuk generovať – teraz ho ideme aj zachytiť. Pomôže nám modul '''KY-038'''. | ||
| Riadok 382: | Riadok 382: | ||
|} | |} | ||
Citlivosť mikrofónu | Citlivosť mikrofónu sa dá nastaviť '''otočnou skrutkou''' na modrej krabičke priamo na module. | ||
===== Zapojenie ===== | ===== Zapojenie ===== | ||
| Riadok 403: | Riadok 403: | ||
[[Image:ky038.png|350px]] | [[Image:ky038.png|350px]] | ||
===== | ===== Časť 1 – Čítanie hodnôt z mikrofónu ===== | ||
<span style="background:#CCFFCC">'''Vyskúšaj toto:'''</span> Skopíruj a spusti nasledujúci program. Otvor sériový monitor (9600 baud) a skús hovoriť, tlieskať alebo pískať pred mikrofón. Sleduj ako sa menia hodnoty. | <span style="background:#CCFFCC">'''Vyskúšaj toto:'''</span> Skopíruj a spusti nasledujúci program. Otvor sériový monitor (9600 baud) a skús hovoriť, tlieskať alebo pískať pred mikrofón. Sleduj ako sa menia hodnoty. | ||
| Riadok 428: | Riadok 428: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{| class="wikitable" | {| class="wikitable" | ||
| Riadok 439: | Riadok 437: | ||
| <code>analogRead(pin)</code> || Prečíta analógovú hodnotu pinu – vráti číslo od <code>0</code> do <code>4095</code> | | <code>analogRead(pin)</code> || Prečíta analógovú hodnotu pinu – vráti číslo od <code>0</code> do <code>4095</code> | ||
|- | |- | ||
| <code>delay(50)</code> || Čakáme 50 ms medzi meraniami – aby sériový monitor | | <code>delay(50)</code> || Čakáme 50 ms medzi meraniami – aby sériový monitor nescrolloval príliš rýchlo | ||
|} | |} | ||
{{Note|Ak digitálny výstup nereaguje na zvuk, skús nastaviť citlivosť otočnou skrutkou na module. Otáčaj pomaly a sleduj zmeny v sériovom monitore.}} | {{Note|Ak digitálny výstup nereaguje na zvuk, skús nastaviť citlivosť otočnou skrutkou na module. Otáčaj pomaly a sleduj zmeny v sériovom monitore.}} | ||
<span style="background:#FFFFA0">'''VAŠA ÚLOHA:'''</span> Zapojte mikrofón spolu s bzučiakom a RGB LED zo | <span style="background:#FFFFA0">'''VAŠA ÚLOHA 1:'''</span> Zapojte mikrofón spolu s bzučiakom a RGB LED zo sekcií 3 a 4. Napíšte program, ktorý bude fungovať ako '''zvukový spínač''': | ||
* Keď mikrofón zachytí hlasný zvuk (napríklad tliesknutie), program '''zapne''' sirénu a blikanie LED | * Keď mikrofón zachytí hlasný zvuk (napríklad tliesknutie), program '''zapne''' sirénu a blikanie LED | ||
* Keď zachytí druhé tliesknutie, program ich '''vypne''' | * Keď zachytí druhé tliesknutie, program ich '''vypne''' | ||
* Stav (zapnuté/vypnuté) si musí program '''pamätať''' medzi tliesknutiami | * Stav (zapnuté/vypnuté) si musí program '''pamätať''' medzi tliesknutiami | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
| Riadok 493: | Riadok 489: | ||
Hotový program '''nahrajte do mikrokontroléra''', natočte video a odošlite na <code>insert mail</code>. | Hotový program '''nahrajte do mikrokontroléra''', natočte video a odošlite na <code>insert mail</code>. | ||
===== Časť 2 – Mikrofón a bzučiak spolu ===== | |||
==== | |||
Teraz si vyskúšame niečo zaujímavejšie – bzučiak a mikrofón zapojíme '''spolu''' a mikrofón bude počúvať čo bzučiak hrá. | Teraz si vyskúšame niečo zaujímavejšie – bzučiak a mikrofón zapojíme '''spolu''' a mikrofón bude počúvať čo bzučiak hrá. | ||
'''Montáž:''' Upevnite bzučiak aj mikrofón do červených modulov stavebnice a priskrutkujte ich podľa obrázka. Snažte sa ich umiestniť '''oproti sebe''' – mikrofón by mal smerovať priamo k bzučiaku. | |||
Upevnite bzučiak aj mikrofón do červených modulov stavebnice a priskrutkujte ich podľa obrázka. Snažte sa ich umiestniť '''oproti sebe''' – mikrofón by mal smerovať priamo k bzučiaku. | |||
[[Image:buzzer_mic_assembly.png|400px]] | [[Image:buzzer_mic_assembly.png|400px]] | ||
Pre túto úlohu odpojte RGB LED a použite iba bzučiak a mikrofón. Zapojenie zostáva rovnaké ako vyššie, pin A0 mikrofónu na GP26. | |||
Pre túto úlohu | |||
<span style="background:#CCFFCC">'''Vyskúšaj toto:'''</span> Nasledujúci program hrá na bzučiaku niekoľko tónov za sebou a zároveň číta analógovú hodnotu z mikrofónu. Výsledky sleduj v sériovom monitore. | <span style="background:#CCFFCC">'''Vyskúšaj toto:'''</span> Nasledujúci program hrá na bzučiaku niekoľko tónov za sebou a zároveň číta analógovú hodnotu z mikrofónu. Výsledky sleduj v sériovom monitore. | ||
| Riadok 535: | Riadok 505: | ||
const int MIC_ANALOG = 26; | const int MIC_ANALOG = 26; | ||
int frekvencie[] = {500, 800, 1000, 1500, 2000}; | int frekvencie[] = {500, 800, 1000, 1500, 2000}; | ||
int pocetFrekvencii = 5; | int pocetFrekvencii = 5; | ||
| Riadok 544: | Riadok 513: | ||
} | } | ||
void playAndListen(int frekvencia, int trvanie) { | void playAndListen(int frekvencia, int trvanie) { | ||
int halfPeriod = 500000 / frekvencia; | int halfPeriod = 500000 / frekvencia; | ||
| Riadok 551: | Riadok 518: | ||
while (millis() - startTime < trvanie) { | while (millis() - startTime < trvanie) { | ||
digitalWrite(BUZZER, HIGH); | digitalWrite(BUZZER, HIGH); | ||
delayMicroseconds(halfPeriod); | delayMicroseconds(halfPeriod); | ||
| Riadok 557: | Riadok 523: | ||
delayMicroseconds(halfPeriod); | delayMicroseconds(halfPeriod); | ||
static long lastRead = 0; | static long lastRead = 0; | ||
if (millis() - lastRead > 5) { | if (millis() - lastRead > 5) { | ||
| Riadok 569: | Riadok 534: | ||
} | } | ||
digitalWrite(BUZZER, LOW); | digitalWrite(BUZZER, LOW); | ||
Serial.println("--- ticho ---"); | Serial.println("--- ticho ---"); | ||
| Riadok 582: | Riadok 546: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Oproti predchádzajúcemu kódu pribúdajú nové koncepty: | |||
Oproti predchádzajúcemu kódu pribúdajú | |||
{| class="wikitable" | {| class="wikitable" | ||
| Riadok 594: | Riadok 556: | ||
| <code>static long lastRead</code> || Premenná s kľúčovým slovom <code>static</code> si zachováva svoju hodnotu medzi volaniami funkcie – neresetuje sa na 0 pri každom zavolaní. | | <code>static long lastRead</code> || Premenná s kľúčovým slovom <code>static</code> si zachováva svoju hodnotu medzi volaniami funkcie – neresetuje sa na 0 pri každom zavolaní. | ||
|- | |- | ||
| <code>while (millis() - startTime < trvanie)</code> || Cyklus beží dovtedy, kým neuplynie požadovaný čas | | <code>while (millis() - startTime < trvanie)</code> || Cyklus beží dovtedy, kým neuplynie požadovaný čas – počas neho stihneme robiť aj kmity bzučiaka aj čítanie mikrofónu. | ||
|- | |- | ||
| <code>int frekvencie[]</code> || '''Pole''' – zoznam hodnôt rovnakého typu uložených za sebou. Pristupujeme k nim cez index: <code>frekvencie[0]</code> = 500, <code>frekvencie[1]</code> = 800, atď. | | <code>int frekvencie[]</code> || '''Pole''' – zoznam hodnôt rovnakého typu uložených za sebou. Pristupujeme k nim cez index: <code>frekvencie[0]</code> = 500, <code>frekvencie[1]</code> = 800, atď. | ||
|} | |} | ||
<span style="background:#FFFFA0">'''VAŠA ÚLOHA:'''</span> Upravte program a otestujte mikrofón pri rôznych nastaveniach citlivosti: | <span style="background:#FFFFA0">'''VAŠA ÚLOHA 2:'''</span> Upravte program a otestujte mikrofón pri rôznych nastaveniach citlivosti: | ||
# Spustite program a sledujte hodnoty v sériovom monitore | # Spustite program a sledujte hodnoty v sériovom monitore | ||
# Otočnou skrutkou | # Otočnou skrutkou '''nastavte citlivosť''' tak, aby mikrofón spoľahlivo zachytával všetky tóny | ||
# Do poľa <code>frekvencie[]</code> '''pridajte vlastné frekvencie''' – skúste | # Do poľa <code>frekvencie[]</code> '''pridajte vlastné frekvencie''' – skúste veľmi nízke (200 Hz) aj veľmi vysoké (3000 Hz). Zachytáva mikrofón všetky rovnako dobre? | ||
# Skúste bzučiak a mikrofón '''od seba vzdialiť''' – pri akej vzdialenosti prestane mikrofón zachytávať signál? | # Skúste bzučiak a mikrofón '''od seba vzdialiť''' – pri akej vzdialenosti prestane mikrofón zachytávať signál? | ||
| Riadok 611: | Riadok 573: | ||
Čo sme sa naučili? | Čo sme sa naučili? | ||
* Mikrofón KY-038 má digitálny aj analógový výstup – digitálny slúži na detekciu zvuku, analógový na meranie jeho intenzity. | |||
* Funkcia <code>millis()</code> umožňuje merať čas bez blokovania programu – na rozdiel od <code>delay()</code>. | * Funkcia <code>millis()</code> umožňuje merať čas bez blokovania programu – na rozdiel od <code>delay()</code>. | ||
* Pole (<code>int frekvencie[]</code>) je užitočný spôsob ako uložiť viacero hodnôt a prechádzať cez ne cyklom. | * Pole (<code>int frekvencie[]</code>) je užitočný spôsob ako uložiť viacero hodnôt a prechádzať cez ne cyklom. | ||
Verzia z 11:13, 28. apríl 2026
Vitajte v prvom kole 3D ligy!
V tomto kole sa zoznámite so súčiastkami, programovacím prostredím a samotnou konštrukciou stavebnice. Zvládnutie základov je kľúčové – bez nich by sme nedokázali stavať zložitejšie a zaujímavejšie roboty. Komplexnejším projektom sa budeme venovať v 2. kole.
Pravidlá kola
- Počas kola budete dostávať jednoduché zadania, ktoré budete musieť zdokumentovať (odfotiť alebo natočiť) a odovzdať na mail
insert mail. - Každý tím má k dispozícii určitý počet bodov, ktoré môže využiť na nápovedy.
- Nápovedy môžu mať formu priameho kódu alebo vás nasmerujú správnym smerom.
- Hodnotiť sa bude:
insert conditions - Za každú použitú nápovedu sa príslušný počet bodov odpočíta. Na konci kola sa prihliada aj na celkový zostatok bodov.
Postup bude nasledovný:
- Nastavenie Arduino IDE
- Zoznámenie sa s komponentmi:
- RP2350-zero
- Vytlačenou stavebnicou
- Servo motorčekmi
- Senzormi
- Medzitým si zložíme:
- Jednoduché ovládajúce sa auto
- Stopára
- Sednoduché robotické rameno
Arduino IDE
Na programovanie stavebnice 3D Ligy budeme používať vývojové prostredie Arduino IDE 2.
Stiahnuť ho môžete na oficiálnej stránke Arduina. Vyberte verziu zodpovedajúcu vášmu operačnému systému (Windows, macOS alebo Linux).
Mikrokontrolér
Ako riadiaci čip stavebnice používame Waveshare RP2350-Zero. Aby s ním Arduino IDE vedelo komunikovať, je potrebné doinštalovať príslušnú knižnicu (board package).
Inštalácia knižnice
- Otvorte Arduino IDE a prejdite do File → Preferences.
- Do poľa "Additional boards manager URLs" pridajte nasledujúci odkaz:
https://github.com/earlephilhower/arduino-pico/releases/download/4.5.2/package_rp2040_index.json
- Potvrďte tlačidlom OK.
- Otvorte Tools → Board → Boards Manager a vyhľadajte "Raspberry Pi Pico/RP2040" (obsahuje aj RP2350).
- Nainštalujte knižnicu od autora Earle F. Philhower, III.
Výber dosky a portu
Po inštalácii knižnice je nutné zvoliť správnu dosku a port – bez toho počítač nerozpozná pripojený mikrokontrolér.
- V menu Tools → Board vyhľadajte a vyberte "Raspberry Pi Pico".
- Pripojte mikrokontrolér k počítaču pomocou USB kábla.
- V menu Tools → Port vyberte port, na ktorom sa zariadenie objavilo (napr.
COM3na Windows alebo/dev/ttyACM0na Linuxe).
Mikrokontrolér očakáva program vo formáte .uf2. Existujú dva spôsoby, ako ho získať:
- Priamo z Arduino IDE: Použite Sketch → Export Compiled Binary (alebo skratku
Ctrl+Alt+S). Arduino IDE skompiluje kód a uloží súbor.uf2do priečinka projektu. - Drag & drop: Skompilovaný súbor
.uf2jednoducho presuňte myšou na jednotku RP2350. Po nahratí sa mikrokontrolér automaticky reštartuje a program sa spustí.
Pre vizualizáciu tu je Youtune video (fyzický postup je rovnaký pre RP2040 a RP2350)
Prvé pripojenie – režim BOOTSEL
Pri úplne prvom nahrávaní, alebo keď mikrokontrolér neodpovedá, je potrebné ho prepnúť do režimu BOOTSEL:
- Stlačte a podržte tlačidlo BOOT na doske RP2350-Zero.
- Počas držania tlačidla zapojte USB kábel do počítača.
- Tlačidlo uvoľnite.
Na počítači sa objaví nová jednotka (ako USB flash disk) s názvom RP2350 alebo RPI-RP2. Do tejto jednotky môžete priamo pretiahnuť (drag & drop) súbor s programom.
Ďalsie nahrávanie
Ďalšie nahrávania programov budú prirodzenejšie.
- Zapojí sa doska do počítača.
- Vyberie sa doska (Raspberry Pi Pico) a port.
- Ak sa port našiel, potvrďte talčidlom OK
- Váš kód nahrajete cez tlačidlo -> v ľavom hornom rohu. (skratka: Ctrl+U)
Úlohy
1. Hello World!
Vyskúšaj toto: Test sériovej komunikácie. Skopíruj a spusti nasledujúci program. Sleduj sériový monitor. Uisti sa, že máš v okne sériového monitora zvolených 9600 baudov.
void setup() {
Serial.begin(9600);
}
int i = 0;
void loop() {
Serial.print("Ahoj ");
Serial.println(i++);
delay(1000);
}
VAŠA ÚLOHA: Uprav program tak, aby po dosiahnutí čísla 100 začal počítať v opačnom poradí – až do 0, a potom znova do 100, atď. Použi operátor dekrementovania (i--) a podmienku if:
if (podmienka)
{
príkazy, ktoré sa vykonajú keď je podmienka splnená
}
Všimni si, ako je v kóde vyššie definovaná premenná i typu int. Možno budeš chcieť definovať ďalšiu premennú.
Čo sme sa naučili?
- Využívať sériový výstup na výpis informácií do sériového monitora, čo je veľmi užitočné pri ladení (debugovaní) programov.
2. Vytlačená stavebnica
Súčasťou vašej sady je aj 3D tlačená stavebnica – podobne ako Merkur, skladá sa z rôznych dielikov, ktoré sa dajú spájať skrutkami M3 do ľubovoľných tvarov a konštrukcií.
Prehľad dielikov
| Farba | Typ dielikov | Popis |
|---|---|---|
| Biela | Základné stavebné prvky | Nosné diely s dierami pre skrutky M3 – tyče (1×N), ohnuté spoje (90° vertikálne aj horizontálne) a ploché dosky (M×N) |
| Červená | Moduly pre senzory a joystick | Držiaky elektronických komponentov – napájajú sa priamo na biele časti |
| Modrá | Moduly pre servo motorčeky | Niektoré majú diery pre M3 matice, ktoré spolu so skrutkou spájajú modul s bielou časťou |
| Čierna | Elektronické krabičky | Krabička pre napájanie (batérie) a modul pre mikrokontrolér RP2350-Zero |
Inšpirácia
Pozri si tieto dva modely a nechaj sa inšpirovať – čo všetko sa dá z dielikov poskladať:
A tu je príklad toho, čo dokázali poskladať iní účastníci – srdce len zo základných dielikov:
Zadanie
VAŠA ÚLOHA: Poskladajte si z dielikov čokoľvek, čo vás napadne. Nemusí to byť funkčný robot – pokojne to môže byť zviera, písmeno, stavba alebo čokoľvek iné. Použite svoju fantáziu!
Hotovú konštrukciu odfotografujte a foto odošlite na insert mail.
Čo sme sa naučili?
- Spoznali sme jednotlivé typy dielikov stavebnice a ich farebné označenie.
- Vyskúšali sme si, ako sa dieliky spájajú pomocou skrutiek M3.
- Zistili sme, že zo stavebnice sa dá poskladať prakticky čokoľvek – od robotov až po dekorácie.
Prva stavebnica
3. RGB LED modul
RGB LED je súčiastka, ktorá dokáže svietiť v ľubovoľnej farbe – kombinuje totiž tri farebné diódy v jednom puzdre: červenú (R), zelenú (G) a modrú (B). Miešaním intenzity týchto troch farieb vieme dosiahnuť akýkoľvek odtieň.
Používame modul LED RGB modul od Techfun.sk, ktorý má výhodou oproti holej LED dióde – rezistory sú už napájkované priamo na module, takže nie je potrebné zapojiť žiadne externé rezistory.
Modul má 4 piny:
| Pin | Popis | Zapojenie v RP2350-zero |
|---|---|---|
| - | GND | GND |
| R | Červená farba | GP0 |
| G | Zelená farba | GP1 |
| B | Modrá farba | GP2 |
(Keďže modul má rezistory zabudované, zapájame ho priamo – pin "-" na GND, a piny R/G/B na GPIO piny mikrokontroléra)
Kód
Vyskúšaj toto: Nasledujúci program rozsvieti RGB LED na bielo a zhasne.
// Definujeme čísla pinov
const int PIN_R = 0;
const int PIN_G = 1;
const int PIN_B = 2;
void setup() {
pinMode(PIN_R, OUTPUT);
pinMode(PIN_G, OUTPUT);
pinMode(PIN_B, OUTPUT);
}
void loop() {
digitalWrite(PIN_R, HIGH);
digitalWrite(PIN_G, HIGH);
digitalWrite(PIN_B, HIGH);
delay(1000);
digitalWrite(PIN_R, LOW);
digitalWrite(PIN_G, LOW);
digitalWrite(PIN_B, LOW);
delay(1000);
}
Princíp
Princíp je rovnaký ako pri jednofarebnej LED – HIGH = farba svieti, LOW = farba nesvieti. Kombináciou troch pinov vieme získať rôzne farby:
VAŠA ÚLOHA: Doplňte program tak, aby LED postupne prechádzala všetkými farbami z palety vyššie, vždy s pauzou 1 sekundu medzi každou farbou.
Hotový program nahrajte do mikrokontroléra, zaznamenajte blikajúcu LED a odošlite na insert mail.
Čo sme sa naučili?
- RGB LED modul kombinuje tri farebné diódy – miešaním HIGH/LOW vieme dosiahnuť ľubovoľnú farbu.
- Modul s napájkovanými rezistormi zjednodušuje zapojenie – žiadne externé súčiastky nie sú potrebné.
- Každý GPIO pin ovládame samostatne pomocou
digitalWrite().
4. Bzučiak (Buzzer)
Bzučiak, ktorý ste dostali, je jednoduchý reproduktor. Reproduktory vydávajú zvuk tak, že rýchlo rozkmitajú tenkú fóliu vo vnútri. Toto kmitanie stláča a rozťahuje vzduch okolo – a práve tieto tlakové vlny vnímame ako zvuk.
Fóliu rozkmitáme malým elektromagnetom. Aby sa elektromagnet zapol, potrebuje elektrický prúd, ktorý mu dodá mikrokontrolér RP2350.
Jeden kmit dosiahneme logickým zapnutím a následným vypnutím pinu. Zvuk je v skutočnosti niekoľko stoviek až tisíc takýchto kmitov za sekundu – čiže zapínanie a vypínanie musí prebiehať každých niekoľko mikrosekúnd. Čím rýchlejšie kmitáme, tým vyšší tón vzniká.
Zapojenie
| Kábel | Pin na RP2350-Zero |
|---|---|
| Čierny | GND |
| Červený | GP4 |
Kód
Nasledujúci program prechádza rozsahom tónov od 500 Hz do 2500 Hz. Funkcia playNote() je zatiaľ prázdna – to je tvoja úloha ju doplniť!
const int BUZZER = 4;
void setup() {
pinMode(BUZZER, OUTPUT);
Serial.begin(9600);
}
// Funkcia zahrá jeden tón o frekvencii 'note' Hz
// Trvanie tónu je pevne stanovené na 10 kmitov
void playNote(int note)
{
// Vypočítame polovicu periódy v mikrosekundách
// Perióda = 1 000 000 / frekvencia (us)
// Polovica periódy = 500 000 / frekvencia (us)
int halfPeriod = 500000 / note;
for (int i = 0; i < 10; i++) {
digitalWrite(BUZZER, HIGH); // zapni bzučiak
delayMicroseconds(halfPeriod); // počkaj pol periódy
digitalWrite(BUZZER, LOW); // vypni bzučiak
delayMicroseconds(halfPeriod); // počkaj pol periódy
}
}
void loop() {
for (int i = 500; i < 2500; i++) {
playNote(i);
Serial.print("Hrám notu: ");
Serial.println(i);
}
}
Vysvetlenie kódu
Kľúčom je funkcia playNote(). Zvuk vzniká pravidelným striedaním HIGH a LOW na pine bzučiaka:
| Pojem | Vysvetlenie |
|---|---|
| Frekvencia | Počet kmitov za sekundu, udáva sa v Hz. Vyššia frekvencia = vyšší tón. |
| Perióda | Čas jedného celého kmitu (zapnutie + vypnutie). Perióda = 1 000 000 / frekvencia µs. |
| Polovica periódy | Čas, ktorý pin strávi v stave HIGH (alebo LOW). Vypočítame ju ako 500 000 / frekvencia. |
delayMicroseconds() |
Rovnaké ako delay(), ale čaká v mikrosekundách namiesto milisekúnd.
|
Napríklad pre tón 1000 Hz:
- Perióda = 1 000 000 / 1000 = 1000 µs
- Polovica periódy = 500 µs
- Pin bude HIGH 500 µs, potom LOW 500 µs – a to 10-krát za sebou
Vyskúšaj toto: Skopíruj kód, doplň funkciu playNote() podľa vysvetlenia vyššie a nahraj ho do mikrokontroléra. Sleduj sériový monitor – vidíš ako sa mení frekvencia? Počuješ ako zvuk stúpa nahor?
Vaša úloha – Sanitka
VAŠA ÚLOHA: Zapojte k bzučiaku aj RGB LED (podľa zapojenia zo sekcie 3) a napíšte program, ktorý bude simulovať sanitku:
- Bzučiak bude striedavo hrať dva tóny (napr. 800 Hz a 1200 Hz) podobne ako siréna
- RGB LED bude blikať striedavo modrou a červenou farbou v rytme sirény
Vzorová štruktúra programu (doplňte chýbajúce časti):
const int BUZZER = 4;
const int PIN_R = 0;
const int PIN_G = 1;
const int PIN_B = 2;
void setup() {
pinMode(BUZZER, OUTPUT);
pinMode(PIN_R, OUTPUT);
pinMode(PIN_G, OUTPUT);
pinMode(PIN_B, OUTPUT);
}
void playNote(int note) {
// --- sem doplňte kód z predchádzajúcej úlohy ---
}
void setColor(int r, int g, int b) {
// --- doplňte: nastavte farbu LED pomocou digitalWrite ---
}
void loop() {
// --- doplňte: siréna tón 1 + modrá farba ---
// --- doplňte: siréna tón 2 + červená farba ---
}
Hotový program nahrajte do mikrokontroléra, natočte video so zvukom a odošlite na insert mail.
Čo sme sa naučili?
- Bzučiak generuje zvuk rýchlym striedaním HIGH/LOW – čím rýchlejšie, tým vyšší tón.
- Funkcia
delayMicroseconds()umožňuje pracovať s časovými intervalmi v mikrosekundách. - Kombináciou viacerých komponentov (bzučiak + LED) vieme simulovať reálne zariadenia.
5. Mikrofón
Vieme ako zvuk generovať – teraz ho ideme aj zachytiť. Pomôže nám modul KY-038.
Mikrofón funguje presne opačne ako reproduktor. Kým reproduktor premieňa elektrický signál na kmitanie fólie (zvuk), mikrofón zachytí kmitanie vzduchu a premení ho späť na elektrický signál.
Modul KY-038 má dva výstupy:
| Výstup | Popis |
|---|---|
| Digitálny (D0) | Vysiela iba 0 alebo 1 – buď zvuk zachytil, alebo nie |
| Analógový (A0) | Vysiela hodnotu podľa hlasitosti a frekvencie zvuku – čím hlasnejší zvuk, tým vyššia hodnota |
Citlivosť mikrofónu sa dá nastaviť otočnou skrutkou na modrej krabičke priamo na module.
Zapojenie
| Pin modulu | Pin na RP2350-Zero |
|---|---|
| VCC | 3.3V |
| GND | GND |
| D0 (digitálny výstup) | GP5 |
| A0 (analógový výstup) | GP26 (ADC0) |
Časť 1 – Čítanie hodnôt z mikrofónu
Vyskúšaj toto: Skopíruj a spusti nasledujúci program. Otvor sériový monitor (9600 baud) a skús hovoriť, tlieskať alebo pískať pred mikrofón. Sleduj ako sa menia hodnoty.
const int MIC_DIGITAL = 5; // digitálny výstup D0
const int MIC_ANALOG = 26; // analógový výstup A0 (ADC)
void setup() {
pinMode(MIC_DIGITAL, INPUT);
Serial.begin(9600);
}
void loop() {
int digitalVal = digitalRead(MIC_DIGITAL); // 0 alebo 1
int analogVal = analogRead(MIC_ANALOG); // 0 až 4095
Serial.print("Digitálny: ");
Serial.print(digitalVal);
Serial.print(" | Analógový: ");
Serial.println(analogVal);
delay(50);
}
| Funkcia | Vysvetlenie |
|---|---|
digitalRead(pin) |
Prečíta stav pinu – vráti buď 0 (ticho) alebo 1 (zvuk zachytený)
|
analogRead(pin) |
Prečíta analógovú hodnotu pinu – vráti číslo od 0 do 4095
|
delay(50) |
Čakáme 50 ms medzi meraniami – aby sériový monitor nescrolloval príliš rýchlo |
VAŠA ÚLOHA 1: Zapojte mikrofón spolu s bzučiakom a RGB LED zo sekcií 3 a 4. Napíšte program, ktorý bude fungovať ako zvukový spínač:
- Keď mikrofón zachytí hlasný zvuk (napríklad tliesknutie), program zapne sirénu a blikanie LED
- Keď zachytí druhé tliesknutie, program ich vypne
- Stav (zapnuté/vypnuté) si musí program pamätať medzi tliesknutiami
const int MIC_DIGITAL = 5;
const int BUZZER = 4;
const int PIN_R = 0;
const int PIN_G = 1;
const int PIN_B = 2;
bool aktivny = false; // pamätáme si stav – zapnuté alebo vypnuté
void setup() {
pinMode(MIC_DIGITAL, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(PIN_R, OUTPUT);
pinMode(PIN_G, OUTPUT);
pinMode(PIN_B, OUTPUT);
Serial.begin(9600);
}
void playNote(int note) {
// --- sem skopírujte funkciu z predchádzajúcej úlohy ---
}
void setColor(int r, int g, int b) {
// --- sem skopírujte funkciu z predchádzajúcej úlohy ---
}
void loop() {
// --- doplňte: ak mikrofón zachytí zvuk, prepnite stav 'aktivny' ---
if (aktivny) {
// --- doplňte: spustite sirénu a blikanie LED ---
} else {
// --- doplňte: vypnite bzučiak aj LED ---
}
}
Hotový program nahrajte do mikrokontroléra, natočte video a odošlite na insert mail.
Časť 2 – Mikrofón a bzučiak spolu
Teraz si vyskúšame niečo zaujímavejšie – bzučiak a mikrofón zapojíme spolu a mikrofón bude počúvať čo bzučiak hrá.
Montáž: Upevnite bzučiak aj mikrofón do červených modulov stavebnice a priskrutkujte ich podľa obrázka. Snažte sa ich umiestniť oproti sebe – mikrofón by mal smerovať priamo k bzučiaku.
Pre túto úlohu odpojte RGB LED a použite iba bzučiak a mikrofón. Zapojenie zostáva rovnaké ako vyššie, pin A0 mikrofónu na GP26.
Vyskúšaj toto: Nasledujúci program hrá na bzučiaku niekoľko tónov za sebou a zároveň číta analógovú hodnotu z mikrofónu. Výsledky sleduj v sériovom monitore.
const int BUZZER = 4;
const int MIC_ANALOG = 26;
int frekvencie[] = {500, 800, 1000, 1500, 2000};
int pocetFrekvencii = 5;
void setup() {
pinMode(BUZZER, OUTPUT);
Serial.begin(9600);
}
void playAndListen(int frekvencia, int trvanie) {
int halfPeriod = 500000 / frekvencia;
long startTime = millis();
while (millis() - startTime < trvanie) {
digitalWrite(BUZZER, HIGH);
delayMicroseconds(halfPeriod);
digitalWrite(BUZZER, LOW);
delayMicroseconds(halfPeriod);
static long lastRead = 0;
if (millis() - lastRead > 5) {
int val = analogRead(MIC_ANALOG);
Serial.print("Frekvencia: ");
Serial.print(frekvencia);
Serial.print(" Hz | Mikrofón: ");
Serial.println(val);
lastRead = millis();
}
}
digitalWrite(BUZZER, LOW);
Serial.println("--- ticho ---");
delay(500);
}
void loop() {
for (int i = 0; i < pocetFrekvencii; i++) {
playAndListen(frekvencie[i], 1000);
}
}
Oproti predchádzajúcemu kódu pribúdajú nové koncepty:
| Novinka | Vysvetlenie |
|---|---|
millis() |
Vráti počet milisekúnd od spustenia programu. Používame ho namiesto delay(), aby sme mohli zároveň hrať aj merať.
|
static long lastRead |
Premenná s kľúčovým slovom static si zachováva svoju hodnotu medzi volaniami funkcie – neresetuje sa na 0 pri každom zavolaní.
|
while (millis() - startTime < trvanie) |
Cyklus beží dovtedy, kým neuplynie požadovaný čas – počas neho stihneme robiť aj kmity bzučiaka aj čítanie mikrofónu. |
int frekvencie[] |
Pole – zoznam hodnôt rovnakého typu uložených za sebou. Pristupujeme k nim cez index: frekvencie[0] = 500, frekvencie[1] = 800, atď.
|
VAŠA ÚLOHA 2: Upravte program a otestujte mikrofón pri rôznych nastaveniach citlivosti:
- Spustite program a sledujte hodnoty v sériovom monitore
- Otočnou skrutkou nastavte citlivosť tak, aby mikrofón spoľahlivo zachytával všetky tóny
- Do poľa
frekvencie[]pridajte vlastné frekvencie – skúste veľmi nízke (200 Hz) aj veľmi vysoké (3000 Hz). Zachytáva mikrofón všetky rovnako dobre? - Skúste bzučiak a mikrofón od seba vzdialiť – pri akej vzdialenosti prestane mikrofón zachytávať signál?
Zaznamenajte vaše pozorovania a odošlite spolu s upraveným kódom na insert mail.
Čo sme sa naučili?
- Mikrofón KY-038 má digitálny aj analógový výstup – digitálny slúži na detekciu zvuku, analógový na meranie jeho intenzity.
- Funkcia
millis()umožňuje merať čas bez blokovania programu – na rozdiel oddelay(). - Pole (
int frekvencie[]) je užitočný spôsob ako uložiť viacero hodnôt a prechádzať cez ne cyklom. - Mikrofón nezachytáva všetky frekvencie rovnako – jeho citlivosť závisí od vzdialenosti, nastavenia aj samotnej frekvencie zvuku.
6. Ultrasonicky senzor
Dostali ste ultrazvukovy senzor HC-SR04. Dve ulohy dozadu sme robili ako generovat zvuk rychlim zapinanim a vypinanim reprodukra. V tejto ulohe budete musiet generovat ultrazvuk na detekovanie objektov. Na senzore mame reproduktor a mikrofon, jedna generuje ultrazvuk, je napojena