Ultraheli kaugusmõõdik

Vajalikud teadmised: [HW] Kasutajaliidese moodul, [AVR] Loendurid/Taimerid, [LIB] Taimerid,
[LIB] Graafiline LCD, [LIB] Andurid

Teooria

SRF05 ultraheli kaugusmõõdik

Ultraheli kaugusmõõdik määrab objekti(de) kaugust, mõõtes helilaine objektilt tagasipeegeldumise aega. Helilaine sagedus asub ultraheli sageduse piirkonnas, mis tagab kontsentreerituma helilaine suuna, sest kõrgema sagedusega heli hajub keskkonnas vähem. Tüüpiline ultraheli kaugusmõõdik koosneb kahest membraanist, millest üks genereerib heli ja teine registreerib tagasipeegelduva kaja. Piltlikult öeldes on tegu kõlari ja mikrofoniga. Heligeneraator tekitab lühikese, mõne perioodi pikkuse ultraheli impulsi ja käivitab taimeri. Teine membraan registreerib peegeldunud impulsi saabumise ja peatab taimeri. Taimeri ajast on heli kiiruse järgi võimalik välja arvutada helilaine läbitud teepikkus. Objekti kaugus on ligikaudu pool helilaine teepikkusest.

Ultraheli kaugusmõõdiku tööpõhimõte

Ultraheli kaugusmõõdikutel on igapäevaelus mitmeid rakendusi. Neid kasutatakse mõõdulintide asendajatena kauguse mõõtmise seadmetes, näiteks ehitusel. Tänapäeva autod on varustatud tagurdamisel takistusest hoiatavate ultraheliandurite ja hoiatussignaaliga. Peale kauguse mõõtmise võivad nad lihtsalt registreerida objekti olemasolu mõõtepiirkonnas, näiteks tööstusmasinate ohualades. Kui ultraheli kiirgur ja vastuvõtja eraldada, saab mõõta nende vahel voolava aine voolukiirust, sest vastuvoolu levib helilaine aeglasemalt ja pärivoolu kiiremini.

Praktika

Robootika Kodulabori lisakomplektis on Devantech SRF04 või SRF05 ultraheli kaugusmõõdik. SRF04/SRF05 on ainult andur, mis otseselt kauguse infot ei väljasta. Anduril on peale toiteviikude veel päästiku ja kaja viik. Üks oluline erinevus andurite SRF04 ja SRF05 vahel on see, et SRF05-l on võimalik nii päästiku kui ka kaja signaali jaoks kasutada ühte füüsilist viiku. See võimaldab andurit kasutada standardse kolme-viigu pistikuga (toide, maa ja signaal). Päästiku viiku kõrgeks seades genereerib andur 8-perioodilise 40 kHz ultraheli laine. Sel hetkel läheb kõrgeks kaja viik ja jääb kõrgeks niikauaks, kuni peegeldunud helilaine on andurini jõudnud. Seega põhimõtteliselt näitab kaja signaal aega, mille jooksul heli levib objektini ja tagasi. Mõõtes seda aega, korrutades seda heli levimise kiirusega ja jagades kahega, saab leida objekti kauguse.

Devantech-i ultrahelianduri AVR-iga kasutamiseks tuleb selle päästiku ja kaja viigud ühendada mõnede AVR-i viikudega. Aja mõõtmiseks on sobiv kasutada 16-bitist taimerit, näiteks timer3. Järgnevalt on toodud funktsioon ATmega2561 kontrolleri näitel, mis teostab kogu mõõtmisprotseduuri - genereerib päästiku signaali, käivitab taimeri, mõõdab kajasignaali pikkust ja teisendab selle kauguseks sentimeetrites. Funktsioon on blokeeruv ehk protsessor on sellega hõivatud senikaua, kuni mõõtetulemus on käes või mõõtmine venib lubatust pikemaks. Mida kiiremini kaja saabub, seda kiiremini saab mõõtetulemuse. Kui kaja ei saabugi, ootab funktsioon seda ~36 ms ja tagastab seejärel 0. Oluline on mõõtmiste vahele jätta mõnikümmend millisekundit pausi, et eelmisel mõõtmisel tekitatud helilaine jõuaks sumbuda ega rikuks uut mõõtmist. Kui kasutatakse samaaegselt mitut ultraheli andurit, tuleb samuti jälgida, et helilained ei kattuks.

#define ULTRASONIC_SPEED_OF_SOUND 33000 // cm/s
 
// Ultraheli kaugusanduriga mõõtmine
unsigned short ultrasonic_measure_srf05(pin triggerecho)
{	
	// Viikude seadistamine
	pin_setup_output(triggerecho);
 
	// Taimer 3 normaalrežiimi seadistamine
	// perioodiga F_CPU / 8
	timer3_init_normal(TIMER3_PRESCALE_8);
 
	// Päästiku viigu kõrgeks määramine
	pin_set(triggerecho);
 
	// Taimeri nullimine
	timer3_overflow_flag_clear();
	timer3_set_value(0);	
 
	// ~10 us ootamine
	while (timer3_get_value() < 18) {}
 
	// Päästiku viigu madalaks määramine
	pin_clear(triggerecho);
 
        sw_delay_ms(1);
 
	// Kaja signaali alguse ootamine
        pin_setup_input_with_pullup(triggerecho);
	while (!pin_get_value(triggerecho))
	{
		// Liiga kaua oodatud?
		if (timer3_overflow_flag_is_set())
		{
			return 0;
		}
	}
 
	// Taimeri nullimine
	timer3_set_value(0);
 
	// Kaja signaali lõpu ootamine
	while (pin_get_value(triggerecho))
	{
		// Liiga kaua oodatud?
		if (timer3_overflow_flag_is_set())
		{
			return 0;
		}
	}
 
	// Mõõdetud aja kauguseks teisendamine
	// kaugus = aeg * (1 / (F_CPU / 8)) * heli kiirus / 2
	return (unsigned long)timer3_get_value() *
		ULTRASONIC_SPEED_OF_SOUND / (F_CPU / 4);
}

Toodud funktsioon jätab päästiku / kaja viigu kasutaja valida, nii et andurit saab ühendada sinna, kus on sobivam või kus on ruumi. Lisaks võimaldab viige valiku vabadus funktsiooni kasutada ka mujal kui Kodulabori komplektis. Toodud funktsioon kuulub ka Kodulabori teeki, nii et seda ei pea oma programmi eraldi kirjutama. Peab aga arvestama, et Kodulabori teegis on see funktsioon jäigalt seotud Kodulabori Kontrollermooduli taktsagedusega ja muude taktsageduste puhul annaks funktsioon vale tulemuse. Muu taktsageduse korral tuleb see funktsioon ise oma programmi kirjutada. Järgnevalt esitatud programmikood demonstreerib SRF05 ultrahelianduri kasutamist Kodulabori teegiga. Anduri ühendamisel on väga oluline jälgida toite polaarsust. Valepidi ühendamisel muutub andur töökõlbmatuks.

// Kodulabori ultraheli kaugusanduri näidisprogramm
// Kauguse mõõtmise funktsioon on blokeeruv
#include <stdio.h>
#include <homelab/pin.h>
#include <homelab/delay.h>
#include <homelab/module/sensors.h>
#include <homelab/module/lcd_gfx.h>
 
// Ultraheli SRF05 anduri signaali viik
// Kodulabor II
//pin pin_trigger_echo = PIN(F, 2);
 
// Kodulabor III
pin pin_trigger_echo = PIN(B, 2);
 
// Põhiprogramm
int main(void)
{ 		 
	unsigned short distance;
	char text[16];	
 
	// Kodulabor II Andurimooduli väliste andurite viik
	/*
	pin ex_sensors = PIN(G, 0);
	pin_setup_output(ex_sensors);
	pin_set(ex_sensors);
	*/
 
	// LCD ekraani seadistamine
	lcd_gfx_init();
	lcd_gfx_clear();
	lcd_gfx_goto_char_xy(1, 1);
	lcd_gfx_write_string("Ultraheli");
 
	// Väike paus
	sw_delay_ms(100);
 
 	// Lõputu tsükkel
	while (1)
	{
		// Mõõtmine
		distance = ultrasonic_measure_srf05(pin_trigger_echo);
 
		// Mõõtmine õnnestus?
		if (distance > 0)
		{			
			// Kauguse tekstiks teisendamine
			sprintf(text, "%3d cm   ", distance);
		}
		// Mõõtmisel tekkis viga?
		else
		{
			// Vea tekst
			sprintf(text, "Viga    ");
		}			
 
		// Teksti kuvamine LCD teise rea alguses
		lcd_gfx_goto_char_xy(3, 3);
		lcd_gfx_write_string(text);
 
		// Väike paus
		sw_delay_ms(500);
	}
}

Veendumaks, et ultraheli andur ka tegelikult tööle hakkab, tuleks kontrollida, kas anduri tagaküljel asuv väike LED vilgub iga mõõtmise korral.

et/examples/sensor/ultrasonic_distance.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0