Operácie

Ultrazvukový radar so senzorom Ping))): Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
 
(6 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 19: Riadok 19:


=== Ultrazvukový senzor PING))) ===
=== Ultrazvukový senzor PING))) ===
Senzor Parallax PING))) umožňuje merať vzdialenosť objektov v rozsahu od 2 cm do 3 metrov na frekvencii 40 kHz. Jeho kľúčovou vlastnosťou je využitie jedného obojsmerného signálového pinu (SIG) na vysielanie aj príjem dát, čo šetrí IO piny mikrokontroléra.
Senzor PING))) umožňuje merať vzdialenosť objektov v rozsahu od 2 cm do 3 metrov na frekvencii 40 kHz. Jeho kľúčovou vlastnosťou je využitie jedného obojsmerného signálového pinu (SIG) na vysielanie aj príjem dát, čo šetrí IO piny mikrokontroléra.
* '''Trigger fáza:''' Pin sa nastaví ako výstupný a vygeneruje sa 5 µs impulz.
* '''Trigger fáza:''' Pin sa nastaví ako výstupný a vygeneruje sa 5 µs impulz.
* '''Echo fáza:''' Pin sa prepne na vstupný a meria sa dĺžka trvania vysokého logického stavu (HIGH), ktorý generuje senzor po prijatí odrazenej vlny.
* '''Echo fáza:''' Pin sa prepne na vstupný a meria sa dĺžka trvania vysokého logického stavu (HIGH), ktorý generuje senzor po prijatí odrazenej vlny.
Riadok 27: Riadok 27:


=== Schéma zapojenia ===
=== Schéma zapojenia ===
[[Súbor:schemaMIPS.jpg|400px|thumb|center|Schéma zapojenia.]]
[[Súbor:schemaMIPS.jpg|1200px|thumb|center|Schéma zapojenia.]]


=== Algoritmus a program ===
=== Algoritmus a program ===
Riadok 34: Riadok 34:


=== Matematický model ===
=== Matematický model ===
Rýchlosť zvuku vo vzduchu je '''v = 343 [m/s] = 0,0343 [cm/µs]'''. Keďže zvuk prejde dráhu k prekážke a späť, skutočná vzdialenosť '''d''' je:
Rýchlosť zvuku vo vzduchu je:
'''d = (v · t) / 2 = (0,0343 · t) / 2 = t / 58,3'''
 
<code>
v = 343 [m/s] = 0,0343 [cm/µs]
</code>
 
Keďže zvuk prejde dráhu k prekážke a späť, skutočná vzdialenosť '''d''' je:
 
<code>
d = (v · t) / 2 = (0,0343 · t) / 2 = t / 58,3
</code>
 
Kde '''t''' je čas v mikrosekundách. Keďže jeden tik časovača reprezentuje '''0,5µs (t = ticks · 0,5)''', výsledný vzorec po dosadení je:
Kde '''t''' je čas v mikrosekundách. Keďže jeden tik časovača reprezentuje '''0,5µs (t = ticks · 0,5)''', výsledný vzorec po dosadení je:
'''d = (ticks · 0,5) / 58 = ticks / 116)''',
 
<code>
d = (ticks · 0,5) / 58 = ticks / 116)
</code>


Nameraná hodnota sa následne sformátuje pomocou `snprintf` a odošle na LCD displej a cez sériovú linku UART (9600 baud) do PC.
Nameraná hodnota sa následne sformátuje pomocou `snprintf` a odošle na LCD displej a cez sériovú linku UART (9600 baud) do PC.
Riadok 128: Riadok 141:
</tabs>
</tabs>


Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
Kompletný projekt na stiahnutie: [[Médiá:MihalyBertalanVasas_MIPS.zip|MihalyBertalanVasas_MIPS.zip]]
 
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
=== Overenie ===
 
ompletný projekt na stiahnutie: [[Médiá:MihalyBertalanVasas_MIPS.zip|zdrojaky.zip]]


== Overenie a výsledky ==
== Overenie a výsledky ==
Riadok 144: Riadok 151:




== Čo by som urobil inak ==
== Záver a diskusia ==


Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak.  
Ťažkosti spočívali v nesprávnom výpočte vzdialenosti '''d''' a následne, keď sa mi podarilo prísť na to, kde je pravdepodobne chyba, AVR Studio nefungovalo tak, ako malo, pretože po viacerých pokusoch o kompiláciu program kód reálne nepreložil.





Aktuálna revízia z 20:32, 27. máj 2026

Záverečný projekt predmetu MIPS / LS2026 - Mihály Bertalan Vasas


Zadanie

Navrhnite a realizujte zariadenie na bezkontaktné meranie vzdialenosti s využitím ultrazvukového senzora PING))) a mikrokontroléra ATmega328P. Nameraná vzdialenosť v centimetroch musí byť v reálnom čase zobrazovaná na alfanumerickom LCD displeji a súčasne odosielaná prostredníctvom sériovej linky (UART) do počítača pre účely monitorovania.


Literatúra:


Analýza a opis riešenia

Základom riadiaceho systému je vývojová doska s mikrokontrolérom ATmega328P. K nej sú pripojené dva hlavné periférne moduly: ultrazvukový senzor a alfanumerický displej.

Ultrazvukový senzor.

Ultrazvukový senzor PING)))

Senzor PING))) umožňuje merať vzdialenosť objektov v rozsahu od 2 cm do 3 metrov na frekvencii 40 kHz. Jeho kľúčovou vlastnosťou je využitie jedného obojsmerného signálového pinu (SIG) na vysielanie aj príjem dát, čo šetrí IO piny mikrokontroléra.

  • Trigger fáza: Pin sa nastaví ako výstupný a vygeneruje sa 5 µs impulz.
  • Echo fáza: Pin sa prepne na vstupný a meria sa dĺžka trvania vysokého logického stavu (HIGH), ktorý generuje senzor po prijatí odrazenej vlny.

LCD Displej 1602-A

Alfanumerický displej s radičom Hitachi HD44780 umožňuje zobraziť 2 riadky po 16 znakov. V projekte je zapojený v úspornom 4-bitovom režime. Kontrast je riadený analógovým napätím privedeným na pin V0.

Schéma zapojenia

Schéma zapojenia.

Algoritmus a program

Program pracuje v nekonečnej slučke s periódou vzorkovania 200 ms. Na presné odmeranie dĺžky impulzu Echo sa využíva interný 16-bitový hardvérový časovač Timer1. Na základe frekvencie hodín 16 MHz a nastavenia preddeličky (prescalera) na hodnotu 8 platí, že časovač sa inkrementuje každých 0,5 µs.

Matematický model

Rýchlosť zvuku vo vzduchu je:

v = 343 [m/s] = 0,0343 [cm/µs]

Keďže zvuk prejde dráhu k prekážke a späť, skutočná vzdialenosť d je:

d = (v · t) / 2 = (0,0343 · t) / 2 = t / 58,3

Kde t je čas v mikrosekundách. Keďže jeden tik časovača reprezentuje 0,5µs (t = ticks · 0,5), výsledný vzorec po dosadení je:

d = (ticks · 0,5) / 58 = ticks / 116)

Nameraná hodnota sa následne sformátuje pomocou `snprintf` a odošle na LCD displej a cez sériovú linku UART (9600 baud) do PC.

Zdrojový kód

#define F_CPU 16000000UL 
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>

#include "lcd_ch.h"
#include "uart.h" 

#define PING_PIN PB0 // Arduino D8

void timer1_init() {
    // Nastavenie Timer1: Normal mode, vypnutý na začiatku
    TCCR1A = 0;
    TCCR1B = 0;
}

uint16_t measure_distance(void) {
    uint16_t ticks = 0;

    // Trigger impulzus (min. 5 us pre PING))) senzor)
    DDRB |= (1 << PING_PIN);    // Nastaviť ako výstup
    PORTB |= (1 << PING_PIN);   // Nastaviť HIGH
    _delay_us(5);
    PORTB &= ~(1 << PING_PIN);  // Nastaviť LOW

    // Prepnutie na vstup pre príjem Echo signálu
    DDRB &= ~(1 << PING_PIN);

    // Čakanie na začiatok Echo impulzu (logická 1)
    while (!(PINB & (1 << PING_PIN)));

    // Štart časovača Timer1 s preddeličkou 8 (Prescaler 8)
    // Pri frekvencii 16MHz: 1 tick = 8 / 16 000 000 = 0,5 us
    TCNT1 = 0;             // Vynulovať počítadlo
    TCCR1B |= (1 << CS11); // Spustiť časovač

    // Meranie dĺžky impulzu (kým je signál HIGH)
    while (PINB & (1 << PING_PIN)) {
        if (TCNT1 > 60000) break; // Timeout ochrana
    }

    // Zastavenie časovača a uloženie hodnoty
    ticks = TCNT1;
    TCCR1B = 0; 

    // Výpočet vzdialenosti 
    // t = ticks * 0,5 us (čas v mikrosekundách)
    // d = t / 58  (vzdialenosť v cm pre cestu tam a späť)
    // d = (ticks * 0,5) / 58  =>  d = ticks / 116
    return (ticks / 116); 
}

int main(void) {
    char buffer[16];
    
    uart_init();
    lcd_init();
    timer1_init();

    while (1) {
        uint16_t distance = measure_distance();

        // Formátovanie textu pre LCD (vzdialenosť v cm)
        snprintf(buffer, sizeof(buffer), "Vzdial: %u cm   ", distance);
        lcd_command(0x80); // Skok na začiatok 1. riadku
        zob_text(buffer);

        // Odoslanie údajov do PC (Serial Monitor)
        uart_puts(buffer);
        uart_puts("\r\n");

        _delay_ms(200); // Pauza medzi meraniami
    }
}

void adc_init(void);                                   // A/D converter initialization

unsigned int adc_read(char a_pin);

Kompletný projekt na stiahnutie: MihalyBertalanVasas_MIPS.zip

Overenie a výsledky

Systém bol otestovaný umiestnením kalibrovanej prekážky do známych vzdialeností (10, 15 a 20 cm) pred senzor. Výsledky merania zobrazené na alfanumerickom LCD displeji plne korešpondovali s reálnym stavom a vykazovali vysokú stabilitu. Súbežne prebiehal prenos dát cez UART rozhranie do aplikácie Serial Monitor v PC, kde bol potvrdený plynulý tok hodnôt bez straty paketov či zamŕzania mikrokontroléra.

Video:


Záver a diskusia

Ťažkosti spočívali v nesprávnom výpočte vzdialenosti d a následne, keď sa mi podarilo prísť na to, kde je pravdepodobne chyba, AVR Studio nefungovalo tak, ako malo, pretože po viacerých pokusoch o kompiláciu program kód reálne nepreložil.


Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.