This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:sensor:ir_distance [2014/09/12 12:58] – heikopikner | et:examples:sensor:ir_distance [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < | ||
====== Infrapuna kaugusandur ====== | ====== Infrapuna kaugusandur ====== | ||
- | //Vajalikud teadmised: [HW] [[et: | + | //Vajalikud teadmised: |
+ | [HW] [[et: | ||
+ | [AVR] [[et: | ||
+ | [LIB] [[et: | ||
===== Teooria ===== | ===== Teooria ===== | ||
Line 17: | Line 21: | ||
[{{ : | [{{ : | ||
- | 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. | + | 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. |
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. | ||
- | [{{ : | + | [{{ : |
- | Nagu graafikult näha, kattub trendijoon (sinine) | + | 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, |
1 / (d + k) = a ⋅ ADC + b | 1 / (d + k) = a ⋅ ADC + b | ||
Line 50: | 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 63: | 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 | + | // Tagastatakse |
- | // | + | |
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 84: | Line 82: | ||
</ | </ | ||
- | Teisenduse tegemiseks tuleb välja kutsuda // | + | Teisenduse tegemiseks tuleb välja kutsuda // |
- | + | < | |
- | ~~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 < | #include < | ||
#include < | #include < | ||
Line 99: | Line 93: | ||
#include < | #include < | ||
- | // 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 113: | Line 101: | ||
char text[16]; | char text[16]; | ||
- | // Robootika Kodulabor II | + | // Robootika Kodulabor II Andurite moodul |
- | // Anduriplaadi | + | |
//pin ex_sensors = PIN(G, 0); | //pin ex_sensors = PIN(G, 0); | ||
// | // | ||
Line 121: | 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, | lcd_gfx_goto_char_xy(1, | ||
- | |||
- | // Programmi nimi | ||
lcd_gfx_write_string(" | lcd_gfx_write_string(" | ||
Line 135: | 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 145: | Line 126: | ||
lcd_gfx_goto_char_xy(1, | lcd_gfx_goto_char_xy(1, | ||
- | // Kas saab kauguse | + | // Kauguse |
if (distance >= 0) | if (distance >= 0) | ||
{ | { | ||
- | sprintf(text, | + | sprintf(text, |
} | } | ||
else | else | ||
Line 155: | Line 136: | ||
} | } | ||
- | // Teksti kuvamine LCD teise rea alguses | ||
lcd_gfx_goto_char_xy(1, | lcd_gfx_goto_char_xy(1, | ||
lcd_gfx_write_string(text); | lcd_gfx_write_string(text); | ||
- | |||
- | // Paus | ||
sw_delay_ms(500); | sw_delay_ms(500); | ||
} | } | ||
} | } | ||
- | </ | ||
+ | </ | ||
+ | /* | ||
[[et: | [[et: | ||
===== Lisamaterjalid ===== | ===== Lisamaterjalid ===== | ||
Line 170: | Line 149: | ||
* {{: | * {{: | ||
* [[http:// | * [[http:// | ||
+ | |||
+ | */ |