This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:sensor:lidar [2013/06/25 12:17] – heikopikner | et:examples:sensor:lidar [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Lidar ====== | ||
| + | |||
| + | //Vajalikud teadmised: [HW] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | LIDAR (LIght Detection And Ranging) on optiline kaugseire süsteem, mis kaardistab ümbrust. Lidareid kasutatakse autonoomsete autode ja robotite peal, kuid ka erinevates koobaste ja keskkonna kaardistamise süsteemides ning tööstusrobootikas. Lidar võimaldab saada küllaltki täpse kujutise ruumist ja takistustest. | ||
| + | |||
| + | Lidar koosneb laserist, mis saadab kiire objektini ja vastuvõtjast. Vastuvõtja on võimeline mõõtma valguse tagasipeegeldunud komponenti objektilt, mis on samasihiline saadetud laserkiirega. Selle järgi arvutatakse kaugus. Mõõtmisi tehakse paljudes punktides. Laserkiire juhtimine toimub mehhaaniliselt liigutatava peegli abil. Tasapinnalist skaneerimist võimaldavad lidarid on odavamad. Nende puhul katab kiir tasapinna, näiteks 180 kraadi ulatuses. | ||
| + | |||
| + | [{{ : | ||
| + | | ||
| + | Valguse tagasipeegeldunud komponendi mõõtmiseks on kaks erinevat viisi. Esimesel juhul saadetakse välja infrapuna laseri impulss ja oodatakse, kuni see tagasi peegeldub. Tagasipeegeldumise aja järgi saab arvutada antud suunas oleva objekti kauguse. Kuna mõõtmine toimub pikosekundites, | ||
| + | |||
| + | [{{: | ||
| + | |||
| + | Teine odavam võimalus on kasutada moduleeritud infrapuna laserkiirt ja mõõta saadetava ja objektilt tagasipeegelduva valguse faasinihet. Faasinihke suurus on sõltuv objekti kaugusest. | ||
| + | |||
| + | c = f ∙ τ | ||
| + | |||
| + | kus c on valguse kiirus, f modulatsioonisagedus ja τ tuntud moduleerimiseks kasutatud lainepikkus. | ||
| + | |||
| + | Summaarne kaugus D', mille kiiratud valgus läbib on: | ||
| + | |||
| + | D' = B + 2A = B + (θ * τ) / 2π | ||
| + | |||
| + | kus A on mõõdetav kaugus ja B on faasinihkesensori vahemaa kiirtelahutajast. Soovitud kaugus D kiirtelahutaja ja takistuse vahel on avaldatav järgmiselt: | ||
| + | |||
| + | D = τ * θ / 4π | ||
| + | |||
| + | kus θ on elektrooniliselt mõõdetav faasi erinevus kiiratud ja tagasipeegeldunud valguskiire vahel. | ||
| + | |||
| + | ===== Praktika ===== | ||
| + | [{{ : | ||
| + | |||
| + | Robootikas ja tööstuses on SICK laserkaugusmõõdikud laialdaselt kasutustusel. SICK LMS 200 on lihtsalt ühendatav RS-232 või RS-422 liidese abil, võimaldades skaneerida 180 kraadist ala 80 meetri kauguselt. Lidari tööpõhimõte seisneb saadetud valgusimpulsi tagasipeegeldumiseks kulunud aja mõõtmises. Paremal oleval pildil on ühe skaneerimise tulemused kujutatud kaardina. | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | SICK lidari töökorda seadmiseks tuleb ühendada toite ja andmeside kaablid. Lidari tagaosas ülemise nurga lähedal on kaks pistikut, mis sarnanevad arvuti jadaliidese pordi omaga. Emane pistik on mõeldud toite ja isane andmeside jaoks. Toite ja jadaliidese kaabel tuleb ühendada vastavalt pildile. Lidari saab ühendada kodulabori kommunikatsioonimooduliga RS-232 pistiku abil. Toide 24 V dc tuleb võtta eraldi toiteallikast, | ||
| + | |||
| + | SICK võtab vastu käsklusi bittide striimina jadaliidese vahendusel. Andmete edastamisel saadab andur tagasi bittide jada sõltuvalt mõõtetulemusest antud nurgas. | ||
| + | |||
| + | Andmete saamiseks andurilt tuleb kõigepealt saata stardistring, | ||
| + | |||
| + | Kuueteistkümmnendkujul: | ||
| + | |||
| + | Kümnendkujul: | ||
| + | |||
| + | Kui stardistring on edukalt saadetud, alustab lidar andmete striimimist üle jadaliidese. Andmed skaneerimise tulemusest saadetakse järjestikku iga kraadi kohta. Näiteks kui lidar on seadistatud skaneerima 180° kraadi ulatuses eraldusvõimega 0.5°, siis esimene lugem on nurga 0° kohta, teine lugem nurga 0.5° kohta ja nii edasi. See tähendab, et kokkuvõttes saadetakse 361 lugemit. Iga kauguse lugem saadetakse kahe baidina. Kõige madalam bait saadetakse esimesena. Sellele järgneb kõrgem bait. Töötades " | ||
| + | |||
| + | Andmete saatmise lõpetamiseks tuleb saata stopp käsk. See käsk on järgnev: | ||
| + | |||
| + | Kuueteistkümmnendkujul: | ||
| + | |||
| + | Kümnendkujul: | ||
| + | |||
| + | Järgmine näide tutvustab, kuidas seadistada lidar ja lugeda saabunud pakettide arvu, kasutades kodulaborit. | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // USART liidese seadistamine | ||
| + | usart port = USART(0); | ||
| + | |||
| + | // Nuppude viikude määramine | ||
| + | pin button1 = PIN(C, 0); | ||
| + | pin button2 = PIN(C, 1); | ||
| + | |||
| + | // Riistvara seadistamine | ||
| + | static inline void init() | ||
| + | { | ||
| + | // Nupu viikude sisendiks määramine | ||
| + | pin_setup_input_with_pullup(button1); | ||
| + | pin_setup_input_with_pullup(button2); | ||
| + | |||
| + | // LCD ekraani seadistamine | ||
| + | lcd_gfx_init(); | ||
| + | // LCD ekraani puhastamine | ||
| + | lcd_gfx_clear(); | ||
| + | // LCD ekraani taustavalgustuse tööle lülitamine | ||
| + | lcd_gfx_backlight(true); | ||
| + | // Programmi nime kuvamine | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // USART liidese seadistamine | ||
| + | usart_init_async | ||
| + | ( | ||
| + | port, | ||
| + | USART_DATABITS_8, | ||
| + | USART_STOPBITS_ONE, | ||
| + | USART_PARITY_NONE, | ||
| + | USART_BAUDRATE_ASYNC(9600) | ||
| + | ); | ||
| + | } | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | unsigned char new_value1, new_value2, old_value1 = 0, old_value2 = 0; | ||
| + | |||
| + | char c; | ||
| + | int i = 0; | ||
| + | int count = 0; | ||
| + | char text[16]; | ||
| + | |||
| + | // Seadista riistvara | ||
| + | init(); | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) | ||
| + | { | ||
| + | // Nupu oleku lugemine | ||
| + | new_value1 = pin_get_debounced_value(button1); | ||
| + | new_value2 = pin_get_debounced_value(button2); | ||
| + | |||
| + | // Nupp S1 on alla vajutatud | ||
| + | if((!new_value1) && (old_value1)) | ||
| + | { | ||
| + | //Saada lidarile "02 00 02 00 20 24 34 08", et alustada skanneerimist | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | } | ||
| + | |||
| + | // Nupp S2 on alla vajutatud | ||
| + | if((!new_value2) && (old_value2)) | ||
| + | { | ||
| + | //Saada lidarile "0x 02 00 02 00 20 25 35 08", et lõpetada | ||
| + | // | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | usart_send_char(port, | ||
| + | } | ||
| + | |||
| + | // Mäleta nupu viimast olekut | ||
| + | old_value1 = new_value1; | ||
| + | old_value2 = new_value2; | ||
| + | |||
| + | // Jadaliidesest märgi lugemine | ||
| + | if (usart_try_read_char(port, | ||
| + | { | ||
| + | // Paketi päise "0x 02 81 D6 02 B0 69 41" otsimine | ||
| + | if(c == 0x02) i++; | ||
| + | if(c == 0x81) i++; | ||
| + | if(c == 0xD6) i++; | ||
| + | if(c == 0x02) i++; | ||
| + | if(c == 0xB0) i++; | ||
| + | if(c == 0x69) i++; | ||
| + | if(c == 0x41) i++; | ||
| + | |||
| + | // Päise olemasolu kontroll | ||
| + | if(i >= 7) | ||
| + | { | ||
| + | // | ||
| + | count++; | ||
| + | |||
| + | //LCD ekraanil pakettide arvu kuvamine | ||
| + | lcd_gfx_goto_char_xy(0, | ||
| + | |||
| + | sprintf(text, | ||
| + | |||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | i=0; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||