Operácie

Meranie vzdialenosti ultrazvukovým snímačom HC-SR04: Rozdiel medzi revíziami

Z SensorWiki

(Vytvorená stránka „Záverečný projekt predmetu MIPS / LS2024 - '''Meno Priezvisko''' == Zadanie == Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejši…“)
 
(5 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
Záverečný projekt predmetu MIPS / LS2024 - '''Meno Priezvisko'''
+
Záverečný projekt predmetu MIPS / LS2024 - '''Jozef Csabi'''
  
  
 
== Zadanie ==
 
== Zadanie ==
  
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
+
Pripojenie senzora vzdialenosti HC-SR04 k vývojovej doske Arduino NANO. Našim cieľom je pripojiť senzor a odmerať vzdialenosť od prekážky.
  
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
+
[[Obrázok:arduino_nano.jpg|400px|thumb|center|Vývojová doska ARDUINO-NANO.]]
  
 
'''Literatúra:'''  
 
'''Literatúra:'''  
* [http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description Dokumentácia k doske Acrob]
+
* [https://docs.arduino.cc/hardware/nano/ Dokumentácia k doske Arduino NANO]
* [http://www.humanbenchmark.com/tests/reactiontime/index.php Vyskúšajte si zmerať reakciu on-line]
+
* [https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentácia k ATMEGA328P]
 +
*[https://www.electroschematics.com/wp-content/uploads/2013/07/HCSR04-datasheet-version-1.pdf Dokumentácia k senzoru HC-SR04]
  
  
Riadok 17: Riadok 18:
 
== 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...
+
Najprv sme si pridali do nášho programu knižnice uart.h, uart.c, ktoré sme si vytvorili na cvičení, aby sme mohli vypisovať vzdialenosť cez Putty. Inicializovali sme UART, vytvorili volatile premennú, do ktorej sme zapisovali vzdialenosť, ktorú sme následne vydelili 37, aby nám vyšla v cm. Následne sme si inicializovali trigger_pulse, aby vyslal signál a mohli sme začať merať. Potom sme čakali, kým bude Echo pin na vysokej úrovni, zmerali sme dĺžku signálu a vypočítali vzdialenosť v cm. Nakoniec sme dĺžku len vypísali cez Putty-ho, počkali chvíľu a merali sme znova.
  
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
+
==Zapojenie==
  
Nezabudnite doplniť schému zapojenia!
+
Zapojenie sme realizovali pripojením Trigger pinu na D10, Echo pinu na D9 a následne pripojením Gnd na zem a Vcc na 5V. Potom sme zapojili aj ARDUINO na zem.
  
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
+
[[Súbor:HC-SR04Ultrasonic_Nano_schem.png|400px|thumb|center|Schéma zapojenia HC-SR04 senzora.]]
  
  
 
=== Algoritmus a program ===
 
=== Algoritmus a program ===
 
Algoritmus programu je....
 
  
  
 
<tabs>
 
<tabs>
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
+
<tab name="semestralny-projekt"><source lang="c++" style="background: LightYellow;">
 
#include <avr/io.h>
 
#include <avr/io.h>
 +
#include <util/delay.h>
 +
#include <stdio.h>
 +
#include "uart.h"
 +
volatile uint16_t distance = 0; //tu budeme ukladat vzdialenost, ako cele cislo o velkosti 16 bitov
 +
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
 +
 +
void UART_Transmit(unsigned char data) {
 +
    while (!(UCSR0A & (1<<UDRE0))); // Caka na prazdny buffer
 +
    UDR0 = data;
 +
}
 +
 +
void trigger_pulse() {
 +
    PORTB |= (1 << PB1);  // Nastavi Trig pin na vysoku uroven
 +
    _delay_us(10);              // Caka 10 mikrosekund
 +
    PORTB &= ~(1 << PB1); // Nastavi Trig pin na nizku uroven
 +
}
 +
 +
uint16_t measure_pulse_width() {
 +
    uint16_t pulse_width = 0;
 +
    uint16_t timeout = 50000; // Aby sme nesli donekonecna
 +
 +
    // Caka na Echo pin, kym bude na vysokej urovni
 +
    while (!(PINB & (1 << PB2)) && timeout--) {
 +
        _delay_us(1);
 +
    }
  
int main(void)
+
    // Mera dlzku signalu
{
+
    while ((PINB & (1 << PB2)) && timeout--) {
  unsigned int measuredValue;
+
        _delay_us(1);
 +
        pulse_width++;
 +
    }
  
  while (1)
+
    // Vypocitame vzdialenost v cm
  {
+
    uint16_t distance = pulse_width / 58;
     /*  relax  */ 
+
     return distance;
  }
+
}
  
  return(0);
+
int main(void) {
 +
    DDRB |= (1 << PB1); // Nastavi Trig pin ako vystup
 +
    DDRB &= ~(1 << PB2); // Nastavi Echo pin ako vstup
 +
PORTB |= (1 << PB2); // Ovladanie pull-up rezistoru
 +
 +
hw_init();
 +
    uart_init();
 +
    stdout= &mystdout;
 +
 +
    while (1) {
 +
        trigger_pulse(); // Posle signal na senzor
 +
uint16_t distance = measure_pulse_width(); // Merame vzdialenost a vypocitame ju v cm
 +
        printf("Vzdialenost: %d cm\n", distance); // Vypiseme vzdialenost cez napr. Putty
 +
        _delay_ms(500); // Pockame pred dalsim meranim
 +
    }
 +
    return 0;
 
}
 
}
  
 
</source></tab>
 
</source></tab>
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
<tab name="uart.h"><source lang="c++" style="background: LightYellow;">
 +
/* ************************************************************************* */
 +
/* FileName:            uart.h                                              */
 +
/* ************************************************************************* */
 +
 
 +
#define LED PB5  // internal on-board LED
 +
 
 +
/* na testovanie su uz zadefinovane */
 +
// bit_is_set(PINB, SW1)
 +
// bit_is_clear(PINB, SW1)
 +
 
 +
/* na cakanie su preddefinovane slucky */
 +
// loop_until_bit_is_set(PINB, SW1);    // cakanie na uvolnenie tlacitka
 +
// loop_until_bit_is_clear(PINB, SW1);  // cakanie na stlacenie tlacitka
 +
 
 +
 
 +
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
 +
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
 +
 
 +
#ifndef UART_H_
 +
#define UART_H_
 +
 
 +
#include <stdio.h>
 +
 
 +
#define BAUD_PRESCALE  (((F_CPU / (BAUDRATE * 16UL))) - 1)  // vzor?ek z datasheetu
 +
 
 +
void hw_init( void );
 +
void uart_init( void );
 +
   
 +
/* Following definition is compatible with STDIO.H, for more
 +
* information see https://www.appelsiini.net/2011/simple-usart-with-avr-libc/
 +
*/
 +
 +
int uart_putc( char c, FILE *stream );
 +
void uart_puts( const char *s );
 +
 
 +
char uart_getc( void );
 +
 
 +
void delay(int delay);
 +
 
 +
#endif /* UART_H_ */
 +
 
 +
</source></tab>
 +
<tab name="uart.c"><source lang="c++" style="background: LightYellow;">
 +
/* ************************************************************************* */
 +
/* FileName:            uart.c                                              */
 +
/* ************************************************************************* */
 +
 
 
#include <avr/io.h>
 
#include <avr/io.h>
 +
#include <util/delay.h>
 +
#include "uart.h"
 +
 +
void hw_init( void )
 +
{
 +
  DDRB |= (1<<LED);    // PORTB.5 kde je LED ma byt OUTPUT
 +
  /* sem si mozete dopisat svoje vlastne inicializacne prikazy */
 +
}
 +
 +
void uart_init( void )
 +
{
 +
//  for different BAUD rate change the project settings, or uncomment
 +
//  following two lines:
 +
// #undef  BAUD          // avoid compiler warning
 +
//  #define BAUD 115200
 +
 +
  #include <util/setbaud.h>  // requires defined BAUD
 +
 
 +
  UBRR0H = UBRRH_VALUE;
 +
  UBRR0L = UBRRL_VALUE;
 +
  #if USE_2X                // defined in setbaud.h
 +
    UCSR0A |= (1 << U2X0);
 +
  #else
 +
    UCSR0A &= ~(1 << U2X0);
 +
  #endif
 +
 +
 +
    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
 +
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);  /* Enable RX and TX */
 +
}
 +
 +
 +
int uart_putc( char c, FILE *stream )
 +
{
 +
  if (c == '\n')
 +
      uart_putc('\r',stream);
 +
 
 +
  loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
 +
  UDR0 = c;
 +
  return 0;
 +
}
 +
 +
 +
void uart_puts(const char *s)
 +
{
 +
  /* toto je vasa uloha */
 +
}
 +
 +
char uart_getc(void)
 +
{
 +
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
 +
    return UDR0;
 +
}
 +
 +
void delay(int delay)      // vlastna funkcia pre dlhsie casy
 +
{
 +
  for (int i=1; i<=delay; i++)
 +
  _delay_ms(1);
 +
}
  
void adc_init(void);                                  // A/D converter initialization
 
  
unsigned int adc_read(char a_pin);
 
 
</source></tab>
 
</source></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'':
+
Zdrojový kód: [[Médiá:projektJozefCsabi.zip|zdrojaky.zip]]
  
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
  
 +
=== Overenie ===
  
=== Overenie ===
 
  
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
 
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.
 
  
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
+
[[Súbor:IMG_8668.jpg|400px|thumb|center|Aplikácia.]]
  
 
'''Video:'''
 
'''Video:'''
<center><youtube>_l02MBu41n0</youtube></center>
+
<center><youtube>https://youtube.com/shorts/VB9dRVsva_c</youtube></center>
  
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
 
[[Category:AVR]] [[Category:MIPS]]
 
[[Category:AVR]] [[Category:MIPS]]

Verzia zo dňa a času 10:52, 21. apríl 2024

Záverečný projekt predmetu MIPS / LS2024 - Jozef Csabi


Zadanie

Pripojenie senzora vzdialenosti HC-SR04 k vývojovej doske Arduino NANO. Našim cieľom je pripojiť senzor a odmerať vzdialenosť od prekážky.

Vývojová doska ARDUINO-NANO.

Literatúra:


Analýza a opis riešenia

Najprv sme si pridali do nášho programu knižnice uart.h, uart.c, ktoré sme si vytvorili na cvičení, aby sme mohli vypisovať vzdialenosť cez Putty. Inicializovali sme UART, vytvorili volatile premennú, do ktorej sme zapisovali vzdialenosť, ktorú sme následne vydelili 37, aby nám vyšla v cm. Následne sme si inicializovali trigger_pulse, aby vyslal signál a mohli sme začať merať. Potom sme čakali, kým bude Echo pin na vysokej úrovni, zmerali sme dĺžku signálu a vypočítali vzdialenosť v cm. Nakoniec sme dĺžku len vypísali cez Putty-ho, počkali chvíľu a merali sme znova.

Zapojenie

Zapojenie sme realizovali pripojením Trigger pinu na D10, Echo pinu na D9 a následne pripojením Gnd na zem a Vcc na 5V. Potom sme zapojili aj ARDUINO na zem.

Schéma zapojenia HC-SR04 senzora.


Algoritmus a program

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include "uart.h"
volatile uint16_t distance = 0; //tu budeme ukladat vzdialenost, ako cele cislo o velkosti 16 bitov
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);

void UART_Transmit(unsigned char data) {
    while (!(UCSR0A & (1<<UDRE0))); // Caka na prazdny buffer
    UDR0 = data;
}

void trigger_pulse() {
    PORTB |= (1 << PB1);  // Nastavi Trig pin na vysoku uroven
    _delay_us(10);              // Caka 10 mikrosekund
    PORTB &= ~(1 << PB1); // Nastavi Trig pin na nizku uroven
}

uint16_t measure_pulse_width() {
    uint16_t pulse_width = 0;
    uint16_t timeout = 50000; // Aby sme nesli donekonecna

    // Caka na Echo pin, kym bude na vysokej urovni
    while (!(PINB & (1 << PB2)) && timeout--) {
        _delay_us(1);
    }

    // Mera dlzku signalu
    while ((PINB & (1 << PB2)) && timeout--) {
        _delay_us(1);
        pulse_width++;
    }

    // Vypocitame vzdialenost v cm
    uint16_t distance = pulse_width / 58;
    return distance;
}

int main(void) {
    DDRB |= (1 << PB1); // Nastavi Trig pin ako vystup
    DDRB &= ~(1 << PB2); // Nastavi Echo pin ako vstup
	PORTB |= (1 << PB2); // Ovladanie pull-up rezistoru
	
	hw_init();
    uart_init();
    stdout= &mystdout;
	
    while (1) {
         trigger_pulse(); // Posle signal na senzor
		 uint16_t distance = measure_pulse_width(); // Merame vzdialenost a vypocitame ju v cm
        printf("Vzdialenost: %d cm\n", distance); // Vypiseme vzdialenost cez napr. Putty
        _delay_ms(500); // Pockame pred dalsim meranim
    }
    return 0;
}
/* ************************************************************************* */
/* FileName:             uart.h                                              */
/* ************************************************************************* */

#define LED PB5  // internal on-board LED 

 /* na testovanie su uz zadefinovane */
 // bit_is_set(PINB, SW1)
 // bit_is_clear(PINB, SW1)

 /* na cakanie su preddefinovane slucky */
 // loop_until_bit_is_set(PINB, SW1);    // cakanie na uvolnenie tlacitka
 // loop_until_bit_is_clear(PINB, SW1);  // cakanie na stlacenie tlacitka


#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))

#ifndef UART_H_
#define UART_H_

#include <stdio.h>

#define BAUD_PRESCALE  (((F_CPU / (BAUDRATE * 16UL))) - 1)  // vzor?ek z datasheetu

void hw_init( void );
void uart_init( void );
     
/* Following definition is compatible with STDIO.H, for more
 * information see https://www.appelsiini.net/2011/simple-usart-with-avr-libc/
 */
	 
int uart_putc( char c, FILE *stream );
void uart_puts( const char *s );

char uart_getc( void );

void delay(int delay); 

#endif /* UART_H_ */
/* ************************************************************************* */
/* FileName:             uart.c                                              */
/* ************************************************************************* */

#include <avr/io.h>
#include <util/delay.h>
#include "uart.h"

void hw_init( void )
{ 
  DDRB |= (1<<LED);    // PORTB.5 kde je LED ma byt OUTPUT
  /* sem si mozete dopisat svoje vlastne inicializacne prikazy */ 	
}

void uart_init( void ) 
{
//  for different BAUD rate change the project settings, or uncomment 
//  following two lines:	
//	#undef  BAUD           // avoid compiler warning
//  #define BAUD 115200
	
   #include <util/setbaud.h>  // requires defined BAUD
   
   UBRR0H = UBRRH_VALUE;
   UBRR0L = UBRRL_VALUE;
   #if USE_2X                 // defined in setbaud.h 
    UCSR0A |= (1 << U2X0);
   #else
    UCSR0A &= ~(1 << U2X0);
   #endif


    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */	
}


int uart_putc( char c, FILE *stream )
{
   if (c == '\n') 
      uart_putc('\r',stream);
   
   loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
   UDR0 = c;
   return 0;
}


void uart_puts(const char *s)
{
  /* toto je vasa uloha */
}

char uart_getc(void) 
{
    loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
    return UDR0;
}

void delay(int delay)      // vlastna funkcia pre dlhsie casy 
{
  for (int i=1; i<=delay; i++)
  _delay_ms(1);
}

Zdrojový kód: zdrojaky.zip


Overenie

Aplikácia.

Video: