Operácie

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

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2026 - '''Meno Priezvisko''' == Zadanie == Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie 400px|thumb|center|Vývojová doska ACROB. '''Literatúra:''' * [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob] * [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]…“
 
StudentMIPS (diskusia | príspevky)
Bez shrnutí editace
 
(11 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
Záverečný projekt predmetu MIPS / LS2026 - '''Meno Priezvisko'''
Záverečný projekt predmetu MIPS / LS2026 - '''Mihály Bertalan Vasas'''




== Zadanie ==
== 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.


Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]


'''Literatúra:'''  
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
* [https://senzor.robotika.sk/sensorwiki/index.php/LCD_displej_s_radi%C4%8Dom_HD44780 LCD displey]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
* [https://www.mouser.com/datasheet/2/321/28015-PING-Sensor-Product-Guide-v2.0-461050.pdf?srsltid=AfmBOorjmmpvsMJArAhpunXabg3px6QL_5F5w32HUzVaXASNbgGtPHAN Ping))) datasheet]




Riadok 17: Riadok 15:
== Analýza  a opis riešenia ==
== Analýza  a opis riešenia ==


Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
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.
Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.  
[[Súbor:Ult_zvuk.jpg|400px|thumb|center|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 ===
[[Súbor:schemaMIPS.jpg|1200px|thumb|center|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.


[[Súbor:GeminiAI-image3.jpg|400px|thumb|center|Celkový pohľad na zariadenie.]]
=== Matematický model ===
Rýchlosť zvuku vo vzduchu je:


Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.
<code>
v = 343 [m/s] = 0,0343 [cm/µs]
</code>


[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]
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>


=== Algoritmus a program ===
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:
 
<code>
d = (ticks · 0,5) / 58 = ticks / 116)
</code>


Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto...
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.
Výpis kódu je nižšie...


=== Zdrojový kód ===


<tabs>
<tabs>
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>


int main(void)
#include "lcd_ch.h"
{
#include "uart.h"
  unsigned int measuredValue;


  while (1)
#define PING_PIN PB0 // Arduino D8
  {
    /*  relax  */
  }


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


</syntaxhighlight ></tab>
uint16_t measure_distance(void) {
<tab name="filename.h"><syntaxhighlight lang="c++" style="background: LightYellow;">
    uint16_t ticks = 0;
#include <avr/io.h>
 
    // 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
void adc_init(void);                                  // A/D converter initialization


unsigned int adc_read(char a_pin);
unsigned int adc_read(char a_pin);
</syntaxhighlight ></tab>
</syntaxhighlight ></tab>
</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 ===


Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
== Overenie a výsledky ==
Na konci uvádzame fotku hotového zariadenia.


[[Súbor:GeminiAI-image1.jpg|400px|thumb|center|Aplikácia.]]
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:'''
'''Video:'''
<center><youtube>D0UnqGm_miA</youtube></center>
<center><youtube>AGY9EjskvGY</youtube></center>




== Č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.