Ultrazvukový radar so senzorom Ping))): Rozdiel medzi revíziami
Zo stránky SensorWiki
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]…“ |
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 - ''' | 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. | |||
'''Literatúra:''' | '''Literatúra:''' | ||
* [ | * [https://senzor.robotika.sk/sensorwiki/index.php/LCD_displej_s_radi%C4%8Dom_HD44780 LCD displey] | ||
* [ | * [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 == | ||
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. | |||
[[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. | |||
=== Matematický model === | |||
Rýchlosť zvuku vo vzduchu je: | |||
<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: | ||
<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. | |||
=== 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> | |||
#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 | 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> | ||
Kompletný projekt na stiahnutie: [[Médiá:MihalyBertalanVasas_MIPS.zip|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:''' | '''Video:''' | ||
<center><youtube> | <center><youtube>AGY9EjskvGY</youtube></center> | ||
== | == 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. | |||
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 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

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.