This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:vision [2011/11/25 01:00] – Oluliselt täiendatud heikopikner | et:examples:vision [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| ====== Masinnägemine ====== | ====== Masinnägemine ====== | ||
| <note important> | <note important> | ||
| Line 24: | Line 25: | ||
| ===CMUCam2 GUI=== | ===CMUCam2 GUI=== | ||
| - | Tegemist on Windowsi | + | Tegemist on arvutile mõeldud graafilise kasutajaliidesega, |
| Programmi kasutamiseks tuleb kaamera ühendada võimaluse korral otse arvuti COM pordiga või kasutada selleks USB-Serial üleminekut. Programmi käivitamisel küsitakse COM pordi numbrit, kuhu kaamera on ühendatud. Peale seda avaneb programmi töökeskkond. | Programmi kasutamiseks tuleb kaamera ühendada võimaluse korral otse arvuti COM pordiga või kasutada selleks USB-Serial üleminekut. Programmi käivitamisel küsitakse COM pordi numbrit, kuhu kaamera on ühendatud. Peale seda avaneb programmi töökeskkond. | ||
| Line 32: | Line 33: | ||
| Kaamera vaheleht on veel selle poolest väga tähtis, et pildil soovitud värvil klikates saab teada selle koodi. Samal ajal tõstetakse teised sama värvi pikslid kah esile. | Kaamera vaheleht on veel selle poolest väga tähtis, et pildil soovitud värvil klikates saab teada selle koodi. Samal ajal tõstetakse teised sama värvi pikslid kah esile. | ||
| - | {{: | + | {{: |
| Pilt 1. Kaamera GUI aken | Pilt 1. Kaamera GUI aken | ||
| Line 39: | Line 40: | ||
| - | + | {{: | |
| - | {{: | + | |
| Pilt 2. Color Tracking | Pilt 2. Color Tracking | ||
| - | Kodulaboriga värviotsimist tehes on antud programmiga hea värvivahemik määrata, mida otsida ja see reaalselt ära testida. Kodulabori väikesel ekraanil on aimult numbrilist infot näha ja selle järgi midagi kindlaks määrata on võimatu. | + | Kodulaboriga värviotsimist tehes on antud programmiga hea värvivahemik määrata, mida otsida ja see reaalselt ära testida. Kodulabori väikesel ekraanil on ainult numbriline info ja selle järgi midagi kindlaks määrata on võimatu. |
| ===== CMUCam3 kaamera kasutamine kodulaboriga ===== | ===== CMUCam3 kaamera kasutamine kodulaboriga ===== | ||
| - | Antud näited on mõeldud kasutama CMUCam3-kaamerat emuleeritud | + | Antud näited on mõeldud kasutama CMUCam3-kaamerat emuleeritud |
| ==== Kodulabori tarkvara ==== | ==== Kodulabori tarkvara ==== | ||
| - | Kodulabori poolne | + | Kodulabori poolne |
| - | Failis CMUCAM.c | + | Failis CMUCAM.c |
| - | Fail USART.c on mõeldud puhtalt serial ühenduse teenindamiseks. Failis on funktsioon ühenduse seadistamiseks ja ka mõlemas suunas andmevahetuseks. Olgu veel öeldud, et kui andmed saabuvad, käivitatakse failis CMUCAM.c paiknev CMUPacketHandler, | + | Fail USART.c on mõeldud puhtalt serial ühenduse teenindamiseks. Failis on funktsioon ühenduse seadistamiseks ja ka mõlemas suunas andmevahetuseks. Olgu veel öeldud, et kui andmed saabuvad, käivitatakse failis CMUCAM.c paiknev CMUPacketHandler, |
| Line 69: | Line 69: | ||
| ==Kirjeldus== | ==Kirjeldus== | ||
| - | Programm seadistab CMU kaamera kindla värvi | + | Programm seadistab CMU kaamera kindla värvi |
| ekraanil kuvatakse ümber seda värvi ala joonistatud ristküliku keskpunkti | ekraanil kuvatakse ümber seda värvi ala joonistatud ristküliku keskpunkti | ||
| koordinadid. | koordinadid. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Pilt 3. Programm koordinaate kuvamas | ||
| ==Kasutamine== | ==Kasutamine== | ||
| Line 94: | Line 98: | ||
| Programm kuvab suvalisi CMU-CAM pakette kodulabori ekraanile. Lisaks saab | Programm kuvab suvalisi CMU-CAM pakette kodulabori ekraanile. Lisaks saab | ||
| - | nuppude abil resettida | + | nuppude abil kaamerat |
| ==Kasutamine== | ==Kasutamine== | ||
| Line 104: | Line 108: | ||
| * {{: | * {{: | ||
| + | <code c> | ||
| + | // | ||
| + | // CMU CAM 3 juhtimisega seotud funktsioonid | ||
| + | // 2011 | ||
| + | // Autor: Heiko Pikner | ||
| + | // | ||
| + | |||
| + | #include " | ||
| + | |||
| + | |||
| + | // | ||
| + | // Globaalsed muutujad | ||
| + | // | ||
| + | volatile char str_x[5]; | ||
| + | volatile char str_y[5]; | ||
| + | volatile int8_t packet_received = 0; | ||
| + | int8_t packet_t_typ=0; | ||
| + | int8_t pitcounter =0; | ||
| + | |||
| + | // | ||
| + | // Funktsiooni päised | ||
| + | // | ||
| + | void USART_Transmit(unsigned char); | ||
| + | |||
| + | // | ||
| + | // | ||
| + | // Pakettide tõlgendamine ja andmete töötlemine | ||
| + | // | ||
| + | // | ||
| + | void CMUPacketHandler(unsigned char c) | ||
| + | { | ||
| + | |||
| + | |||
| + | // Paketi tähise järgi T paketi tuvastamine | ||
| + | if(c==0x54) | ||
| + | { | ||
| + | packet_t_typ=1; | ||
| + | |||
| + | } | ||
| + | |||
| + | // Paketist Mx ja My eraldamine. Kumbki võib olla 1-3 kohaline | ||
| + | // number. Numbrid on eraldatud tühikutega. Mx talletatakse str_x massiivi | ||
| + | // ja My str_y massivi. Iga massiivi element on üks number. | ||
| + | if(packet_t_typ ==1) | ||
| + | { | ||
| + | pitcounter++; | ||
| + | |||
| + | |||
| + | if(pitcounter==3) | ||
| + | { | ||
| + | |||
| + | str_x[0]=c; | ||
| + | } | ||
| + | |||
| + | if(pitcounter==4) | ||
| + | { | ||
| + | if(c == 0x20) | ||
| + | { | ||
| + | pitcounter=6; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | |||
| + | str_x[1]=c; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | |||
| + | if(pitcounter == 5) | ||
| + | { | ||
| + | |||
| + | if(c == 0x20) | ||
| + | { | ||
| + | pitcounter=6; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | str_x[2]=c; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | |||
| + | if(pitcounter==7) | ||
| + | { | ||
| + | str_y[0]=c; | ||
| + | |||
| + | } | ||
| + | if((pitcounter==8)&& | ||
| + | { | ||
| + | if(c == 0x20) | ||
| + | { | ||
| + | pitcounter=6; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | str_y[1]=c; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | if((pitcounter==9)&& | ||
| + | { | ||
| + | if(c == 0x20) | ||
| + | { | ||
| + | pitcounter=6; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | |||
| + | str_y[2]=c; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | |||
| + | if(c == 0x0D) | ||
| + | { | ||
| + | packet_t_typ=0; | ||
| + | pitcounter=0; | ||
| + | packet_received = 1; | ||
| + | |||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | // | ||
| + | // | ||
| + | // | ||
| + | // | ||
| + | // | ||
| + | void GetVersion(void) | ||
| + | { | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // | ||
| + | // | ||
| + | // | ||
| + | // | ||
| + | void ResetCam(void) | ||
| + | { | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // | ||
| + | // Alusta valitud värvi trakkimist. Saada mask 'OM 0 3' ja seejärel | ||
| + | // 'TC 184 234 4 54 0 41' | ||
| + | // | ||
| + | // | ||
| + | void StartTracking(void) | ||
| + | { | ||
| + | // Sea mask, et kaamera saadaks ainult Mx ja My koordinaadid | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | |||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | |||
| + | | ||
| + | |||
| + | //Värvi valimiseks on formaat minRed maxRed minGreen maxGreen minBlue maxBlue | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | |||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | |||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | |||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | |||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | |||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | |||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | |||
| + | |||
| + | |||
| + | USART_Transmit(' | ||
| + | USART_Transmit(' | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | #include " | ||
| + | |||
| + | // | ||
| + | //Muutujad, mis on defineeritud mujal | ||
| + | // | ||
| + | |||
| + | extern volatile int8_t packet_received; | ||
| + | |||
| + | extern volatile char str_x[5]; | ||
| + | extern volatile char str_y[5]; | ||
| + | |||
| + | |||
| + | // | ||
| + | //Nuppude viikude valik | ||
| + | // | ||
| + | pin button1 = PIN(C, 0); | ||
| + | pin button2 = PIN(C, 1); | ||
| + | pin button3 = PIN(C, 2); | ||
| + | |||
| + | |||
| + | // | ||
| + | // Seadista süsteem | ||
| + | // | ||
| + | static inline void init() | ||
| + | { | ||
| + | // Seab nupud töökorda | ||
| + | pin_setup_input_with_pullup(button1); | ||
| + | pin_setup_input_with_pullup(button2); | ||
| + | pin_setup_input_with_pullup(button3); | ||
| + | |||
| + | // LCD ekraani algseadistamine | ||
| + | lcd_gfx_init(); | ||
| + | |||
| + | // Ekraani puhastamine | ||
| + | lcd_gfx_clear(); | ||
| + | |||
| + | // Taustavalgustuse tööle lülitamine | ||
| + | lcd_gfx_backlight(true); | ||
| + | |||
| + | // Programmi nime kuvamine | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // Kuva Mx | ||
| + | lcd_gfx_goto_char_xy(0, | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // Kuva My | ||
| + | lcd_gfx_goto_char_xy(0, | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | |||
| + | DDRE = (1<< | ||
| + | |||
| + | // Seriali seadistamine | ||
| + | UsartInit(); | ||
| + | |||
| + | // Katkestuste lubamine | ||
| + | sei(); | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // | ||
| + | //MAIN | ||
| + | // | ||
| + | // | ||
| + | int main(void) | ||
| + | { | ||
| + | unsigned char new_value1, old_value1 = 0, new_value2, | ||
| + | old_value2 = 0, new_value3, old_value3 = 0; | ||
| + | |||
| + | |||
| + | // Seadista süsteem | ||
| + | init(); | ||
| + | |||
| + | |||
| + | while (1) | ||
| + | { | ||
| + | |||
| + | // Loeb nuppude väärtused | ||
| + | new_value1 = pin_get_debounced_value(button1); | ||
| + | new_value2 = pin_get_debounced_value(button2); | ||
| + | new_value3 = pin_get_debounced_value(button3); | ||
| + | |||
| + | // Nupp S1 alla vajutatud | ||
| + | if((!new_value1) && (old_value1)) | ||
| + | { | ||
| + | |||
| + | // Tee midagi | ||
| + | } | ||
| + | |||
| + | // Nupp S2 alla vajutatud | ||
| + | if((!new_value2) && (old_value2)) | ||
| + | { | ||
| + | // Alusta värvi otsimist | ||
| + | StartTracking(); | ||
| + | |||
| + | } | ||
| + | |||
| + | // Nupp S3 alla vajutatud | ||
| + | if((!new_value3) && (old_value3)) | ||
| + | { | ||
| + | // Tee midagi | ||
| + | |||
| + | } | ||
| + | |||
| + | // Jätab eelmised nupuväärtused meelde | ||
| + | old_value1 = new_value1; | ||
| + | old_value2 = new_value2; | ||
| + | old_value3 = new_value3; | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | // Kui pakett on saabunud, kuvab selle sisu ekraanile | ||
| + | if(packet_received == 1) | ||
| + | { | ||
| + | // Vii kursor algusesse | ||
| + | lcd_gfx_goto_char_xy(6, | ||
| + | |||
| + | // Kuva klobaalsest muutujast pakett ja kuva see | ||
| + | lcd_gfx_write_string((char*) & | ||
| + | |||
| + | // Vii kursor algusesse | ||
| + | lcd_gfx_goto_char_xy(6, | ||
| + | |||
| + | // Kuva klobaalsest muutujast pakett ja kuva see | ||
| + | lcd_gfx_write_string((char*) & | ||
| + | |||
| + | |||
| + | |||
| + | // Kustuta vana pakett, ehk täida see tühikutega | ||
| + | memset((char*) &str_x, 0x20, 4); | ||
| + | memset((char*) &str_y, 0x20, 4); | ||
| + | |||
| + | // Nulli paketi saabumist märkiv lipp | ||
| + | packet_received = 0; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||