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:10] – 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. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Pilt 3. Programm koordinaate kuvamas | ||
==Kasutamine== | ==Kasutamine== | ||
Line 93: | 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 103: | 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; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||