Otto - námety na vylepšenie programu

From DT^2
Revision as of 20:01, 1 September 2018 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Program zatiaľ využíva len asi polovicu programovej pamäte (typu FLASH), takže je ešte veľa priestoru na jeho vylepšovanie a upravovanie. Ako na to?

Celková štruktúra programu - čo v ňom je a kde, ako to funguje

Program sa skladá z viacerých častí, ktoré sme pre jednoduchšiu manipuláciu umiestnili do jedného súboru. Vhodnejšie by bolo tento súbor rozdeliť na viacero samostatných súborov, ale potom by sa program ťažšie downloadoval, upravoval a podobne.

Skladá sa teda z týchto častí (tento text sa týka verzie 4):

  1. definície konštánt, globálnych premenných, funkcia setup() - konfigurácia všetkých zariadení
  2. funkcia loop() - reaguje na stlačenie klávesy, alebo na ruku pred ultrazvukom a keď sa robot dlhšie nudí, aktivuje náhodnú činnosť
  3. väčšina ostatných funkcií, ktoré využíva hlavný program
  4. funkcie, ktoré slúžia na čítanie a zápis do špeciálnej pamäte EEPROM - jej obsah sa po vypnutí robota (na rozdiel od pamäte RAM) nestratí, preto sem ukladáme kalibráciu servomotorov, tri choreografie a informáciu o tom, či má robot po zapnutí automaticky začať tancovať
  5. naša vlastná softvérová implementácia komunikácie po sériovom porte (jediný sériový port Arduina je totiž už obsadený programovacím USB káblikom a preto musí byť BlueTooth pripojený inam, lenže štandardná knižnica SoftwareSerial znemožňuje súčasné používanie knižnice Servo, preto sme museli vytvoriť lepšiu vlastnú verziu), zároveň je tu niekoľko pomocných funkcií, ktoré dokážu vypisovať do sériového portu reťazce znakov uložené v pamäti FLASH (programová pamäť), aby sme ušetrili pamäť RAM, ktorej má ATmega328 oveľa menej (má 32KB Flash, ale iba 2KB RAM)
  6. funkcie na čítanie z ultazvukového senzora pomocou prerušení - pomocou nich je možné pomalé čítanie z ultrazvukového senzora robiť v pozadí, kým hlavný program robí niečo iné (aj keď túto vlastnosť zatiaľ nevyužívame)
  7. melódie a funkcie na prehrávanie tónov a melódií v pozadí pomocou časovača timer2 - program môže vykonávať inú činnosť zatiaľ čo sa melódia prehráva v pozadí

Osobitnú pozornosť si zaslúžia tieto funkcie a premenné:

  1. vo funkcii loop() je naprogramované, čo Otto robí pri stlačení rôznych klávesov, ak mu chcete pridať nejakú novú schopnosť, tak sem stačí pridať riadok - pozri na konci funkcie riadok kde sa volá vasa_dalsia_funkcia() - to je ukážka toho, ako sem môžete pridať nejakú ďalšiu funkciu...
  2. vo funkcii ma_zahrat_melodiu() sú klávesy, ktoré štartujú jednotlivé melódie. ak si pridáte novú melódiu a chcete ju štartovať aj pomocou nejakého klávesu nielen príkazom z choreografie, tak sem pridajte riadok...
  3. funkcie efekt1() - efekt16() sú rôzne zvukové efekty, ktoré Otto dokáže vydať, môžete experimentovať s nastaveniami v týchto funkciách, alebo si vymyslieť nové vlastné zvukové efekty...
  4. funkcia menu_command() určuje, čo sa má robiť, keď rukou pred Ottom vyžiadame niektorý program - počet priblížení ruky určuje číslo programu, v tejto funkcii môžete určiť, čo sa má na akom čísle diať...
  5. funkcia ahoj() je charakterisktický zvuk, ktorým sa Otto ozýva pri zapnutí - ak si tento zvuk chcete zmeniť, tak tu... pozor - aby prehrávanie melódie fungovalo, musíme používať našu funkciu tone2() namiesto arduinovskej funkcie tone()
  6. funkcie kombinacia1() - kombinacia4() si upravte ak chcete robotom robiť zložitejšie pohyby pri riadení cez mobil. sú priradené na klávesy '3' .. '6'.
  7. ak chcete rozširovať príkazy, ktoré môžu byť v choreografii, upravujte funkciu specialny_prikaz()

Program robí toto:

  1. po zapnutí skontroluje, či je v EEPROM zapísaná kalibrácia, ak áno, načíta ju
  2. ak je nastavený tak, že má automaticky štartovať tanec po zapnutí, počká niekoľko sekúnd a začne tancovať
  3. inak pozdraví, zamáva rukami a čaká na znak prijatý cez USB, alebo cez BlueTooth, alebo na zatienenie ultrazvukového senzora, ak sa pár sekúnd nič nedeje, tak vykoná náhodnú činnosť (väčšinou len vydá nejaký zvuk, niekedy sa začne hýbať, hrať melódiu, alebo vydá 20 náhodných zvukov za sebou)
  4. robota v tomto režime môžeme priamo ovládať jednotlivými znakmi cez USB alebo BlueTooth, ladiť alebo testovať choreografiu, kalibrovať a podobne (podrobný zoznam funkcií je v tabuľke na stránke s programom)
  5. novú choreografiu do robota zadáme tak, že najskôr pošleme znak '@' a potom v každom riadku jeden príkaz podľa formátu choreografie - každá choreografia musí byť ukončená riadkom 0 0 0, takto zadanú choreografiu môžeme skontrolovať pomocou znaku '?' a robot ju zatancuje po znaku 't'. Do jedného z troch miest v pamäti EEPROM ju zapíšeme pomocou 'W' a neskôr môžeme vyvolať pomocou 'C', alebo počas automatického štartu nastaveného cez 'A'
  6. pomocou ultrazvukového senzora môžeme s robotom komunikovať - zatiaľ to znamená štartovať jeho rôzne činnosti, funguje to takto:
    1. najskôr priblížime ruku (alebo lepšie nejakú pevnú kartičku, telefón a pod.) asi 5-10 cm pred senzor
    2. po niekoľkých sekundách robot pískne nízkym tónom, aby nám dal vedieť, že nás zaregistroval
    3. následne čaká, kým ruku oddialime, aby mohol začať počítať počet priblížení rukou
    4. v okamihu, keď sa mu podarí oddialenie zamerať, vydá vysoký tón, aby nás o tom upovedomil
    5. ďalej opakujeme priblíženie a oddialenie ruky pred senzorom, pričom pri každom priblížení robot vydá niekoľko písknutí (ich počet určuje aktuálne navolený program) a pri každom oddialeníu vydá vysoký tón
    6. keď prestaneme ruku pred senzor prikladať, robot si to po niekoľkých sekundách všimne, vydá tón a odštartuje zvolený program (podľa posledného počtu písknutí)
    7. ak sa vám zdá, že senzor nereaguje, vyskúšajte režim 'U' z hlavného menu, ktorý do USB a na Bluetooth vypisuje nameranú vzdialenosť
  7. niekoľko ďalších praktických rád:
    • medzera vždy postupne vyrovná všetky servá do strednej polohy
    • kláves ESC preruší melódiu
    • akýkoľvek kláves preruší tanec
    • pri potvrdzovaní zápisu/čítania sa musí stlačiť veľké 'Y', malé 'y' neurobí nič
    • ak nás počas práce Ottove vrzúkanie otravuje, môžeme vypnúť režim nudy klávesom 'V'
    • užitočný je kláves 'S', ktorý zobrazí aktuálny stav všetkých seriev - choreografiu teda môžeme ladiť tak, že pomocou klávesov robota nastavíme do požadovanej polohy a potom stlačíme S, aby nám zobrazil hodnotu všetkých seriev, to servo, ktoré sa pohlo si všimneme a pridáme do ďalšieho riadku choreografie
    • predtým, ako zapíšeme prvú choreografiu do EEPROM, je potrebné EEPROM naformátovať klávesom 'X'

Ako pridať ďalšiu melódiu

Okrem základného zvukového pozdravu ahoj(), jednoduchého písknutia pipni(), krátkeho úvodného motívu pesničky jedna druhej riekla - melodia_jedna_druhej() Otto pozná a v pozadí počas choreografie alebo len tak na požiadanie môže zahrať 4 rôzne melódie. V týchto melódiách je každý tón zaznamenaný ako jeden bajt, ktorý je určený podľa tejto tabuľky. Melódie sú kvôli úspornosti uložené v programovej pamäti FLASH, v poliach melodia1[] ... melodia4[]. Okrem toho v poli dlzka_melodia[] musia byť dĺžky melódií. Preto, ak chcete experimentovať s vlastnou melódiou, najjednoduchšie je upravovať niektorú z týchto melódií (napr. kohútika jarabého). Ešte lepšie je pridať ďalšie pole - napr. melodia5[] a pridať aj jeho dĺžku na koniec poľa dlzka_melodia[] - túto melódiu bude možné zahrať vtedy, ak do funkcie zahraj_melodiu() pridáte ďalší riadok: else if (cislo == 5) current_note = melodia5;. Ak chcete pridanú melódiu vyvolávať aj nejakou klávesom (čo je praktické pri ladení melódie), tak upravte aj ma_zahrat_melodiu().

Ako uložiť choreografiu priamo do programu, aby sa nemusela zadávať cez terminál

Prvý príkaz vyvolaný cez ultrazvukový senzor štartuje funkciu vpred(), ktorá spustí chôdzu uloženú v programovej pamäti v premenných chor_time[], chor_servo[], chor_val[] a chor_len. Posledná z nich obsahuje počet riadkov choreografie chôdze a ostatné tri zodpovedajú jednotlivým stĺpcom choreografie chôdze - čas čakania, číslo serva a cieľová hodnota serva. Takýmto istým spôsobom si môžete pridať inú choreografiu, ktorá má byť pevne uložená v programe a do funkcie loop() môžete pridať kláves, ktorým sa vaša nová choreografia bude štartovať (pridáte analogickú funkciu k funkcii vpred()).

Ako zmeniť príkazy, ktoré sú štartované cez ultrazvukový senzor

  1. vyhľadajte funkciu menu_command()
  2. v tejto funkcii upravte telo príslušnej podmienky, alebo pridajte ďalšiu podmienku
  3. buď si môžete vytvoriť novú funkciu, ktorú odtiaľ voláte, alebo využiť niektorú existujúcu...

Ako lepšie namapovať riadenie z Android telefónu

V aplikácii Arduino Bluetooth Controller môžete nastavovať znaky, ktoré aplikácia cez BlueTooth vysiela do robota pri stláčaní jednotlivých tlačidiel, alebo nakláňaní telefónu. Namapovanie jednotlivých stupňov volnosti vytvorí ale dosť zložito riadený systém a lepší efekt dosiahnete, keď na jednotlivé znaky namapujete zložitejšie pohyby - ideálne celé choreografie. Viem si napríklad predstaviť, že naklonením telefónu vpred by sa odštartovala chôdza vpred, naklonením vzad zasa chôdza vzad, naklonením vpravo zasa otáčanie robota na mieste vpravo a vľavo zasa naopak. Na stlačenie nejakého tlačidla android vyšle medzeru, čím robota zastaví a umiestni do neutrálnej pozície. Ak sa vám to podarí, pošlite nám video!