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 08:27] – 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 47: | Line 48: | ||
| ===== CMUCam3 kaamera kasutamine kodulaboriga ===== | ===== CMUCam3 kaamera kasutamine kodulaboriga ===== | ||
| - | Antud näited on mõeldud kasutama CMUCam3-kaamerat emuleeritud reziimis. See ei nõua kaamera enda programmerimist | + | Antud näited on mõeldud kasutama CMUCam3-kaamerat emuleeritud reziimis. See ei nõua kaamera enda programmeerimist |
| ==== Kodulabori tarkvara ==== | ==== Kodulabori tarkvara ==== | ||
| - | Kodulabori poolne näitekood on tehtud, kasutades nii palju kui võimalik | + | Kodulabori poolne näitekood on tehtud, kasutades nii palju kui võimalik |
| - | Failis CMUCAM.c paiknevad kaameraspetsiifilised funktsioonid. Hetkel on sinna koondatud värvi otsimise ja andmete vastuvõtmiseks vajalik. Kuna erinebaid käskusid | + | Failis CMUCAM.c paiknevad kaameraspetsiifilised funktsioonid. Hetkel on sinna koondatud värvi otsimise ja andmete vastuvõtmiseks vajalik. Kuna erinevaid käskusi |
| 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 68: | 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. | ||
| Line 97: | 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 107: | 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; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | } | ||
| + | </ | ||