Operácie

Parkovací senzor so stavebnicou Sonic

Zo stránky SensorWiki

Verzia z 09:51, 28. január 2026, ktorú vytvoril Balogh (diskusia | príspevky) (Vytvorená stránka „= Parkovací senzor s Arduino Nano - Konverzácia = == Úvod do projektu == '''Študent:''' Ahoj, dnes tu mám jednoduchý projekt s mikropočítačom Arduino Nano. Chceli by sme so študentmi strednej školy vytvoriť parkovací senzor. Na doske už máme zapojený ultrazvukový senzor HC-SR04 so signálom Trig1 na D6 a Echo1 na D7. Okrem toho je na doske bzučiak (pasívny, treba do neho poslať frekvenciu) na D16 (A2) a tri LED diody: zelena LED3 na D21 (A7),…“)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)

Parkovací senzor s Arduino Nano - Konverzácia

Úvod do projektu

Študent: Ahoj, dnes tu mám jednoduchý projekt s mikropočítačom Arduino Nano. Chceli by sme so študentmi strednej školy vytvoriť parkovací senzor. Na doske už máme zapojený ultrazvukový senzor HC-SR04 so signálom Trig1 na D6 a Echo1 na D7. Okrem toho je na doske bzučiak (pasívny, treba do neho poslať frekvenciu) na D16 (A2) a tri LED diody: zelena LED3 na D21 (A7), žltá LED2 na D20 (A6) a červená LED1 na D19 (A5). Začať by sme mohli jednoduchou šablónou pre Arduino jazyk, v ktorom by boli zadefinované všetky pripojené obvody a v inicializačnej časti by boli správne nakonfigurované. Zatiaľ netreba žiaden aktívny kód.

Claude: Pripravil som základnú šablónu s definíciami všetkých komponentov a ich korektnou inicializáciou:

/*
 * Parkovací senzor pre Arduino Nano
 * Komponenty:
 * - Ultrazvukový senzor HC-SR04 (Trig1: D6, Echo1: D7)
 * - Pasívny bzučiak (D16/A2)
 * - Zelená LED (D21/A7)
 * - Žltá LED (D20/A6)
 * - Červená LED (D19/A5)
 */

// Definície pinov pre ultrazvukový senzor HC-SR04
#define TRIG_PIN 6    // D6 - Trigger pin
#define ECHO_PIN 7    // D7 - Echo pin

// Definície pinov pre bzučiak
#define BUZZER_PIN 16 // D16 (A2) - Pasívny bzučiak

// Definície pinov pre LED diody
#define LED_RED 19    // D19 (A5) - Červená LED
#define LED_YELLOW 20 // D20 (A6) - Žltá LED
#define LED_GREEN 21  // D21 (A7) - Zelená LED

void setup() {
  // Inicializácia sériového portu pre ladenie
  Serial.begin(9600);
  
  // Konfigurácia pinov ultrazvukového senzora
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  
  // Konfigurácia pinu bzučiaka
  pinMode(BUZZER_PIN, OUTPUT);
  
  // Konfigurácia pinov LED diód
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  
  // Úvodné vypnutie všetkých výstupov
  digitalWrite(TRIG_PIN, LOW);
  digitalWrite(BUZZER_PIN, LOW);
  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_YELLOW, LOW);
  digitalWrite(LED_GREEN, LOW);
  
  Serial.println("Parkovaci senzor inicializovany");
}

void loop() {
  // Sem pride aktivny kod
  
}

Šablóna obsahuje:

  • Prehľadné definície všetkých pinov s komentármi
  • Inicializáciu sériového portu (užitočné pre testovanie)
  • Správnu konfiguráciu vstupov/výstupov
  • Počiatočné vypnutie všetkých komponentov

Test LED diód

Študent: Super! Teraz budeme so študentmi postupne oživovať jednotlivé časti, aby sme si overili, či na dosku pripojili súčiastky správne. Čim by sme mohli začať? Asi diódami?

Claude: Výborne! Áno, LED diódy sú ideálny začiatok - sú najjednoduchšie a študenti hneď vidia výsledok.

Navrhujem postupné testovanie v tomto poradí:

1. Test LED diód (odporúčam začať týmto)

Najprv overíme, či sú LED zapojené správne a fungujú. Môžeme ich rozblikať postupne.

2. Test bzučiaka

Potom otestujeme bzučiak rôznymi frekvenciami.

3. Test ultrazvukového senzora

Nakoniec overíme meranie vzdialenosti.

Študent: Začnime len jednou diódou a potom pridáme ďalšie dve.

Claude: Výborne! Začneme s jednou LED diódou. Navrhujem začať so zelenou, je to najmenej "alarmujúca" farba.

void loop() {
  // Test zelenej LED
  digitalWrite(LED_GREEN, HIGH);  // Zapni zelenú LED
  delay(500);                     // Čakaj 500 ms
  digitalWrite(LED_GREEN, LOW);   // Vypni zelenú LED
  delay(500);                     // Čakaj 500 ms
}

Tento kód spôsobí, že zelená LED bude blikať s frekvenciou 1 Hz (zapnutá 0,5 s, vypnutá 0,5 s).

Študent: Funguje, poďme na ďalšie dve.

Claude: Skvelé! Teraz pridáme žltú a červenú LED:

void loop() {
  // Test všetkých troch LED - postupné rozsvietenie
  digitalWrite(LED_GREEN, HIGH);   // Zapni zelenú LED
  delay(500);                      // Čakaj 500 ms
  
  digitalWrite(LED_YELLOW, HIGH);  // Zapni žltú LED
  delay(500);                      // Čakaj 500 ms
  
  digitalWrite(LED_RED, HIGH);     // Zapni červenú LED
  delay(500);                      // Čakaj 500 ms
  
  // Vypni všetky LED naraz
  digitalWrite(LED_GREEN, LOW);
  digitalWrite(LED_YELLOW, LOW);
  digitalWrite(LED_RED, LOW);
  delay(500);                      // Čakaj pred ďalším cyklom
}

Tento vzor študentom ukáže:

  • Postupné rozsvecovanie LED (zelená → žltá → červená)
  • Simuluje to aj logiku parkovacieho senzora (čím bližšie, tým viac LED svieti)
  • Kontrolujú sa všetky tri LED naraz

Test bzučiaka

Študent: Áno. Teraz skúsme bzučiak.

Claude: Výborne! Teraz otestujeme pasívny bzučiak. Pre pasívny bzučiak musíme generovať frekvenciu pomocou funkcie tone().

void loop() {
  // Test bzučiaka - tri rôzne tóny
  
  tone(BUZZER_PIN, 1000);  // Nízky tón 1000 Hz
  delay(500);
  
  tone(BUZZER_PIN, 2000);  // Stredný tón 2000 Hz
  delay(500);
  
  tone(BUZZER_PIN, 3000);  // Vysoký tón 3000 Hz
  delay(500);
  
  noTone(BUZZER_PIN);      // Vypni bzučiak
  delay(1000);             // Pauza pred ďalším cyklom
}

Tento test:

  • Prehráva tri rôzne frekvencie (1000 Hz, 2000 Hz, 3000 Hz)
  • Každý tón trvá 0,5 sekundy
  • Potom nasleduje 1-sekundová pauza

Test ultrazvukového senzora

Študent: Super. A teraz teda ten ultrazvukový senzor. Ale asi nie hneď ako parkovací senzor, skúsme len vyskúšať jeho funkciu, pokojne aj s výstupom na terminál.

Claude: Výborne! Vytvoríme funkciu na meranie vzdialenosti a budeme výsledky vypisovať do sériového monitora.

void loop() {
  // Test ultrazvukového senzora
  float vzdialenost = merajVzdialenost();
  
  // Výpis do sériového monitora
  Serial.print("Vzdialenost: ");
  Serial.print(vzdialenost);
  Serial.println(" cm");
  
  delay(500);  // Meranie každých 500 ms
}

// Funkcia na meranie vzdialenosti pomocou HC-SR04
float merajVzdialenost() {
  // Vyčisti trigger pin
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  
  // Pošli 10us impulz na trigger
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  
  // Zmeraj dĺžku echo impulzu
  long trvanie = pulseIn(ECHO_PIN, HIGH);
  
  // Vypočítaj vzdialenosť v cm
  // Vzorec: vzdialenost = (trvanie * rychlost zvuku) / 2
  // Rychlosť zvuku je 343 m/s = 0.0343 cm/μs
  float vzdialenost = (trvanie * 0.0343) / 2;
  
  return vzdialenost;
}

Čo kód robí:

  • Funkcia merajVzdialenost() aktivuje ultrazvukový senzor
  • Meri čas, za ktorý sa zvuková vlna vráti späť
  • Prepočíta čas na vzdialenosť v centimetroch
  • Výsledok sa vypíše do sériového monitora každých 0,5 sekundy

Pre študentov: Otvorte sériový monitor (Tools → Serial Monitor alebo Ctrl+Shift+M) a nastavte baud rate na 9600.


Kompletný parkovací senzor

Študent: Perfektné! No a teraz teda skúsme kompletný kód pre parkovací senzor, rozhodovacie úrovne pre LED diódy by mohli byť zadefinované v deklaračnej časti kódu aby sa dali potom ľahko pomeniť. Tu už nepredpokladáme trvalé pripojenie k USB, takže bez výpisov. Alebo ak chceme aj výpisy, tak ich zapnime/vypnime cez #define DEBUG 1

Claude: Výborne! Vytvorím kompletný kód parkovacieho senzora s konfigurovateľnými prahovými hodnotami a voliteľným debug režimom:

/*
 * Parkovací senzor pre Arduino Nano
 * Komponenty:
 * - Ultrazvukový senzor HC-SR04 (Trig1: D6, Echo1: D7)
 * - Pasívny bzučiak (D16/A2)
 * - Zelená LED (D21/A7)
 * - Žltá LED (D20/A6)
 * - Červená LED (D19/A5)
 */

// Debug režim - nastaviť na 1 pre výpisy do sériového monitora
#define DEBUG 0

// Definície pinov pre ultrazvukový senzor HC-SR04
#define TRIG_PIN 6    // D6 - Trigger pin
#define ECHO_PIN 7    // D7 - Echo pin

// Definície pinov pre bzučiak
#define BUZZER_PIN 16 // D16 (A2) - Pasívny bzučiak

// Definície pinov pre LED diody
#define LED_RED 19    // D19 (A5) - Červená LED
#define LED_YELLOW 20 // D20 (A6) - Žltá LED
#define LED_GREEN 21  // D21 (A7) - Zelená LED

// Prahové vzdialenosti v centimetroch
#define VZDIALENOST_ZELENA 100   // Zelená LED - bezpečná vzdialenosť
#define VZDIALENOST_ZLTA 50      // Žltá LED - blížime sa
#define VZDIALENOST_CERVENA 20   // Červená LED - nebezpečne blízko

// Frekvencia bzučiaka v Hz
#define FREKVENCIA_BZUCIAK 2000

void setup() {
  #if DEBUG
    // Inicializácia sériového portu pre ladenie
    Serial.begin(9600);
  #endif
  
  // Konfigurácia pinov ultrazvukového senzora
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  
  // Konfigurácia pinu bzučiaka
  pinMode(BUZZER_PIN, OUTPUT);
  
  // Konfigurácia pinov LED diód
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  
  // Úvodné vypnutie všetkých výstupov
  digitalWrite(TRIG_PIN, LOW);
  digitalWrite(BUZZER_PIN, LOW);
  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_YELLOW, LOW);
  digitalWrite(LED_GREEN, LOW);
  
  #if DEBUG
    Serial.println("Parkovaci senzor inicializovany");
    Serial.println("Prahove hodnoty:");
    Serial.print("Zelena: > ");
    Serial.print(VZDIALENOST_ZELENA);
    Serial.println(" cm");
    Serial.print("Zlta: ");
    Serial.print(VZDIALENOST_ZLTA);
    Serial.print(" - ");
    Serial.print(VZDIALENOST_ZELENA);
    Serial.println(" cm");
    Serial.print("Cervena: < ");
    Serial.print(VZDIALENOST_CERVENA);
    Serial.println(" cm");
  #endif
}

void loop() {
  // Zmeraj vzdialenosť
  float vzdialenost = merajVzdialenost();
  
  #if DEBUG
    Serial.print("Vzdialenost: ");
    Serial.print(vzdialenost);
    Serial.println(" cm");
  #endif
  
  // Vypni všetky LED a bzučiak
  digitalWrite(LED_RED, LOW);
  digitalWrite(LED_YELLOW, LOW);
  digitalWrite(LED_GREEN, LOW);
  noTone(BUZZER_PIN);
  
  // Rozhodovacia logika podľa vzdialenosti
  if (vzdialenost > VZDIALENOST_ZELENA) {
    // Bezpečná vzdialenosť - zelená LED
    digitalWrite(LED_GREEN, HIGH);
    
  } else if (vzdialenost > VZDIALENOST_ZLTA) {
    // Stredná vzdialenosť - žltá LED
    digitalWrite(LED_YELLOW, HIGH);
    
  } else if (vzdialenost > VZDIALENOST_CERVENA) {
    // Blízko - červená LED + prerušované pípanie
    digitalWrite(LED_RED, HIGH);
    tone(BUZZER_PIN, FREKVENCIA_BZUCIAK);
    delay(200);
    noTone(BUZZER_PIN);
    delay(200);
    
  } else {
    // Nebezpečne blízko - červená LED + neprerušované pípanie
    digitalWrite(LED_RED, HIGH);
    tone(BUZZER_PIN, FREKVENCIA_BZUCIAK);
  }
  
  delay(100);  // Krátka pauza medzi meraniami
}

// Funkcia na meranie vzdialenosti pomocou HC-SR04
float merajVzdialenost() {
  // Vyčisti trigger pin
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  
  // Pošli 10us impulz na trigger
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  
  // Zmeraj dĺžku echo impulzu
  long trvanie = pulseIn(ECHO_PIN, HIGH);
  
  // Vypočítaj vzdialenosť v cm
  // Vzorec: vzdialenost = (trvanie * rychlost zvuku) / 2
  // Rychlosť zvuku je 343 m/s = 0.0343 cm/μs
  float vzdialenost = (trvanie * 0.0343) / 2;
  
  return vzdialenost;
}

Ako kód funguje:

  1. Zelená LED (> 100 cm): Bezpečná vzdialenosť, všetko v poriadku
  2. Žltá LED (50-100 cm): Blížime sa, treba byť opatrný
  3. Červená LED + prerušované pípanie (20-50 cm): Blízko prekážky
  4. Červená LED + neprerušované pípanie (< 20 cm): Nebezpečne blízko!

Nastavenie debug režimu:

  • #define DEBUG 0 - bez výpisov (pre samostatnú prevádzku)
  • #define DEBUG 1 - s výpismi do sériového monitora (pre testovanie)

Prispôsobenie:

Študenti môžu ľahko zmeniť prahové hodnoty v hornej časti kódu podľa potreby alebo experimentovať s rôznymi frekvenciami bzučiaka.


Záver

Projekt bol úspešne vytvorený postupným testovaním jednotlivých komponentov a nakoniec integrovaný do funkčného parkovacieho senzora s konfigurovateľnými parametrami a voliteľným debug režimom.