20
R O B O T M A T Y L D A návod sestavení robotika kybernetika programování _____________________________ OpenTechLab Jablonec nad Nisou

R O B O T M A T Y L D A - ByznysWeb.cz

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

R O B O T M A T Y L D A

návod

sestavenírobotika

kybernetikaprogramování

_____________________________OpenTechLab Jablonec nad Nisou

Úvodem

Dobrý den, ahoj, srdečně Vás vítáme v Matyldí komunitě. Nepropadejte panice, jdeme stavět roboty :-)

Provedeme Vás krok za krokem sestavením robota Matyldy, zasvětíme Vás do tajů robotiky, kybernetiky i programování. Tak opravdu poznáte, k čemu je a jak funguje každá součástka.

Obav netřeba, tato příručka si klade za cíl, být vaším spolehlivým a pečlivým průvodcem. Společně se naučíme základům. Ukážeme si, kde, jak a proč se obory robotiky, kybernetiky a programování spolu prolínají - na vlastní hlavu a ruce s Matyldou.

Kladli jsme si za cíl, umožnit proniknout do světa robotů těm nejmladším. Proto mnohdy zachází příručka do velkých podrobností. Zkušenější čtenář nechť je tolerantní a znalosti si osvěží nebo příslušné pasáže vynechá ;-)

Součástí příručky je SD karta s programy pro Matyldu. Najdete tam programy výukové, zmíněné v příručce i další nástroje. Protože se ale malé nosiče rádi ztrácejí, doporučujeme Vám překopírovat obsah disku také do počítače.

Těšíme se na Vás na webu matyldí komunity: www.robot-matylda.cz. Můžete tam najít další inspiraci pro svou tvorbu, pochlubit se svými programy (a určitě jich bude hodně), poradit se v diskusním fóru, či si stáhnout / nahrát různé Matyldí 3D modely k tisku.

Už se moc těšíme, co všechno s Matyldou dokážete :-)

Vaši Radka a Michal

Robot Matyldarobotická, humanoidní platformaod OpenTechLab Jablonec nad NisouPLATINUM SEVEN s. r. o.www.robot-matylda.cz tel.: 776 491 900

1. KAPITOLA – SESTAVUJEME MATYLDU1.1. SERVOMOTOR

Pohyb Matyldy zajišťují servomotory, zkráceně serva. Servo je typ pohonu, u kterého lze nastavit přesnou polohu natočení osy rotoru.Síla servomotorů se tedy neurčuje v jednotkách výkonu (Watt), jak je tomu obvyklé u běžných motorů, ale dle jejich kroutícího momentu. Na příkad síla velkých serv v Matyldě je 14,5 kg/cm. To znamená, že servo na páce, dlouhé 1 cm, uzvedne břemeno o váze 14,5 kg. S delší pákou klesá síla serva geometricky. Na 2 cm páce již bude servo schopno

unést pouze 7,75 kg a na páce 4 cm jen 3,875 kg.

Jak servo pracuje

Servopohony se skládají ze čtyř částí. První částí je motor (v našem případě elektromotor). Druhou částí je převodovka, třetí snímač (v našem případě potenciometr) a čtvrtou částí je řídící obvod.

Je třeba si uvědomit, že servomotor se netočí kolem dokola, ale pracuje v úhlovém rozpětí, zpravidla 0° až 180°.

Mezi elektromotorem a hřídelí serva je osazena převodovka. Převodový poměrozubeného soukolí převodovky určuje dvě vlastnosti serva. První je síla serva a druhou je rychlost otáčení serva. Na převodovce je také umístěn snímač polohy. Ten dává řídící jednotce informaci, v jaké úhlové poloze se nachází.Abychom mohli servo řádně ovládat, je třeba zaslat mu informaci o úhlové poloze, do níž chceme servo nastavit. Proto má servo tři vodiče. První dva (zpravidla červený a hnědý) slouží pro přívod napájecího proudu. Třetí vodič je signální. Signálním vodičem je servo ovládáno. Děje se to tak, že z ovládací jednotky (v našem případě Arduina) vysíláme signál v podobě elektrického pulsu. Nejkratší puls bude pro servo znamenat úhel 0°, nejdelší pak úhel 180°. Pozor, mnoho servomotorů má tendenci v krajních polohách kmitat, proto v praxi často užíváme úhlové rozpětí 2° až 178°.

motor

Snímač polohy

převodovka

řídící obvod

1.1.2. VOLBA SERVA JAKO POHONU ROBOTA

S ohledem na způsob řízení jsou servomotory předurčeny k pohonu pohybu v robotice. Jdou snadno programovat, jednoduše aplikovat a jsou rychlé.Naproti tomu mají i své nevýhody, jako nedostatečnou citlivost a mnohdy i nedostatečnou přesnost. To je třeba při konstrukci i programování robota brát do úvahy.

Oba typy servomotorů, které jsme vybrali k použití v Matyldě, lez napájet napětím v rozsahu 4,7 VDC až 7,2 VDC (V = napětí, DC = stejnosměrný proud). Čím větší napětí, tím větší síla serv. Doporučujeme Vám k napájení servomotorů Matyldy využít napětí 6 VDC, pro autonomní chůzi pak 6,5 VDC až 7 VDC.

K ovládání páky (dejme ku příkladu ohyb paže v lokti) lze obecně použít tři druhy základního využití serva. Podívejte se na obrázek:

A: Přímé ovládání B: Kulisové ovládání C: Kulisové ovládání páky jednostranné oboustranné

1.1.3. PŘÍMÉ OVLÁDÁNÍ PÁKY

Jak je z obrázku A patrné, v tomto případě je kloub páky, tedy loket, tvořen přímo servomotorem. Výhodou je převod pohybu 1:1, čili vzájemné otáčení serva a páky, jsou ve shodě. Nevýhodou je fakt, že vlastní kloubje tvořen uložením a ložisky hřídele serva. To má vliv nejen na životnost servomotoru, ale i na stabilitu kloubu jako takového. Proto je vhodné tento typ konstrukce osadit samostatným kloubem se vsazeným servem (stejně, jako má na loktech Matylda).

1.1.4. KULISOVÉ OVLÁDÁNÍ JEDNOSTRANNÉ

Tento typ využití servomotoru se snaží o simulaci funkce lidského bicepsu, kdy kulisa (na obrázku žlutě) funguje jako šlacha a servo jako sval. Vzájemný pohyb serva a páky při této konstrukci je ve většině případů v nepoměru a tedy vzniká úhlový posun mezi servomotorem a pákou. To činí programování poněkud složitější, musí se využívat převodový můstek.Také je třeba si uvědomit, že takto vytvořený pohon kloubu páky má silové využití obvykle pouze v jednom směru, v tomto případě tah. Servo sice může vyvíjet na páku přes kulisu i tlak, silový výkon je však v tomto směru omezen pevností kulisy a je třeba toto brát při konstrukci v úvahu.

1.1.5. KULISOVÉ OVLÁDÁNÍ OBOUSTRANNÉ

Třetím typem je situace, kdy jedno servo simuluje tah bicepsového i tlak tricepsového svalu zároveň. Převod kulisami mezi servomotorem a pákou je v poměru 1:1.Konstrukční nevýhodou, stejně jako u 1.1.4. - kulisové ovládání jednostranné, je podstatně zvýšené namáhání uložení hřídele servomotoru o tah (tlak) kulis. To lze kompenzovat osazením samostatného uložení kulisy, které toto namáhání převezme a servo je pak namáháno pouze ve smyku.

1.1.6. SERVOMOTORY V MATYLDĚ A PRÁCE S NIMI(obsahuje praktickou část)

Tato kapitola bude ryze praktická. Než se spolu pustíme do stavění Matyldy, je potřeba všechny servomotory nastavit do správné polohy. Dbejte, provést tento krok velmi pečlivě. Pokud nastavení servomotorů provedete nesprávně, budete mít veliké komplikace při pozdějším programování. Jak tedy na to? Nejprve instalujte programovací rozhraní pro Arduino. Jak na to, se dovíte v pokynech pro instalaci. Dále vezměte obsah balení krabičky A:

1 x Arduino UNO3 x pokusný vodič

Další součástkou k zapojení bude vždy ten ze servomotorů, který budeme seřizovat. Nejprve zapojte součástky do obvodu podle následujícího obrázku:

Propojování provádějte pomocí pokusných vodičů.Hnědý vodič serva zapojte do Arduina na zem (gnd). Červený vodič serva zapojte do Arduina na 5V.Oranžový vodič serva zapojte do Arduina na digitální pin č. 9. Tento pin nám bude vysílat signál do servomotoru, určující úhel otočení hřídele serva.

Nikdy takto přímo na Arduino nepřipojujte více, než jeden servomotor a ten nepodrobujte zátěži. Může dojít ke zničení Arduina.

Pokud je obvod sestaven, otevřete v počítači ArduinoIDE. V horním menu zvolte Soubor/otevřít nebo použijte klávesovou zkratku Ctrl+O. Vyberte soubor s názvem „sketch_serizeni_serva.ino,“ umístěný v adresáři Sketche/servo na SD kartě a otevřete.

V IDE uvidíte tento kód:

#include <Servo.h> //do programu je zahrnuta knihovna pro ovládání servomotorů

Servo servo; //Pojmenováváme servomotor jako servo

void setup() { servo.attach(9); //ovládání serva na pinu 9}

void loop() { servo.write(0); //do závorky vložte úhel 0 – 180°}

Tento program nám bude ovládat připojené servo. Ačkoli se k samotnému programování dostaneme později, bude dobré si již nyní program trochu rozebrat.

Každý Arduino program (sketch) se skládá ze dvou částí. První je část setup, která začíná za příkazem:

void setup()

Tato část programu se načte pouze jednou a to při spuštění Arduina nebo jeho resetu. Zpravidla obsahuje instrukce kde je co a jak připojené, zavádí se zde proměnné apod.Druhá část je loop, která začíná příkazem:

void loop()

Tato část programu běží ve smyčce stále dokola ihned po načtení části setup. Sem se zapisují samotné instrukce programu.

Jistě jste si však všimli i toho, že má program nějaké instrukce zapsány ještě před příkazem pro setup. Tyto instrukce se týkají zaváděcích informací pro tvorbu programu. Například definice názvů pinů, pokud je chcete pro program pojmenovat nebo zavádění tzv. knihoven programů, jako v našem případě. Výhodou Arduina je, že může používat knihovny s ovladači pro jednotlivé modulární komponenty, které k Arduinu připojujete. Vlastní programování je tak výrazně snazší.Knihovna se do sketche přidá podle následujícího postupu: Vyberte v hlavní nabídce záložku Projekt/Přidat knihovnu. Zde se Vám rozbalí nabídka předinstalovaných knihoven. Na vybranou (v našem případě knihovnu pro servo) pak stačí kliknout a zavedení knihovny je hotovo. V prvním řádku programu se Vám objeví:

#include <Servo.h> (čili: Zahrnuje knihovnu s názvem Servo.h)

Tato knihovna v sobě zahrnuje všechny potřebné instrukce pro Arduino, aby bylo lze servo ve sketchi ovládat pomocí jediného příkazu – uvedení hodnoty ° úhlu, do kterého se má servomotor otočit.Ještě před vyvoláním procedury setup obsahuje program jeden příkaz:

Servo servo;(čili: Pojem Servo, jak je zaveden v knihovně, budeme ve sketchi nazývat servo)

Ten souvisí s knihovnou, proto je zpravidla uveden před procedurou setup, ale je

možné tento příkaz dát místo toho přímo do procedury setup. Nic se nestane, program bude pracovat úplně stejně. V tomto případě jde o programátorovu vůli a pocit přehlednosti.

V samotné části setup zavádíme Arduinu informaci, kde je k němu připojen ovládací vodič servomotoru:

servo.attach(9);(čili: Servo je připojeno na pin č. 9)

Nyní již má Arduino zavedené všechny potřebné informace k ovládání připojeného servomotoru a může začít se servem vykonávat příkazy. Tyto příkazy se zavádějí do části programu loop.Zde vidíme v programu následující kód:

servo.write(0);(čili: Sevomotor otoč do polohy úhlu 0°)

Tím říkáme Arduinu, jaký úhel otočení serva po něm požadujeme. V tomto případě úhel 0°. Po nahrání programu do Arduina se tak připojené servo otočí do své mezní polohy na jedné straně.Pokud do závorky na místo hodnoty „0“ zapíšeme hodnotu „180“ a opět nahrajeme do Arduina takto pozměněný program, servo se otočí do své mezní polohy na druhé straně (o 180°). Takto můžeme zapsat libovolné číslo od 0°až po 180°.

Nyní program nahrajeme do Arduina. Připojíme k počítači Arduino pomocí USB kabelu. V hlavním menu IDE vybereme nejdříve správnou desku: Nástroje/Vývojová deska/Arduino UNO. Tím IDE ví, s jakým procesorem má pracovat.Dále je potřeba navolit USB port, ke kterému je Arduino připojeno. V hlavním menu IDE vybereme: Nástroje/Port a zvolíme z nabídky příslušný port (např. COM 5).Pak již stačí sketch kompilovat a nahrát. To provedeme prostřednictvím nabídky: Projekt/Nahrát nebo za použití klávesové zkratky Ctrl+U. Pokud jsme správně zvolili vývojovou desku a platný port, program projde kompilací a nahraje se do Arduina. V tu chvíli se připojené servo otočí do mezní polohy 0°.

Matylda má většinu servomotorů použitých k přímému ovládání páky. Výjimku tvoří servomotor k ovládání rotace svislé osy hlavy a svislé osy těla. V těchto případech servomotory pohání převodovku z ozubených kol:

Aby bylo možné servomotory Matyldy a tedy pohyby celé Matyldy snadněji programovat a také s ohledem na kompatibilitu demo programů i programů třetích osob, je třeba před samotnou montáží jednotlivá serva nastavit do výchozí montážní polohy.K nastavení servomotorů použijte výše uvedený sketch sketch_serizeni_serva.ino. Hodnoty výchozích montážních poloh pro jednotlivé servomotory naleznete v tabulce Výchozí hodnoty servomotorů. Tu naleznete v balení se servy.

3. KAPITOLA – KYBERNETIKA A ROBOTIKA3.1. ÚVOD DO KYBERNETIKY

Kybernetika velmi úzce souvisí s robotikou. Jako věda je založena na poznatku, že některé procesy, probíhající v živých organismech, lze popsat stejnými matematickými rovnicemi, jako obdobné procesy v technických zařízeních. Jinými slovy – stroje mohou být řízeny stejným způsobem, jako analogické přírodní procesy a právě toto kybernetika zkoumá.

Ačkoli každá definice zní velmi složitě, není třeba se obávat. Matylda Vám pomůže do tajů kybernetiky hladce proniknout. Zatím jsme s Matyldou pronikli do tajů ovládání její mechaniky. Naučili jsme jí splnit předem danou sérii příkazů v daném sledu. Nyní je na čase začít pracovat na tom, aby byla Matylda chytrá. K tomu buďte „malými“ badateli a mějte hlavy otevřené klásti sobě správných otázek :-)

3.2. SLUCH – MATYLDA REAGUJE NA ZVUK3.2.1. NEJDŘÍVE NĚCO O ZVUKU

Zvuk je mechanická (tlaková) vlna, šířící se v prostředí látky. Nám slyšitelné spektrum, tedy to, o čem můžeme říci, že slyšíme, je pouze malá část existujícího spektra (o frekvenci přibližně 16 Hz – 20 000 Hz).Co je frekvence? Je to jedna ze dvou vlnových charakteristik. Podívejte se na obrázek:

Protože je zvuk mechanickou vlnou, bude výsledkem grafického zaznamenání amplitudy vlny v čase takováto křivka (červeně). Amplituda je tedy výška vlny (výkon/energie), nám známá pod pojmem hlasitost. Naproti tomu frekvence je obrazem rychlosti kmitání vlny

mezi horní a dolní apmlitudou v čase. Pro frekvenci obecně používáme v soustavě SI jednotku Hz (Hertz). 1 Hz vyjadřuje počet kmitů vlny za 1 s. Náš mozek nám frekvenci interpretuje jako výšku tónu. Tón o frekvenci 16 Hz je velmi hluboký, naproti 16 000 Hz (16 kHz) označujeme za velmi vysoký pískot. V případě zvuku je tedy velikost amplitudy projevem hlasitosti, frekvence je projevem výšky tónu.

3.2.2. SENZORY A SIGNÁL

Jak lidský mozek pozná, odkud vychází zvuk? Může za to jeho pár uší a znalost, že hlasitost zvuku s rostoucí vzdáleností od zdroje klesá a také z patřičného fázového posunu frekvence. Tak ucho, které je od zdroje zvuku dál, vnímá zvuk méně hlasitě a s určitým zpožděním, než ucho, které je zdroji zvuku blíže.

Jak jsme si popsali, zvuk je vibrací (vlněním). Sluch nám zprostředkovávají vibrující molekuly vzduchu, které interagují s ušním bubínkem nebo – v našem případě - membránou mikrofonu. Mikrofon je elektrotechnická součástka, která ve své podstatě kopíruje činnost lidského ucha. Pojďme si popsat, jak funguje.Mikrofon se skládá ze tří hlavních součástí:– membrána– permanentní magnet– cívka z měděného drátuMembrána je tenká a lehká blána, na kterou příchozí zvuk přenese své kmitání. Ke středu membrány je připevněn permanentní magnet, který se rozkmitá vždy

společně s membránou. Permentní magnet se nachází volně uvnitř cívky. Pokud je magnet uvnitř cívky v pohybu (v našem případě rozkmitán membránou), generuje se v cívce příslušným způsobem elektrické napětí. Z konců vodiče cívky tak získáme

elektrický signál. Zobrazením tohoto signálu získáváme informace o amplitudě i frekvenci, které lze dále zpracovat.

Za prvé tu je amplituda, se kterou lze pracovat samostatně. V takovém případě využijeme pravidla, že v prostoru, s rostoucí vzdáleností od zdroje, hlasitost zvuku klesá. Pokud klesá hlasitost zvuku, klesá i amplituda vlny signálu.

Za druhé zde je frekvence a její fázový posun. Ke vzdálenějšímu mikrofonu bude zvuku trvat cesta déle a tak bude vzdálenější mikrofon přijímat signál s určitým zpožděním oproti mikrofonu bližšímu.

Zaměřme se nejprve na zjištění, nakolik jsou naše senzory (mikrofony) citlivé pro detekci rozdílu v amplitudě a nakolik jsme schopní senzory snímat, uchovávat signál a porovnávat jeho fázový posuv.Jak jsme si říkali v kapitole 2.1.1., Adrduino je mikrokontrolér s velmi omezenou pamětí (32 KB flash, 2 KB SRAM, 1 KB EEPROM) a jeho procesor pracuje na frekvenci 16 MHz.Vzhledem k tomu, že rozdíl fázového posuvu bude v nanosekundách, nelze s Arduinem operace počítání fázového posunu při různé vzdálenosti od zdroje vůbec provádět.Naproti tomu analogové mikrofony, instalované v Matyldě jsou dostatečně citlivé, aby bylo lze zachytit a změřit velikost amplitudy a porovnat. Takovou operaci již Arduino zvládne.

Citlivost rozlišení obou mikrofonů za tímto účelem můžete také výrazně zvýšit způsobem konstrukce robota. Tedy jak a kde budou senzory v robotovi umístěny.Zamysleme se. Za jakých okolností předá zvuková vlna membráně mikrofonu nejvíce energie? Tehdy, dopadá-li na membránu v kolmém směru.

Na obrázku vidíme situaci, kdy je jeden mikrofon nasměrován kolmo ke zdroji zvuku, druhý zrcadlově kolmo od zdroje zvuku.Je zřejmé, že první mikrofon přijímá signál přímo od zdroje, zatím co druhý mikrofon přijímá až signál odražený. Rozdíl mezi velikostí amplitudy zvuku, zaznamenaného prvním mikrofonem, a velikostí amplitudy zvuku, zaznamenaného

druhým, bude dostatečně velký, aby jej zaznamenal i obyčejný mikrofon. Toho využívá i konstrukce Matyldy.

Matylda má zvukové senzory (mikrofony) uložené po stranách hlavy, jeden je směrován vpravo a druhý vlevo.

Umístění mikrofonů na hlavě nám zjednodušuje práci s detekcí a zjištěním směru zvuku, aniž by bylo nutné hýbat s celým tělem robota. Postačí rotace hlavy.

3.2.3. ZPRACOVÁNÍ SIGNÁLU A OPERACE S NÍM

Jak ale výše uvedené poznatky přetvořit ve funkční program? Nejlépe je najít způsob, jak se vyhnout složitým výpočtům. K dosažení požadovaného výsledku totiž nejsou vůbec potřeba. Postačí zavést tyto premisy:

1) pokud detekuje pravý mikrofon vyšší hlasitost zvuku, než levý, zdroj zvuku je vpravo,2) pokud detekuje levý mikrofon vyšší hlasitost zvuku, než pravý, zdroj zvuku je vlevo,3) pokud detekují oba mikrofony stejnou hlasitost (amplituda je shodná), zvuk je vpředu.

Signál z mikrofonů jde zpracovat podle těchto premis za využití programování podmínky:

Pokud je parametr pravda, udělej činnost_1, jinak udělej činnost_2

Pokud použijeme podmínku, říkáme, že se program větví. Podmínky mohou být různě rozšiřovány:

• Pokud je parametr například kladné číslo a zároveň například celé číslo, udělej činnost_1, jinak udělej činnost_2

• Pokud je parametr hodnota 1 a nebo hodnota 2, udělej činnost_1, jinak udělej činnost_2

nebo řetězeny:• Pokud je parametr hodnota 1, udělej činnost_1, jinak pokud je parametr

hodnota 2, udělej činnost_2, jinak pokud je parametr hodnota 3, udělej činnost_3, jinak udělej činnost_4

Pojďme najít způsob, jak za pomoci podmínek vytvořit proces uslyšet, vyhodnotit, provést příslušnou operaci.

První, co tvůrce programu napadne, je zjednodušená vize, ve které si stanoví úkony a postupy s nimi:

1. porovnej amplitudy signálů z pravého a levého mikrofonu2. výsledek vyhodnoť jako zvuk je více vpravo, zvuk je více vlevo, zvuk je rovně3. Pokud je zvuk více vpravo, otoč servo o 1° vpravo, jinak pokud je zvuk více vlevo,

otoč servo o 1° vlevo, jinak servo neotáčej4. toto prováděj ve smyčce stále dokola

První úkol je tedy porovnat amplitudy signálů z levého a pravého mikrofonu. Podívejme se na úskalí, která při jeho řešení musíme překonat.

Nejprve se vraťme k tomu, jak pracuje mikrofon. Signál je generován prostřednictvím elektromagnetické indukce. V cívce vzniká napětí tak, jak jí prochází magnetické jádro, rozpohybované membránou, ovlivněnou energií dopadajícího zvuku. Uvědomíme-li si velikost energie zvukových vln, s jakou mikrofony pracují, pak se stává zřejmým, že právě senzor bude prvním úskalím. Vysvětlíme si proč. Analogový vstup je ve své podstatě napěťový senzor. Arduino v Matyldě pracuje s vstupními hodnotami 0 VDC - 5VDC. Tyto hodnoty Arduino převádí na celá čísla 0 až 1023, kdy 0 je 0 VDC a 1023 je 5 VDC. Již samotná výroba mikrofonu se bude potýkat s jistou nepřesností. Jiný, výrazněji ovlivňující faktor je třeba přesnost usazení senzorů v hlavě Matyldy atd. V důsledku tak nikdy nebude signál ze dvou různých mikrofonů na stejný podnět stejně silný. Senzory na Matyldě sice umožňují kompenzaci citlivosti, ale ani pečlivým laděním nelze dosáhnout trvalého sladění.

Lze si udělat pokus, ve kterém zjistíme rozdíl v citlivosti obou mikrofonů a zároveň provedeme jejich nastavení. Ostatně nabyté poznatky jistě využijete při mapování jakýchkoli analogových senzorů.

K testu bude potřeba zajistit si vhodný generátor zvuku. Využijeme chytrý telefon a ve svém obchodu s aplikacemi vyhledáme aplikaci generátor zvuku. Vhodná aplikace dovede generovat stabilní tón a umožňuje upravovat jeho frekvenci i amplitudu.

Připojte Arduino s mikrofony k ArduinoIDE a otevřete sketch analog_senzor_tester.ino, který najdete na SD kartě v adresáři Kybernetika/Nástroje. Nahrajte sketch do Arduina a otevřete sériový monitor. V sériovém monitoru vidíte dva sloupce se signály obou mikrofonů. Umístěte reproduktory telefonu do shodné vzdálenosti vůči oběma mikrofonům a zapněte generátor zvuku.

Nyní se můžete pokusit pomocí trimmerů na senzorech mikrofony vyladit tak, aby měly oba stabilně shodné hodnoty signálu v čase.

Při pokusu si můžete všimnout, že i když se přes snahu podaří trimmery dosáhnout shody v signálu, časem nastává opět jistá disharmonie. Zanechte mikrofony vyladěny do nejlepší možné shody, upevněte je

zpět do hlavy Matyldy a odpojte Arduino od počítače.

Z uvedeného pokusu je tedy zřejmé, že v signálu z mikrofonů budou nejen odchylky, ale také že je velikost odchylky v čase nestálá. Zdá se, že jsme narazili na zásadní překážku. Ve skutečnosti jen zdánlivě. Tento problém má v celku elegantní řešení - zvukové odchylky.

Ten mikrofon, který je od zdroje zvuku dál, bude mít menší rozdíly v amplifikaci vln, než mikrofon bližší. Na obrázku vidíte záznam amplitud zvukových vln řeči z obou mikrofonů.

Oranžová amplituda pochází z levého mikrofonu, modrá z pravého, přičemž zdroj zvuku je vpravo.Všimněte si, že amplitudy z levého mikrofonu dosahují nižších hodnot, než z pravého. Ale všimněte si také, že se podobně liší rozdíl vlnového výkyvu. U levého mikrofonu není vlnový výkyv tak intenzivní, jako u pravého, který je zdroji zvuku blíže. A zde leží klíč k řešení zdánlivě nepřekonatelného problému. Budeme porovnávat rozdíly vlnového výkyvu a nikoliv přímo amplitudy.

3.2.4. POUŠTÍME SE DO PROGRAMOVÁNÍ

Abychom mohli porovnávat rozdíly ve vlnovém výkyvu, potřebujeme ukládat naměřené hodnoty. Arduino ale neumí pracovat s pamětí. Alespoň ne klasickým způsobem. Tento problém je třeba obejít. Naštěstí existuje velmi snadný a elegantní způsob.Ten využívá faktu, že Arduino pracuje v nekonečné smyčce a že data lze ukládat do různých proměnných. Nejlépe si to vysvětlíme na příkladu:

Nadefinuji si tyto proměnné:

1) aktuální hodnota_12) hodnota_2, předcházející hodnotě_13) hodnota_3, předcházející hodnotě_2

Následně v programu připravím tato pravidla pro přiřazení hodnot k proměnným:

1) hodnota_3 = hodnota_22) hodnota_2 = hodnota_13) hodnota_1 = načti hodnotu z analogového vstupu

Co se stane, pokud se toto bude dít ve smyčce? Nejprve jsou všechny hodnoty nulové. Až teprve ve třetím kroku vznikne hodnota_1 v důsledku měření analogového vstupu. V další smyčce se začne dít něco jiného. Při kroku 1) není ještě hodnota_2 známa, čili hodnota_3 zůstane nulová. V druhém kroku se však hodnotě_2 přidělí při předchozí smyčce naměřená hodnota_1. Ve třetím kroku se načte nová hodnota_1. Na konci druhé smyčky již máme vedle sebe jeden aktuální a jeden historický záznam měření analogového vstupu. Ve třetí a každé další smyčce již budeme mít současně s aktuálním záznamem historické dva.

Když jsme si vysvětlili, jak ukládat v Arduinu historická data, můžeme se pustit do definování proměnných pro náš program.První proměnnou budou pro měření analogových výstupů mikrofonů. Proměnné si nazveme:

int prave_ucho;int leve_ucho;

Dále si zavedeme proměnné pro historická data. K našemu účelu je třeba ukládat pouze historii měření jeden krok zpět:

int prave_ucho_h;int leve_ucho_h;

S těmito proměnnými budeme ve smyčce loop provádět matematické operace, abychom získali relevantní data, která mezi sebou můžeme porovnávat pro zjištění směru zvuku.Abychom neudělali systematickou chybu, je třeba připomenout, jak zvukovou vlnu bude Arduino detekovat. Ticho je středovou hladinou zvukové vlny (vizte obrázek záznamu amplitud zvukových vln řeči). To znamená, že signál bude při svém toku vykazovat kladné i záporné odchylky od své středové hladiny. To provedeme zavedením konstanty citlivost, u které vytvoříme kladné a záporné toleranční pole pro zjemnění citlivosti a plynulejšímu chodu programu:

citlivost = 2;

citlivost_prave_ucho_hi = prave_ucho_h + citlivost;citlivost_prave_ucho_low = prave_ucho_h - citlivost;citlivost_leve_ucho_hi = leve_ucho_h + citlivost;citlivost_leve_ucho_low = leve_ucho_h - citlivost;

Konstanta citlivost vyjadřuje zvolenou toleranci pro výkyv signálu a může představovat libovolné číslo. Platí, že čím vyšší to číslo bude, tím nižší citlivost mikrofonů na podněty. My jsme zvolili na základě experimentů hodnotu 2, protože tato vykazovala v experimentech nejlepší výsledky. Samozřejmě také vznikly nové proměnné, které je třeba zapsat do části setup:

int citlivost;int citlivost_prave_ucho_hi;int citlivost_prave_ucho_low;int citlivost_leve_ucho_hi;int citlivost_leve_ucho_low;

Když máme všechny potřebné proměnné zavedené a definované, je třeba ze získaných hodnot vytvořit porovnatelná data. K tomu provedeme digitalizaci analogových dat.Digitalizace docílíme poměřováním aktuální naměřené hodnoty každého mikrofonu s vytvořeným tolerančním polem a označení příslušného výstupu za hodnoty PRAVDA / NEPRAVDA, tedy jedničku nebo nulu:

Celý proces provedeme větvením programu ve smyčce loop s využitím podmínky if:

if(leve_ucho > citlivost_leve_ucho_hi || leve_ucho < citlivost_leve_ucho_low) { leva = 1; } else if (leve_ucho <= citlivost_leve_ucho_hi || leve_ucho >= citlivost_leve_ucho_low) { leva = 0; } if(prave_ucho > citlivost_prave_ucho_hi || prave_ucho < citlivost_prave_ucho_low) { prava = 1; } else if (prave_ucho <= citlivost_prave_ucho_hi || prave_ucho >= citlivost_prave_ucho_low) { prava = 0; }

Zde vznikly nové proměnné. Proměnná „leva“ a proměnná „prava.“ Nesmíme je zapomenout deklarovat na začátek programu:

int leva;int prava;

Nyní mohou při měření nastat tyto situace s proměnnými prava a leva:

Proměnná situace1 situace2 situace3 situace4leva 0 1 1 0prava 0 1 0 1

Situace1 znamená, že není detekován zvuk dostatečné intenzity,Situace2 znamená, že zdroj zvuku se nachází stejně daleko od obou mikrofonů,Situace3 znamená, že zdroj zvuku se nachází blíže levému mikrofonu,Situace4 znamená, že zdroj zvuku se nachází blíže pravému mikrofonu.

Nyní už je poměrně jednoduché tyto výstupy zpracovat a převést na pohyb servomotoru rotace hlavy Matyldy.Výchozí hodnota servomotoru je nastavena na 90°. Při této hodnotě je hlava nasměrována rovně dopředu. Při hodnotě 0° natočí servomotor hlavu Matyldy zcela doleva a při 180° pak zcela doprava.

Náš program doplníme tak, aby když nastane situace1, nechť se servomotor otočí do polohy 90°. Pokud nastane situace2, nechť servomotor setrvá na své aktuální pozici. Pokud nastane situace3, nechť servomotor odečte od stávající hodnoty polohy 1. Pokud nastane situace4, nechť servo přičte ke stávající hodnotě polohy 1:

servo_h = servo_hlava.read();

if(leva = 0 && prava = 0) { servo_hlava.write(90); } else if (leva = 1 && prava = 1) { servo_hlava.write(servo_h +0); } else if (leva = 1 && prava = 0) { servo_hlava.write(servo_h -1); } else if (leva = 0 && prava = 1) { servo_hlava.write(servo_h +1);

Jak je patrné, zavedli jsme do programu novou proměnnou servo_h, kterou na začátku této části programu necháváme definovat načtením aktuální polohy servomotoru. Nezapomeňte na začátku programu proměnnou deklarovat ve výchozí hodnotě:

int servo_h = 90;

Nakonec je nezbytné program doplnit o příslušnou knihovnu pro ovládání serovomotorů a máme program hotový. Program naleznete také na SD kartě: Demoprogramy/Uši/ovladani_usi.ino

Začátek programu

prave_ucho=

prave_ucho_h

leve_ucho=

leve_ucho_h

citlivost_prave_ucho_hi=

prave_ucho_h + citlivost

citlivost_prave_ucho_low=

prave_ucho_h - citlivost

citlivost_leve_ucho_hi=

leve_ucho_h + citlivost

citlivost_leve_ucho_low=

leve_ucho_h - citlivost

prave_ucho > citlivost_prave_ucho_hi nebo

prave_ucho < citlivost_prave_ucho_lowprava = 1

leve_ucho > citlivost_leve_ucho_hi nebo

leve_ucho < citlivost_leve_ucho_lowleva = 1

prave_ucho <= citlivost_prave_ucho_hi nebo

prave_ucho >= citlivost_prave_ucho_low

leve_ucho <= citlivost_leve_ucho_hi nebo

leve_ucho >= citlivost_leve_ucho_lowprava = 0 leva = 0

prave_ucho=

analog.Read A0

leve_ucho=

analog.Read A1

leva = 0 a zároveňprava = 0

leva = 1 a zároveňprava = 1

leva = 1a zároveňprava = 0

leva = 0 a zároveňprava = 1

servo_hlava = 90°

servo_hlava = aktuální poloha +0

servo_hlava = aktuální poloha -1

servo_hlava = aktuální poloha +1