Close

Zasekni to s dřevorubeckým Shieldem!

Dřevorubec s Arduinem

U příležitosti oslavy 5000 (pěttisíc!) fanoušků na Facebooku jede bomby 1. Arduino Challenge – Dřevorubec, posekej neposekané! Ale to už nejspíše všichni víte! Do soutěže se přihlásilo prvních 52 statečných a my jsme z nich vylosovali 7 účastníků, kteří tvoří A-dřevorubecký tým. Jinými slovy zašleme jim naše řešení Dřevorubeckého Shieldu pro snadné zapojení do hry.

A na co takový Dřevorubecký Shield vlastně je a jak funguje? Na to se společně podíváme právě v tomto článku. Bude to kuchařka pro první šťastné majitele tohoto nevšedního kousku hardware, ale také inspirace pro ty, kteří si do soutěže chtějí postavit vlastní řešení a vysekat si hlavní výhru kit TinyLab! Pokud ještě v soutěži nejste, tak se určitě přihlašte!

Tak Dřevorubecký Shield je na sekání dřeva Arduinem v mobilním telefonu. Hmm, to zní úplně jasně :).  Je to prostě věc, kterou každý potřebuje a dají se s ní dělat opravdu seriózní projekty. Tak a teď vážně. Pokud se tu někdo tváří kysele nad tím co to tady blbneme, tak já říkám kdo si hraje nezlobí tak moc, a o tom to všechno je. Jdeme na to.

Aby to dobře štípalo – popis hardware

Hardware dřevorubeckého shieldu je velmi jednoduchý a provedením je koncipován jako klasický Arduino Shield. Pro funkci není potřeba velké množství součástek a tak jsou rozměry shieldu realizovány co nejmenší. Aby se ušetřilo ještě více místa na plošném spoji, tak jsou tam obsaženy i snímače barev. Ty se pak vylomí a připájí na páskový kabel.

drevorubecky-shield-hw-2drevorubecky-shield-foto

drevorubecky-shield-hw-1

Arduino Dřevorubecký Shield – schéma zapojení

Na Arduino Shieldu jsou tyto bloky

  • Blok tlačítek s LED indikací a možností zpětného přidržení – Pokud zmáčkneme tlačítko, rozsvítí se LED dioda a Arduino zaznamená změnu logické hodnoty na I/O pinu. Pomocí stejného I/O pinu pak může Arduino také „přidržet“ tlačítko v aktivním stavu a rozsvítit indikační LED tlačítka.
  • Konektory pro serva – Jsou použité klasické 3pinové konektory, které mají menší serva. Signály jsou spojeny přímo s Arduino piny.
  • Blok převodníku úrovní 3,3V / 5V –  Jednoduchý převodník slouží pro převedení úrovní signálů sběrnice I2C. Tento blok je nutný z důvodu použití následujícího snímače barev, který pracuje s 3,3V logikou.
  • RGBW snímač barev – Tento snímač je použitý pro „snímání průchodu větví“. Dá se použít jednodušší fotorezistor, ale se snímačem barev jsme dosáhli lepší a jednoznačnější výsledky. RGBW snímač také umožňuje s Arduinem daleko širší využití. Na plošném spoji jsou připojovací kontakty pro dva 3,3V I2C snímače, ale kvůli adresaci můžeme pracovat jen s jedním VEML6040.
  • Pin headery pro připojení na Arduino – Pro zachování minimální velikosti shieldu jsou využity jen piny nezbytné pro funkci shieldu.

Celé řešení hardware je zpracováno ve známém software na tvorbu schémat a plošných spojů Eagle. Pro práci na podobných Arduino projektech je ideální způsob natáhnout si do Eagle nějaký již existující design Arduino hardware, který je podobný tomu co chci vytvořit. Pak to jednoduše v Eagle upravit, nechat si udělat desky a pak ručně osadit a je to.

A teď se podíváme podrobněji na funkce a možnosti implementace ovládání.

Učíme se sekat a osekávat – popis software

Vytvořit dobře vyladěný sekací program bude náš největší úkol. Ale dříve, než se vrhneme na program, vysvětlíme si rychle teorii úspěšného sekání.

Hra Dřevorubec, neboli Timberman je ke stažení zde. Při prvním spuštění hry na nás bafne herní prostředí, kde se bude vše odehrávat.

drevorubec-zakldady-3

Úkolem hry je skákat z jedné strany stromu na druhou, a při tom se nenechat zavalit větví. Při každém skoku useknete kus stromu, vaše skóre vzroste, a celý strom i s větvemi klesne o jeden blok.

Herní princip lze demonstrovat následujícími obrázky

drevorubec-zakldady-4drevorubec-zakldady-2drevorubec-zakldady-1
A teď k samotné problematice hraní. Úhlavním nepřítelem, kterému musíme čelit jsou větve, proto si musíme uvědomit, jak se jim vyhnout. Při skoku na špatnou stranu nás větev zavalí a hra pro nás končí. Toho je třeba se vyvarovat. Příklady jsou na následujících obrázcích. 🙂

herni-principy-arduino-drevorubce-4herni-principy-arduino-drevorubce-2drevorubec-zakldady-6
Nedostat po hlavě větví! A to je právě váš úkol. Vymyslet systém, který tyto situace nedopustí a vyhne se všem větvím po cestě. Nastupuje tedy na řadu barvy rozpoznávající senzor VEML6040, který po připevnění na display funguje jako spolehlivý detektor padajících větví. S připevněním pomůže kousek plastelíny.

Větve jsou vždy stejného tvaru na stejných místech displaye, takže není problém vychytat optimální místo umístění senzoru. Umístění se tedy muže lišit, podle programu.

Můžeme ho umístit přímo nad postavu dřevorubce, ale pak víme maximálně o 4 místech, kde je, nebo není větev.

herni-principy-arduino-drevorubce-7

Nebo ho také můžeme posadit výš a tím pádem vědět o celé situaci na herním poli.

herni-principy-arduino-drevorubce-8

Jak? Vždyť máme jeden senzor a dvě strany, potřebujeme tedy logicky dva senzory! Ano i ne. Máte pravdu že pro plné ovládnutí herní plochy je potřeba dvou senzorů, ale pro to důležité z toho stačí pouze jeden. Vraťme se k prvnímu případu umístění senzoru nad postavu dřevorubce.

herni-principy-arduino-drevorubce-7

Žluté čísla značí místa herního pole, kde s jistotou víme, jestli se v nich nachází, nebo nenachází větev. Větev se totiž v místě 0 detekuje a při každém přeskočení ze strany stromu na druhou se posune o políčko dolů. Proto známe stav pod senzorem, ale nad ne. No a pravá strana? Podívejte se, jak jsou větve rozmístěny na obrázku. Tento obrázek jsem vybral záměrně, protože jde na něm vidět nejhustší zastoupení větví, jaké jde ve hře potkat. Vidíme, že když je větev napravo, nalevo určitě nebude. A nejen to! Nebude vlevo o políčko níže ani výše. Takže, kdybychom úspěšně detekovali větev v poli 0, kde máme posazený senzor, tak bezpečně víme, že na druhé straně v polích 0, -1 a 1 větev určitě nebude. A to je vše, co potřebujeme vědět.

A protože větve padají k zemi, tak to znamená, že čím výše posadíme senzor, tím více herních polí známe, jak je ukázáno na druhém obrázku.

Červena čísla tedy udávají, které pole můžeme, ale taky nemusíme znát. Třeba když půjdou 3 větve po sobě nalevo, tak si toho senzor napravo vůbec nevšimne, ale to nás vůbec nemusí trápit, jestli tam jsou, nebo ne, protože napravo je čisto, tak tam zůstaneme. Zajímavé jsou pole červené -1′, které známe jen ve chvíli, kdy na poli senzoru přistane větev.

Černé pole označují místa doteků stylusů serv.

Modré křížky pole, které s daným umístěním senzoru určitě znát nebudeme.

Takže herní taktika může znít následovně, pro naše řešení na obrázcích: Budu se držet napravo a nalevo skočím jen tehdy, když vím, že je napravo větev. Větve nalevo ignoruji tím, že vpravo je čisto, proto tam zůstanu a doleva se tedy vůbec netlačím, když absolutně nemusím.

Dobré nářadí je základ – popis knihovny

Knihovna nabízí pouze přístup a správu nástrojů, vše důležité nechává na vás, ale určitě je skvělým pomocníkem při řešení právě toho důležitého.

Knihovna umožňuje přístup k prvkům na shieldu. S hlavními funkcemi:

void NastavServoX(int odchylka);
void NastavServoX(int odchylkaTouch, int odchylkaNoTouch);
unsigned int vratCerv();
unsigned int vratZele();
unsigned int vratModr();
unsigned int vratBilo();
boolean jeTlacitkoXStiskle();
void servoXDotyk(boolean stisk)
//kde X označuje buď 1 nebo 2, podle toho, jaké servo/tlačítko máme na mysli

Podívejme se tedy na příklad, který je součástí knihovny.

#include <ArduinoDrevorubecLib.h>;

DrevorubecShield Drevorubec;

void setup()
{
    Serial.begin(9600); 
    //přiblízení serva blíž k displayi o 10 stupnu
    Drevorubec.NastavServo1(-10);
    //oddalení serva od displaye v pozici 'TOUCH' o 3 stupně k displayi a v pozici 'NOTOUCH' o 5 stupnu od displaye
    Drevorubec.NastavServo2(-3, 5);
    //lepsí aktivovat shield az po uvedeni odchylek
    Drevorubec.begin();
}

void loop()
{
    unsigned int cervenaZeSenzoru = Drevorubec.vratCerv();
    unsigned int zelenaZeSenzoru = Drevorubec.vratZele();
    unsigned int modraZeSenzoru = Drevorubec.vratModr();
    unsigned int bilaZeSenzoru = Drevorubec.vratBilo();

    Serial.print("Senzor R,G,B,W: ");
    Serial.print(cervenaZeSenzoru);
    Serial.print(", ");
    Serial.print(zelenaZeSenzoru);
    Serial.print(", ");
    Serial.print(modraZeSenzoru);
    Serial.print(", ");
    Serial.println(bilaZeSenzoru);

    if (Drevorubec.jeTlacitko1Stiskle()) {
        Serial.println("tlačítko 1 je stiskle!");
        Drevorubec.servo1Dotyk(true);
    }
    else {
        Drevorubec.servo1Dotyk(false);
    }

    if (Drevorubec.jeTlacitko2Stiskle()) {
        Drevorubec.servo2Dotyk(true);
    }
    else {
        Drevorubec.servo2Dotyk(false);
    }

    delay(10);
}

Důležitým elementem je vytvoření objektu shieldu ‚Drevorubec‘ na začátku a poté jsou všechny funkce výše dostupné podobně jako u funkcí třídy Serial. Příkazy jsou maximálně počeštěné pro jasnou funkci.

!!Update!! Knihovna ke stažení ZDE (ZIP archiv) V1.0.2
BitBucket s knihovnou

Vezměte sekery a jdeme na to – příklady použití

Samozřejmě, že tento shield není výhradně určený jen pro sekání dřeva. Shield lze využít v mnoha projektech, kde je potřeba ovládat dotykový display. Při jednoduché modifikaci se může například zautomatizovat hra Stack, při složitější Geometry Dash a pro opravdové gurmány zle senzor připevnit na pohyblivou osu a skenovat tím například délku potřebnou pro přemostění ve hře Stick Hero nebo rovnou vytvořit pohyblivý systém 2 os a skenovat s ním rovnou celý display pro vyhodnocení kroku ve hře! Nebojte se nám poslat vše, co s pomocí našeho Dřevorubeckého shieldu vytvoříte! 🙂

Za spolupráci na vývoji dřevorubeckého náčiní a přípravě těch nejlepších dřevorubeckých technik děkuji Matěji Suchánkovi a celému A-týmu!

Oldřich Horáček

Napsat komentář