This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:vision [2011/11/24 00:15] – Kood v1.0 ja väike selgitus 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> | ||
- | =====Vajalik riistvara===== | ||
- | | + | ===== CMUCam3 kaamera emuleerimine CMUCam2-ena ===== |
- | - Kodulabori kontrollermoodul ATmega2561 | + | |
- | - Kodulabori kommunikatsioonimoodul | + | |
- | - Kodulabori kasutajaliidese moodul | + | |
- | =====Kirjeldus===== | + | ===Vajalik tarkvara ja kirjandus=== |
+ | - [[http:// | ||
+ | - [[http:// | ||
+ | - [[http:// | ||
+ | - [[http:// | ||
+ | - [[http:// | ||
+ | - [[http:// | ||
+ | - [[http:// | ||
- | Programm seadistab CMU kaamera kindla värvi | + | ===Sissejuhatus=== |
+ | |||
+ | CMUCam3 kaamera tarkvara ei toeta lihtsat serial pordi kaudu andmevahetust. Kuna see võimekus oli olemas CMUCam2 kaameral, siis on tehtud ka CMUCam3 jaoks tarkvara, mis emuleerib kaamera eelmist versiooni. Kasutada saab eelmise versiooni CMUcam2GUI liidest ja serial pordi käsklusi. | ||
+ | |||
+ | ===Kaamera seadistamine=== | ||
+ | |||
+ | CMUCam3 kaamera eelmise versiooni emuleerimiseks tuleb alla tõmmata ja installeerida lingil 6 toodud flash utiliit ja lingil 5 toodud hex fail. Peale hex faili kaamerasse laadimist emuleeritaksegi seda kui CMUCam2-te ja edaspidi tuleb kasutada eelmise versiooni jaoks mõeldud GUI-i pildi vaatamiseks. Lisaks on CMUCam2 andmelehel olemas serial käsustik kaameraga suhtlemiseks. Pikem ingliskeelne kirjeldus flashimisest on toodud CMUCam3 kasutusjuhendis lingil 1. | ||
+ | |||
+ | ===CMUCam2 GUI=== | ||
+ | |||
+ | 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. | ||
+ | |||
+ | Üleval ääres on menüü, kust saab erinevaid funktsioone valida, nagu näiteks servode liigutamine. Kaamera pildi vaatamiseks tuleb minna vahelehele " | ||
+ | |||
+ | 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 | ||
+ | |||
+ | Pildil kaks on toodud " | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | 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 ainult numbriline info ja selle järgi midagi kindlaks määrata on võimatu. | ||
+ | |||
+ | ===== CMUCam3 kaamera kasutamine kodulaboriga ===== | ||
+ | |||
+ | Antud näited on mõeldud kasutama CMUCam3-kaamerat emuleeritud reziimis. See ei nõua kaamera enda programmeerimist ja saab keskenduda lihtsamata rakenduste arendamisele Kodulabori moodulitega. Suhtlemine käib, kasutades CMUCam2 juhendis toodud käsustikku. | ||
+ | |||
+ | ==== Kodulabori tarkvara ==== | ||
+ | |||
+ | Kodulabori poolne näitekood on tehtud, kasutades nii palju kui võimalik Kodulabori teeki. Siiski serial liidesest andmete lugemine on kiiruse huvides katkestustepõhine. Tarkvara on jagatud eraldi failideks, millest main.c failis paikneb üldine funktsionaalsus, | ||
+ | |||
+ | Failis CMUCAM.c paiknevad kaameraspetsiifilised funktsioonid. Hetkel on sinna koondatud värvi otsimise ja andmete vastuvõtmiseks vajalik. Kuna erinevaid käskusi on küllaltki palju, siis on seda faili soovitav vastavalt projekti vajadustele täiendada. | ||
+ | |||
+ | 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, | ||
+ | |||
+ | |||
+ | ==== Värvi otsimine ==== | ||
+ | ==Vajalik riistvara== | ||
+ | |||
+ | - CMUCam3 | ||
+ | - Kodulabori Kontrollermoodul ATmega2561 | ||
+ | - Kodulabori Kommunikatsioonimoodul | ||
+ | - Kodulabori Kasutajaliidese moodul | ||
+ | |||
+ | ==Kirjeldus== | ||
+ | |||
+ | 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. |
- | pakette. Paketi | + | |
+ | {{: | ||
+ | |||
+ | Pilt 3. Programm koordinaate kuvamas | ||
+ | |||
+ | ==Kasutamine== | ||
+ | |||
+ | Ühenda moodulid kokku. Lülita kaamera toitelüliti sisse. | ||
+ | Vajutades nupule S2 hakkab kaamera eelseadistatud värvi otsima. Tulemus kuvatakse | ||
+ | ekraanil formaadi Mx ja My. Kus Mx ja My on ümber valitud värvi ala joonistatud | ||
+ | ristküliku keskpunkti koordinaadid. Kui värvi ei nähta kuvatakse nullid. Programm on | ||
+ | seadistatud otsima oranzhi värvi. | ||
+ | |||
+ | * {{: | ||
+ | |||
+ | ==== Lihtne terminal ==== | ||
+ | ==Vajalik riistvara== | ||
+ | |||
+ | - CMUCam3 | ||
+ | - Kodulabori Kontrollermoodul ATmega2561 | ||
+ | - Kodulabori Kommunikatsioonimoodul | ||
+ | - Kodulabori Kasutajaliidese moodul | ||
+ | |||
+ | ==Kirjeldus== | ||
+ | |||
+ | Programm kuvab suvalisi CMU-CAM | ||
+ | nuppude abil kaamerat algväärtustada, | ||
+ | |||
+ | ==Kasutamine== | ||
+ | |||
+ | Ühenda moodulid kokku. Lülita kaamera toitelüliti sisse. | ||
+ | Vajutades nupule S1 kuvatakse kaamera tarkvara versioon. Nupp S2 paneb kaamera | ||
+ | eelseadistatud värvi otsima. Nupp S3 aga resetib kaamera. | ||
+ | |||
+ | * {{: | ||
+ | |||
+ | <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 | ||
+ | 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, | ||
- | =====Kasutamine===== | + | // Kuva klobaalsest muutujast pakett ja kuva see |
+ | lcd_gfx_write_string((char*) & | ||
- | Ühenda moodulid kokku ja ühenda toitejuhtmed. Lülita kaamera toitelüliti sisse. | + | |
- | Nüüd peaks ekraanile tekkima kaamera tarkvara versiooni kood. Vajutades nupule S2 | + | |
- | hakkab kaamera eelseadistatud värvi otsima. Tulemus kuvatakse ekraanil | + | |
- | formaadis T Mx ja My. Kui värvi ei nähta on näha nulle. Programm on | + | |
- | seadistatud otsima oranzhi värvi. Lisaks vajutades nupule S1 kuvatakse | + | |
- | kaamera tarkvara versioon. Vajutades nupule S3 puhastatakse ekraan. Viimane töötab | + | |
- | siis, kui kaamera aktiivselt andmeid ei saada. | + | |
- | | + | // 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; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||