Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:examples:sensor:ir_distance [2014/09/17 13:51] raivo.sellet:examples:sensor:ir_distance [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +<pagebreak>
 ====== Infrapuna kaugusandur ====== ====== Infrapuna kaugusandur ======
  
-//Vajalikud teadmised: [HW] [[et:hardware:homelab:sensor]], [HW] [[et:hardware:homelab:lcd]], [AVR] [[et:avr:adc]], [LIB] [[et:software:homelab:library:adc]], [LIB] [[et:software:homelab:library:module:lcd_alphanumeric]], [LIB] [[et:software:homelab:library:module:sensor]]//+//Vajalikud teadmised:  
 +[HW] [[et:hardware:homelab:digi]],  
 +[AVR] [[et:avr:adc]], \\ 
 +[LIB] [[et:software:homelab:library:adc]], [LIB] [[et:software:homelab:library:module:lcd_graphic]], [LIB] [[et:software:homelab:library:module:sensor]]//
  
 ===== Teooria ===== ===== Teooria =====
Line 12: Line 16:
  
 Sharp-i kaugusandurite väljund on pöördvõrdeline - kauguse kasvades see väheneb ja järjest aeglasemalt. Täpne kauguse ja väljundi vaheline graafik on toodud andurite andmelehel. Anduritel on vastavalt tüübile ka mõõtepiirkond, milles nende väljund on usaldusväärne. Maksimaalsele reaalselt mõõdetavale kaugusele seab piiri kaks aspekti: peegelduva valguse intensiivsuse vähenemine ja PSD-e võimetus registreerida väikest peegeldunud kiire asukoha muutust. Liiga kaugete objektide mõõtmisel jääb anduri väljund ligikaudu samaks, mis maksimaalselt mõõdetava kauguse puhulgi. Minimaalne mõõdetav kaugus on piiratud Sharp-i andurite omapära tõttu - nimelt hakkab väljundpinge kauguse vähenedes teatud kaugusel (olenevalt andurist 4-20 cm)  järsult jälle vähenema. Sisuliselt tähendab see, et ühele väljundpinge väärtusele vastab kaks kaugust. Probleemide ärahoidmiseks tuleb vältida objektide andurile liiga lähedale sattumist. Sharp-i kaugusandurite väljund on pöördvõrdeline - kauguse kasvades see väheneb ja järjest aeglasemalt. Täpne kauguse ja väljundi vaheline graafik on toodud andurite andmelehel. Anduritel on vastavalt tüübile ka mõõtepiirkond, milles nende väljund on usaldusväärne. Maksimaalsele reaalselt mõõdetavale kaugusele seab piiri kaks aspekti: peegelduva valguse intensiivsuse vähenemine ja PSD-e võimetus registreerida väikest peegeldunud kiire asukoha muutust. Liiga kaugete objektide mõõtmisel jääb anduri väljund ligikaudu samaks, mis maksimaalselt mõõdetava kauguse puhulgi. Minimaalne mõõdetav kaugus on piiratud Sharp-i andurite omapära tõttu - nimelt hakkab väljundpinge kauguse vähenedes teatud kaugusel (olenevalt andurist 4-20 cm)  järsult jälle vähenema. Sisuliselt tähendab see, et ühele väljundpinge väärtusele vastab kaks kaugust. Probleemide ärahoidmiseks tuleb vältida objektide andurile liiga lähedale sattumist.
-~~CL~~ 
  
 ===== Praktika  ===== ===== Praktika  =====
Line 18: Line 21:
 [{{  :examples:sensor:ir_distance:sensor_ir_distance_graph.png?240|Tüüpiline Sharp IR kaugusmõõdiku pinge-kauguse graafik}}] [{{  :examples:sensor:ir_distance:sensor_ir_distance_graph.png?240|Tüüpiline Sharp IR kaugusmõõdiku pinge-kauguse graafik}}]
  
-Kodulabori andurite komplektis on Sharp-i infrapuna kaugusmõõdik GP2Y0A21YK mõõtepiirkonnaga 10-80 cm. Anduri väljundpinge on kuni 3 V sõltuvalt mõõdetavast kaugusest. Andur ühendub andurite mooduli külge ja selle väljundpinge suunatakse AVR-i analoog-digitaalmuunduri kanalisse 0. Eelnevate andurite harjutuste baasil saab lihtsalt teha programmi, mis mõõdab kaugusmõõdiku väljundpinget, kuid lisaks on selle harjutuse eesmärk veel pinge kauguseks teisendamise protsessi tutvustamine.+Kodulabori andurite komplektis on Sharp-i infrapuna kaugusmõõdik GP2Y0A21YK mõõtepiirkonnaga 10-80 cm. Anduri väljundpinge on kuni 3 V sõltuvalt mõõdetavast kaugusest. Anduri saab ühendada Kodulabori mooduli külge valitud analoogkanalisse. Eelnevate andurite harjutuste baasil saab lihtsalt teha programmi, mis mõõdab kaugusmõõdiku väljundpinget, kuid lisaks on selle harjutuse eesmärk veel pinge kauguseks teisendamise protsessi tutvustamine.
  
 GP2Y0A21YK andmelehel on toodud väljundpinge ja mõõdetud kauguse vahelise sõltuvuse graafik. See pole lineaarne, kuid väljundpinge ja kauguse pöördväärtuse graafik peaaegu juba on, ning sellest on suhteliselt lihtne leida valem pinge kauguseks teisendamiseks. Valemi leidmiseks tuleb sama graafiku punktid sisestada mõnda tabelarvutuse programmi ja nendest uuesti graafik luua. Tabelarvutusprogrammides on graafiku punktide põhjal võimalik arvutada automaatselt välja trendijoon. Järgnevalt on toodud GP2Y0A21YK väljundpinge ja kauguse korrigeeritud pöördväärtuse vahelise seose graafik koos lineaarse trendijoonega. Väljundpinge on valemi lihtsustamise nimel juba teisendatud 10-bitiseks +5 V võrdluspingega analoog-digitaalmuunduri väärtuseks. GP2Y0A21YK andmelehel on toodud väljundpinge ja mõõdetud kauguse vahelise sõltuvuse graafik. See pole lineaarne, kuid väljundpinge ja kauguse pöördväärtuse graafik peaaegu juba on, ning sellest on suhteliselt lihtne leida valem pinge kauguseks teisendamiseks. Valemi leidmiseks tuleb sama graafiku punktid sisestada mõnda tabelarvutuse programmi ja nendest uuesti graafik luua. Tabelarvutusprogrammides on graafiku punktide põhjal võimalik arvutada automaatselt välja trendijoon. Järgnevalt on toodud GP2Y0A21YK väljundpinge ja kauguse korrigeeritud pöördväärtuse vahelise seose graafik koos lineaarse trendijoonega. Väljundpinge on valemi lihtsustamise nimel juba teisendatud 10-bitiseks +5 V võrdluspingega analoog-digitaalmuunduri väärtuseks.
  
-[{{  :examples:sensor:ir_distance:sensor_ir_distance_gp2y0a21yk_graph_calculation.png?580  |Kauguse ja ADC väärtuse lineariseerimise graafik}}]+[{{  :examples:sensor:ir_distance:sensor_ir_distance_gp2y0a21yk_graph_calculation.png?400|Kauguse ja ADC väärtuse lineariseerimise graafik}}]
  
-Nagu graafikult näha, kattub trendijoon (sinine)  üsna täpselt graafiku punktidega (punane joon). Selline kattuvus on saavutatud kauguse korrigeerimiskonstandi abil. Korrigeerimiskonstant on leitud katse-eksitusmeetodil - läbi on proovitud erinevaid arve, kuni on leitud selline, mille korral graafik kattub trendijoonega kõige rohkem. Antud graafiku puhul on see +2, ehk kõigile reaalsetele kaugustele on graafikus 2 otsa liidetud. Kuna nii on graafik väga sarnane lineaarsele trendijoonele, võib teha üldistuse ja öelda, et kauguse ja pinge vaheline seos on järgmine:+Nagu graafikult näha, kattub trendijoon (sinine) üsna täpselt graafiku punktidega (punane joon). Selline kattuvus on saavutatud kauguse korrigeerimiskonstandi abil. Korrigeerimiskonstant on leitud katse-eksitusmeetodil - läbi on proovitud erinevaid arve, kuni on leitud selline, mille korral graafik kattub trendijoonega kõige rohkem. Antud graafiku puhul on see +2, ehk kõigile reaalsetele kaugustele on graafikus 2 otsa liidetud. Kuna nii on graafik väga sarnane lineaarsele trendijoonele, võib teha üldistuse ja öelda, et kauguse ja pinge vaheline seos on järgmine:
  
 1 / (d + k) = a ⋅ ADC + b 1 / (d + k) = a ⋅ ADC + b
Line 51: Line 54:
  
 Järgnevalt on toodud Kodulabori teegis kirja pandud funktsioon ADC väärtuse sentimeetriteks teisendamise kohta. Lineaar- ja vabaliige ning korrigeerimiskonstant pole funktsiooni jäigalt sisse kirjutatud, vaid need antakse ette IR kaugusanduri parameetrite struktuuri objektiga. Hoides parameetreid eraldi konstandis, saab hiljem programmi lihtsalt lisada uusi IR kaugusandurite mudeleid. Järgnevalt on toodud Kodulabori teegis kirja pandud funktsioon ADC väärtuse sentimeetriteks teisendamise kohta. Lineaar- ja vabaliige ning korrigeerimiskonstant pole funktsiooni jäigalt sisse kirjutatud, vaid need antakse ette IR kaugusanduri parameetrite struktuuri objektiga. Hoides parameetreid eraldi konstandis, saab hiljem programmi lihtsalt lisada uusi IR kaugusandurite mudeleid.
-~~PB~~+
 <code c> <code c>
-// 
 // IR kaugusanduri parameetrite struktuur // IR kaugusanduri parameetrite struktuur
-// 
 typedef const struct typedef const struct
 { {
Line 64: Line 65:
 ir_distance_sensor; ir_distance_sensor;
  
-// 
 // GP2Y0A21YK anduri parameetrite objekt // GP2Y0A21YK anduri parameetrite objekt
-//  
 const ir_distance_sensor GP2Y0A21YK = { 5461, -17, 2 }; const ir_distance_sensor GP2Y0A21YK = { 5461, -17, 2 };
  
-// 
 // IR kaugusanduri ADC väärtuse sentimeetriteks teisendamine // IR kaugusanduri ADC väärtuse sentimeetriteks teisendamine
-// Tagastab -1, kui teisendus ei õnnestunud +// Tagastatakse -1, kui teisendus ei õnnestunud
-//+
 signed short ir_distance_calculate_cm(ir_distance_sensor sensor, signed short ir_distance_calculate_cm(ir_distance_sensor sensor,
  unsigned short adc_value)  unsigned short adc_value)
Line 85: Line 82:
 </code> </code>
  
-Teisenduse tegemiseks tuleb välja kutsuda //ir_distance_calculate_cm// funktsioon, mille esimene parameeter on IR kaugusanduri parameetrite objekt, teine aga ADC väärtus. Funktsioon tagastab arvutatud kauguse sentimeetrites. Väära tehte (ehk siis ebaloomuliku ADC väärtuse) korral tagastab funktsioon -1. IR kaugusanduri ja teisendusfunktsiooni kasutamist demonstreerib järgnev programm. Kasutusel on alfabeetiline LCD ekraan, kus kuvatakse mõõtetulemust. Ebaloomuliku kauguse puhul kuvatakse küsimärki. +Teisenduse tegemiseks tuleb välja kutsuda //ir_distance_calculate_cm// funktsioon, mille esimene parameeter on IR kaugusanduri parameetrite objekt, teine aga ADC väärtus. Funktsioon tagastab arvutatud kauguse sentimeetrites. Väära tehte (ehk siis ebaloomuliku ADC väärtuse) korral tagastab funktsioon -1. IR kaugusanduri ja teisendusfunktsiooni kasutamist demonstreerib järgnev programm. Kasutusel on LCD ekraan, kus kuvatakse mõõtetulemust. Ebaloomuliku kauguse puhul kuvatakse küsimärki. 
- +<pagebreak>
-~~PB~~ +
 <code c> <code c>
-// +// Kodulabori IR kaugusmõõdiku näidisprogramm 
-// Kodulabori IR kaugusmõõdiku näidisprogramm. +// LCD ekraanil kuvatakse mõõdetud kaugus sentimeetrites
-// LCD ekraanil kuvatakse mõõdetud kaugus sentimeetrites+
-//+
 #include <stdio.h> #include <stdio.h>
 #include <homelab/adc.h> #include <homelab/adc.h>
Line 100: Line 93:
 #include <homelab/module/lcd_gfx.h> #include <homelab/module/lcd_gfx.h>
  
-// Robootika Kodulabor II +#define ADC_CHANNEL 0
-//#define ADC_CHANNEL 0+
  
-// Robootika Kodulabor III 
-#define ADC_CHANNEL 10 
- 
-// 
 // Põhiprogramm // Põhiprogramm
-// 
 int main(void) int main(void)
 { {
Line 114: Line 101:
  char text[16];  char text[16];
  
-        // Robootika Kodulabor II +        // Robootika Kodulabor II Andurite moodul väliste andurite viik
- // Anduriplaadi väliste andurite viik+
  //pin ex_sensors = PIN(G, 0);  //pin ex_sensors = PIN(G, 0);
  //pin_setup_output(ex_sensors);  //pin_setup_output(ex_sensors);
Line 122: Line 108:
  // LCD ekraani seadistamine  // LCD ekraani seadistamine
  lcd_gfx_init();  lcd_gfx_init();
- 
- // LCD ekraani puhastamine 
  lcd_gfx_clear();  lcd_gfx_clear();
- 
- //LCD-l kirjutamise koha valik 
  lcd_gfx_goto_char_xy(1,2);  lcd_gfx_goto_char_xy(1,2);
- 
- // Programmi nimi 
  lcd_gfx_write_string("Kaugusandur");  lcd_gfx_write_string("Kaugusandur");
  
Line 136: Line 116:
  
  // Lõputu tsükkel  // Lõputu tsükkel
- while (true)+ while (1)
  {  {
  // Anduri väljundpinge 4-kordselt ümardatud väärtuse lugemine  // Anduri väljundpinge 4-kordselt ümardatud väärtuse lugemine
Line 146: Line 126:
  lcd_gfx_goto_char_xy(1,3);  lcd_gfx_goto_char_xy(1,3);
  
- // Kas saab kauguse või veateate kuvada ?+ // Kauguse või veateate kuvamine
  if (distance >= 0)  if (distance >= 0)
  {  {
- sprintf(text, "%cm   ", distance);+ sprintf(text, "%3d cm   ", distance);
  }  }
  else  else
Line 156: Line 136:
  }  }
  
- // Teksti kuvamine LCD teise rea alguses 
  lcd_gfx_goto_char_xy(1,3);  lcd_gfx_goto_char_xy(1,3);
  lcd_gfx_write_string(text);  lcd_gfx_write_string(text);
- 
- // Paus 
  sw_delay_ms(500);  sw_delay_ms(500);
  }  }
Line 166: Line 143:
  
 </code> </code>
 +/*
 [[et:examples:sensor:ir_distance:alpha|Koodi näide teksti LCD-le]] [[et:examples:sensor:ir_distance:alpha|Koodi näide teksti LCD-le]]
 ===== Lisamaterjalid ===== ===== Lisamaterjalid =====
Line 172: Line 149:
   * {{:examples:sensor:ir_distance:ir_distance.ods|Sharp GP2Y0A21YK anduri graafik}}   * {{:examples:sensor:ir_distance:ir_distance.ods|Sharp GP2Y0A21YK anduri graafik}}
   * [[http://www.acroname.com/robotics/info/articles/irlinear/irlinear.html|Linearizing Sharp Ranger Data]]   * [[http://www.acroname.com/robotics/info/articles/irlinear/irlinear.html|Linearizing Sharp Ranger Data]]
 +
 +*/
et/examples/sensor/ir_distance.1410961886.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
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