Robot Pepa 2 spolupracuje s Baltikem

Robot je skvělá zábava i pro mého 7mi letého syna. Visual Basic ještě neumí – ten MS má tak uživatelsky nepřátelský software :-)! Rozhodl jsem se proto zpřístupnit alespoň část možností robota Pepy 2 i jemu prostřednictvím vynikajícího dětského programovacího jazyka Baltík z SGP.

Nejprve bylo nutné vyřešit jak řídit prostřednictvím Baltika jednotlivá serva. SGP má v nabídce dva hlavní produkty. Baltíka a Baltazara. Baltík je grafický programovací jazyk pro malé děti. Baltazar pro velké. Bohužel Baltík, na rozdíl od Batazara, neumožňuje obsluhu počítačových portů. Musel jsem proto tento problém nějak obejít. Využil jsem vlastnosti Baltíka spouštět externí programy s parametry a napsal malý prográmek, který dokáže „přehrát“ datový soubor s informacemi o pohybech jednotlivých serv a tak rozpohybovat Robota.
Datový soubor je jednoduchý textový soubor formátu csv s následující strukturou. Stejnou strukturu využívá i exportní funkce mého animatronického softwaru VSA o kterém jsem psal minule. Proto se nyní v Baltíkovi dají přehrát i pohyby naeditované ve VSA. Tak zpět k té struktuře.
Příklad takového souboru najdete zde.
Soubor csv pouzívá čárku jako oddělovače. Například pokud chcete nastavit všechna serva (například pro 8 serv) na jejich výchozí polohu (dejme tomu na polohu 127), první řádek tohoto souboru bude vypadat takto:

127,127,127,127,127,127,127,127,

Tedy první pozice určuje příkaz pro servo č. 0, druhá pozice pro servo č. 1 atd.
Můj přehrávač pošle podle tohoto klíče najednou příkazy polohy 127 pro 8 serv označené 0-7.
Na další řádek můžete napsad další sekvenci poloh. Pokud chcete aby servo zůstalo v klidu prostě napíšete stejnou polohu, jakou mělo servo v předchozí sekvenci. Například pokud chceme servo č. 1 dostat na polohu 220 a servo č.5 na polohu 45, napíšeme do csv souboru následující sekvence.

127,127,127,127,127,127,127,127, (výchozí poloha serv)
127,220,127,127,45,127,127,127, (nová poloha serv)

Takto se serva č. 1 a č. 5 dostanou na nové polohy a ostatní se nepohnou.

Přesunutí serva z jedné polohy vyžaduje určitý čas. Rychlost přenosu dat je vyšší než rychlost s jakou serva mohou jednotlivé příkazy reálně vykonat. Proto jedním z parametrů při spouštění mého přehrávače je i refresh. Tedy čas s jakým dochází k prodlení mezi jednotlivými sekvencemi.
Export dat z VSA má jeden z přednastavených refresh časů 33 mS. Tento také využívám i já. Vy si však můžete v parametru nastavit svůj vlastní. Znamená to , že mezi sekvencemi příkazů, které jsou odeslány počítačem na servokontrolér je pauza právě velikosti např. těch 33 mS.
Toto nám umožuje nasimulovat pomalý přesun (pohyb) jednotlivých serv. Normálně do serva pošleme polohu např. 127 a následně např. 202. Servo se v okamžiku odeslání příkazu pro novou polohu do této polohy přemístí svou maximální rychlostí. Bzzz a je tam. Pokud chcete aby se pohyb děl pomalu, rozfázujte pohyb v jednotlivých sekvencích. Chcete-li aby se servo č. 0 dostalo z polohy 127 do polohy 202 za 5 vteřin, spočteme nejprve jednotlivé fáze.
Určeme si refresh (dá se nastavit pro celý soubor jen jeden) např. našich 33 mS. To znamená, že máme v 5 vteřinách asi 150 sekvencí k disposici. Bude to 151 řádků datového souboru včetně výchozího. Potřebujeme se ve 150 sekvencích dostat z polohy 127 do polohy 202 (aby se to lépe počítalo). Tedy 75 změn.
Soubor tedy bude mít 151 řádek (první výchozí) a na každém druhém řádku bude poloha daného serva zvednuta o 1 polohový dílek.
Pro servo č. 0 to tedy bude:
127,127,127,127,127,127,127,127, (výchozí poloha serv)
127,127,127,127,127,127,127,127,
128,127,127,127,127,127,127,127,
128,127,127,127,127,127,127,127,
129,127,127,127,127,127,127,127,
129,127,127,127,127,127,127,127,
130,127,127,127,127,127,127,127,
130,127,127,127,127,127,127,127,
atd.
Složité? Více snad pochopíte z okomentovaného zdrojového kódu mého přehrávače. Tedy až ho okomentuji tak ho vystavím :-).

Přehrávač se pak spouští následovně:
moverfile.exe/1/9600/polohy.csv/33 kde, první parametr za lomítem značí číslo comm portu na kterém je servokontrolér připojen, druhý parametr značí baudrate portu se jakým má být port otevřen, třetí parametr značí název našeho souboru s daty o polohách jednotlivých serv a čtvrtý parametr uvádí refresh čas v milisekundách. Název souboru může být uveden bez cesty k němu, pokud je zdrojový soubor ve stejném adresáři jako můj přehrávač.
V Baltíkovi pak můžeme takovýto soubor s parametry rovnou spustit. Před tím datový soubor můžeme také rovnou v Baltíkovi sami zeditovat. Jedná se přeci o jednoduchý textový soubor!.
Příklad můžete najít třeba zde.

Dále možnosti Baltíka spouštět asociované soubory jsme využili k použití free utilitky (již mnohokrát zde zmiňované) Lector, která převádí psaný text na hlas pomocí hlasové syntézy. Pro majitele licence, již také zmiňovaného systému, CS Voice (Frog Systems) napíši podobnou utilitku. Časem se určitě zmíním o dalších systémech hlasové sysntézy.

Větší možnosti nabízí druhý produkt SGP a to Baltazar. ten umožňuje přímo řídit jednotlivé porty PC a tak je možné napsat ovládácí program robota bez použití mého přehrávače. Baltazar je však pro mého synka zatím příliš složitý a tak jsem se jím zatím nezabýval.

Přilkádám odkaz na soubor Test, kde najdete zazipované následující soubory:
Lector.exe – je freeware prográmek pro převod textu na hlas
zdroj.csv – je textový soubor s příkladem pohybů pro 8 serv (čísla 0-7)
moverfile.exe – je moje freeware utilita pro přehrávání datového souboru *.csv
mover.dll – je freeware knihovna pro moverfile.exe
robot_pepa.bpr – je soubor pro Baltíka, kde je ukázáno jak s aplikacemi v Baltíkovi pracovat
readme.txt – krátky pokyn pro instalaci Lectora
hlas.lct – zdrojový textový soubor pro Lectora.