Pixy (3) … sleduji tě, i když uhýbáš

Začneme standardním připojením Pixy k Arduinu. Předpokládá se využití rozhraní SPI, dodávaného kabelu a připravených knihoven.

Nastavení programu PixyMon je výchozí s rozhraním ICSP SPI. Postup připojení k Arduinu je popsán zde, k Raspberry Pi zde a k Beaglebonu zde. SPI propojení dovoluje přenést data o více než 6000 objektech za sekundu, konkrétně o 135 objektech z každého snímku.

pix15Balíček (ZIP) s knihovnami a ukázkovými příklady najdeme zde. Dekomprimujeme ho a přeneseme mezi knihovny. Sériové SPI rozhraní je z hlediska použití velmi podobné rozhraní UART a co bylo minule napsáno o kódech a parametrech, je stejně platné i v tomto případě. Podívejme se na některé z ukázkových příkladů.


První příklad „Hello world“ dělá v podstatě totéž co náš program, ale dělá to mnohem lépe a efektivněji. Sleduje hlavičky snímků a pro každý padesátý (tj. jednou za sekundu) vypíše všechny detekované objekty do sériového terminálu. Délku a náročnost programu asi není třeba nijak komentovat. Když použijeme podobnou scénu jako pro náš program, vypadá to takto:

pix16pix17

Můžeme používat:
 pixy.blocks[i].signature  -  Signatura (číslo barvy) detekovaného objektu (normálně 1 až 7)
 pixy.blocks[i].x - x souřadnice středu objektu (0 až 319)
 pixy.blocks[i].y - y souřadnice středu objektu (0 až 199)
 pixy.blocks[i].width - šířka detekovaného objektu (1 až 320)
 pixy.blocks[i].height - výška detekovaného objektu (1 až 200)
 pixy.blocks[i].angle - úhel natočení pro barevný kód
 pixy.blocks[i].print() - uživatelská funkce pro výpis objektu do sériového terminálu

Příklad „LED_cycle“ ukazuje ovládání LED přes SPI rozhraní, k dispozici máme funkci

pixy.setLED(r, g, b)

která nastaví požadovaný svit LED ve všech barevných složkách.


Příklad „Servo_move“ nás posouvá k poslední důležité funkci, kterou Pixy má. Přímo na modulu kamery jsou dva konektory pro připojení modelářských serv. Počítá se s tím, že půjde spíše o mikroserva. Je to důležité také proto, že Pixy nemůže napájet serva s vyšší spotřebou, může je ovládat servopulzy, ale muselo by se oddělit napájení serv od kamery. Serva mohou natáčet pomocí dvouosého mechanizmu kamerou a dovolit jí, aby sledovala pohyb detekovaného objektu horizontálně i vertikálně. Jak mechanizmus vypadá je podrobněji zobrazeno třeba zde.

servokonV nejjednodušší podobě může být kamera natáčena zcela bez účasti nadřízeného mikrokontroléru. To ale nestačí, je také potřeba, aby měl kontrolér možnost serva ovládat a „rozhlédnout“ se kamerou po okolí. Vrátíme se tedy k povelům a doplníme si povel 0xff00 následovaný dvěma šestnáctibitovými slovy, první udává natočení serva ve vodorovném směru (x – servo 0), druhé natočení serva ve svislém směru (y – servo 1). Stejně jako v ostatních případech se vysílají vždy nejprve nižší byty a pak vyšší z každého slova. Takto můžeme ovládat serva třeba z PICAXE nebo libovolného jiného mikrokontroléru a postačí spojení přes UART.

Budeme-li využívat knihovny pro Arduino, máme k dispozici funkci

pixy.setServos(x, y) ,

která nastavení serv zařídí.

Příklad „Servo_move“ nedělá nic jiného, než že pohybuje oběma servy v celém rozsahu od meze k mezi. Je nutné pohlídat, aby servo při pohybu nenaráželo na mechanické dorazy, rozsah parametru je 0 až 1000, střední poloha odpovídá číslu 500.


Příklad „Pantilt“ spojuje v sobě čtení obrazu Arduinem respektive čtení údajů o poloze objektů a ovládání serv natáčejících kameru. Jeho úlohou je sledovat objekt tak, aby byl pokud možno uprostřed zorného pole. Jestliže definujeme více různě barevných objektů a každý z nich bude viděn vícekrát, bude kamera sledovat objekt s nejnižší signaturou, je-li jich víc, pak ten největší z nich.


K tomu, aby kamera sledovala pohyb objektu stejným způsobem jako v ukázkovém příkladu ale vůbec není potřeba Arduino nebo jakýkoli jiný řídící mikrokontrolér. Kamera Pixy má tuto efektní funkci sledování objektů zabudovanou v sobě a dá se využít, aniž by byla připojena k počítači, stačí, je-li napájena.

Budeme-li využívat samostatné sledování objektu kamerou Pixy, je potřeba nastavit některé další parametry v programu PixyMon. Jsou to jednak krajní polohy obou serv podle mechanických možností, jednak frekvence servopulzů. Standardně jsou serva konstruována na frekvenci pulzů 50 Hz. Rozsah nastavení je od 20 Hz do 300 Hz. Nižší frekvenci než 50 Hz má smysl nastavit jen výjimečně, podstatně sníží moment (analogového) serva a částečně ho ochrání, pokud by naráželo na dorazy. Vyšší frekvence má smysl nastavit kvůli rychlejší odezvě serva na ovládání, ovšem servo musí být takové rychlosti přizpůsobeno z výroby.

pix18Další série parametrů je v nabídce Pan/tilt demo. Poloha kamery je v závislosti na poloze objektu ovládaná PID (respektive PD) regulátorem a zde nastavujeme jeho parametry, P parametry odpovídají proporcionálnímu koeficientu („zesílení“) odchylky skutečné polohy a požadované, D parametry odpovídají koeficientu derivačnímu, čili zvyšujícímu rychlost dorovnání po rychlé změně. Nastavením těchto koeficientů bychom měli dosáhnout pro danou mechaniku a serva toho, aby se poloha dorovnávala rychle, ale bez zákmitů.

pix19Samozřejmě se předpokládá, že kamera má naučenou nejméně jednu barvu předmětu, je-li jich víc, pak se chová trochu jinak, sleduje ten největší. Nakonec už jen zbývá zapnout funkci „Run pan/tilt demo“ v menu Action. Nastavení si samozřejmě kamera pamatuje a sleduje objekty zcela samostatně.