Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2014:led-bludiste [2015/01/17 00:50] Ivan Ryba |
2014:led-bludiste [2015/01/18 14:37] (aktuální) Ivan Ryba |
||
---|---|---|---|
Řádek 7: | Řádek 7: | ||
**Bludiště s kuličkou** — Využijte RGB LED matici. Jedna barva LED reprezentuje kuličku, druhá cíl, třetí stěny. Nakláněním desky se bude kulička pohybovat k okraji a zastavovat se o stěny. Na závěr se na LED matici zobrazí počet sekund, jak dlouho trvalo hráči dostat kuličku do cíle. | **Bludiště s kuličkou** — Využijte RGB LED matici. Jedna barva LED reprezentuje kuličku, druhá cíl, třetí stěny. Nakláněním desky se bude kulička pohybovat k okraji a zastavovat se o stěny. Na závěr se na LED matici zobrazí počet sekund, jak dlouho trvalo hráči dostat kuličku do cíle. | ||
- | RGB LED matice není v našem konkrétním případě tak docela RGB, neboť modrá složka chybí. Dostupné barvy jsou tedy červená, zelená a oranžová. Více barev naštěstí není potřeba, takže kulička bude mít zelenou barvu, cíl bude červený a stěny bludiště budou, kromě okrajů LED matice, reprezentovat oranžově svítící LED. Stěn využijeme proto, že matice formátu 8×8 LED je pro účel bludiště i tak malá, přičemž rozsvícením okrajů v oranžové bychom získali pouhých 6×6, což už je na nějakou zajímavější trasu zoufale málo. | + | RGB LED matice není v našem konkrétním případě tak docela RGB, neboť modrá složka chybí. Dostupné barvy jsou tedy červená, zelená a oranžová. Více barev naštěstí není potřeba, takže kulička bude mít červenou barvu, cíl bude zelený a stěny bludiště budou, kromě okrajů LED matice, reprezentovat oranžově svítící LED. Stěn využijeme proto, že matice formátu 8×8 LED je pro účel bludiště i tak malá, přičemž rozsvícením okrajů v oranžové bychom získali pouhých 6×6, což už je na nějakou zajímavější trasu zoufale málo. |
- | Po dosažení cíle vypíše matice zelenou barvou čas, za který hráč prošel bludištěm (ve formátu 123s). | + | Po dosažení cíle vypíše matice zelenou barvou čas v sekundách, za který hráč prošel bludištěm (ve formátu ##). |
---- | ---- | ||
+ | |||
===== Hardware ===== | ===== Hardware ===== | ||
- | Základem celé aplikace je vývojová deska KL25Z, samozřejmě osazená pro propojení s LED maticí. Obrázky níže zachycují osazenou desku | + | Základem celé aplikace je vývojová deska KL25Z, samozřejmě osazená pro propojení s LED maticí. Obrázky níže zachycují osazenou desku a použitou LED matici 8×8. |
- | + | ||
- | {{ :2014:led-bludiste:kl25z.jpg?200 |}} | + | |
- | + | ||
- | a použitou LED matici 8×8. | + | |
- | {{ :2014:led-bludiste:led_matice.jpg?200 |}} | + | {{:2014:led-bludiste:kl25z.jpg?200|}} {{:2014:led-bludiste:led_matice.jpg?200|}} |
Pro propojení obou hardwarových částí slouží převodník. Ten byl původně navržen pro jinou vývojovou desku, takže bylo třeba použít ještě jednu DPS pro přepolohování pinů k propojení s KL25Z. Stránka o převodníku z původního převodníku na vývojovou desku je [[2014:led-8x8-adapter|ZDE]]. Deska je navržena jako oboustranná s prokovy v místě pinů, takže pájení vyžaduje promyšlení postupu a trochu trpělivosti. Já doporučuji (samozřejmě po navrtání) tento postup. | Pro propojení obou hardwarových částí slouží převodník. Ten byl původně navržen pro jinou vývojovou desku, takže bylo třeba použít ještě jednu DPS pro přepolohování pinů k propojení s KL25Z. Stránka o převodníku z původního převodníku na vývojovou desku je [[2014:led-8x8-adapter|ZDE]]. Deska je navržena jako oboustranná s prokovy v místě pinů, takže pájení vyžaduje promyšlení postupu a trochu trpělivosti. Já doporučuji (samozřejmě po navrtání) tento postup. | ||
Řádek 36: | Řádek 33: | ||
Výsledek ukazují obrázky níže. | Výsledek ukazují obrázky níže. | ||
- | {{ :2014:led-bludiste:8x8top.jpg?200 |}} | + | {{:2014:led-bludiste:8x8top.jpg?200|}} {{:2014:led-bludiste:8x8bot.jpg?200|}} |
- | + | ||
- | {{ :2014:led-bludiste:8x8bot.jpg?200 |}} | + | |
---- | ---- | ||
Řádek 51: | Řádek 46: | ||
Podle stránek mbed se jedná o známou věc. Vzhledem k tomu, že RTC ClockIn nelze softwarově vypnout, zbývají dvě možnosti, jak problém vyřešit. První možnost je modifikovat samotnou KL25Z tak, že odpájíme nulový rezistor R24 (viz obrázek), který připojuje RTC obvod. Tato varianta je častým závěrem diskuzí na mbed fórech při řešení této konkrétní situace. | Podle stránek mbed se jedná o známou věc. Vzhledem k tomu, že RTC ClockIn nelze softwarově vypnout, zbývají dvě možnosti, jak problém vyřešit. První možnost je modifikovat samotnou KL25Z tak, že odpájíme nulový rezistor R24 (viz obrázek), který připojuje RTC obvod. Tato varianta je častým závěrem diskuzí na mbed fórech při řešení této konkrétní situace. | ||
- | {{ :2014:led-bludiste:kl25z_r24.jpg?200 |}} | + | {{:2014:led-bludiste:kl25z_r24.jpg?200|}} |
- | Metoda je ovšem zbytečně destruktivní když uvážíme, že máme k dispozici převodník pro matici, tedy v podstatě jednoúčelový hardware, zatímco RTC ClockIn by se u jiné aplikace ještě mohl hodit. Navíc by pak převodník a aplikace fungovala jenom na upraveném kitu, což je zbytečná komplikace navíc. Proto byla zvolena modifikace převodníkové DPS a pin druhé zelené LED vedoucí na PTC1 byl drátkem přepojen na nevyužitý PTB3. Pin se nachází o dvě pozice níže v tom samém bloku pinů (viz [[http://developer.mbed.org/media/uploads/rikabel/xkl25z-pinout-revised.jpg.pagespeed.ic.sIdUo0W4Ng.webp|ROZPIS]], takže úprava není složitá. Pro výrobu dalších převodníků lze změnu zahrnout do návrhu, modifikace DPS nevyžaduje kromě posunu jedné cesty vůbec nic navíc. | + | Metoda je ovšem zbytečně destruktivní když uvážíme, že máme k dispozici převodník pro matici, tedy v podstatě jednoúčelový hardware, zatímco RTC ClockIn by se u jiné aplikace ještě mohl hodit. Navíc by pak převodník fungoval jenom na upraveném kitu, což je zbytečná komplikace navíc. Proto byla zvolena modifikace převodníkové DPS a pin druhé zelené LED vedoucí na PTC1 byl drátkem přepojen na nevyužitý PTB3. Pin se nachází o dvě pozice níže v tom samém bloku pinů (viz [[http://developer.mbed.org/media/uploads/rikabel/xkl25z-pinout-revised.jpg.pagespeed.ic.sIdUo0W4Ng.webp|ROZPIS]]), takže úprava není složitá a nevyžaduje ani změnu postupu pájení. Pro výrobu dalších převodníků lze změnu zahrnout do návrhu, modifikace DPS nevyžaduje kromě posunu jedné cesty vůbec nic navíc. |
- | + | ||
- | Pro úplnost lze dodat, že s použitím této modifikace po obnovení firmwaru slabě zeleně svítí pro změnu první LED ve spodním řádku, ovšem tohle již lze softwarovým vypnutím napravit a žádné pozdější komplikace to nezpůsobuje. | + | |
---- | ---- | ||
Řádek 78: | Řádek 71: | ||
===== Kód ===== | ===== Kód ===== | ||
+ | Pro potřeby bludiště stačí, kromě základní knihovny, inicializovat akcelerometr a časovač: | ||
+ | <code cpp> | ||
+ | #include "mbed.h" | ||
+ | |||
+ | //akcelerometr | ||
+ | #include "MMA8451Q.h" | ||
+ | #define MMA8451_I2C_ADDRESS (0x1d<<1) | ||
+ | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS); | ||
+ | |||
+ | //časovač | ||
+ | Timer t;</code> | ||
+ | |||
+ | Pro přehlednost následujícího kódu ještě příklad inicializace výstupů. | ||
+ | |||
+ | <code cpp> | ||
+ | DigitalOut GLED1(PTC0); //zelená LED | ||
+ | DigitalOut RLED1(PTC8); //červená LED | ||
+ | DigitalOut SB1(PTB0); //jeden bit sloupce | ||
+ | </code> | ||
+ | |||
+ | Následuje funkce pro zjednodušení zadávání sloupce | ||
+ | |||
+ | <code cpp> | ||
+ | int sl (int s){ | ||
+ | switch (s){ | ||
+ | case 0 : SB1 = 0; SB2 = 0; SB3 = 0; break; | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | a řádku pro pohyb kuličky. LED musí samozřejmě klasicky "blikat", pro lidské oko neznatelně. | ||
+ | |||
+ | <code cpp> | ||
+ | int ra (int r){ | ||
+ | switch (r){ | ||
+ | case 0 : RLED1 = 0; wait(0.001); RLED1 = 1; break; | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Další funkce určuje svícení zadaných stěn. | ||
+ | |||
+ | <code cpp> | ||
+ | int walls (){ | ||
+ | //jedna z LED reprezentujících stěnu | ||
+ | sl(0); RLED2 = 0; GLED2 = 0; RLED4 = 0; GLED4 = 0; | ||
+ | wait(0.001); RLED2 = 1; GLED2 = 1; RLED4 = 1; GLED4 = 1; | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Podobně jsou definována čísla k časomíře. Funkce má dvě hodnoty, první a druhou číslici, které se budou zobrazovat vedle sebe. | ||
+ | |||
+ | <code cpp> | ||
+ | int nr(int n1, int n2){ | ||
+ | switch (n1){ | ||
+ | //definice číslice 0 na první pozici | ||
+ | case 0 : sl(6); GLED2 = 0; GLED3 = 0; GLED4 = 0; GLED5 = 0; GLED6 = 0; wait(0.001); GLED2 = 1; GLED3 = 1; GLED4 = 1; GLED5 = 1; GLED6 = 1; | ||
+ | sl(5); GLED2 = 0; GLED6 = 0; wait(0.001); GLED2 = 1; GLED6 = 1; | ||
+ | sl(4); GLED2 = 0; GLED3 = 0; GLED4 = 0; GLED5 = 0; GLED6 = 0; wait(0.001); GLED2 = 1; GLED3 = 1; GLED4 = 1; GLED5 = 1; GLED6 = 1; | ||
+ | break; | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Následuje hlavní funkce. Komentáře v kódu jsou dostatečně vypovídající. | ||
+ | |||
+ | <code cpp> | ||
+ | int main() { | ||
+ | | ||
+ | //počáteční vypnutí všech LED | ||
+ | RLED1 = 1; RLED2 = 1; ... | ||
+ | GLED1 = 1; ... | ||
+ | | ||
+ | int i = 0; //index pro řádky | ||
+ | int j = 0; //index pro sloupce | ||
+ | |||
+ | //sloupce a řádky kuličky | ||
+ | sl(i); ra(j); | ||
+ | | ||
+ | //začátek počítání času při náklonu sestavy | ||
+ | if ((acc.getAccX() != 0) || (acc.getAccY() != 0)){ t.start();} | ||
+ | | ||
+ | //smyčka s bludištěm | ||
+ | while(1) { | ||
+ | | ||
+ | //načtení stěn | ||
+ | walls(); | ||
+ | | ||
+ | //citlivost začátku pohybu kuličky | ||
+ | if (((acc.getAccX() > -0.2) && (acc.getAccX() < 0.2)) || ((acc.getAccY() > -0.2) && (acc.getAccY() < 0.2))){ | ||
+ | wait(0.005); | ||
+ | sl(i); ra(j);} | ||
+ | | ||
+ | //pohyb náklonem v ose +X (obdobně pro další osy | ||
+ | if (acc.getAccX() > 0.2){ | ||
+ | wait(0.005); i++; | ||
+ | | ||
+ | //definice neprůchodnosti stěn | ||
+ | if ((i == 4 && j == 0) || ((i == 0 || i == 1 || i == 3 || i == 6) && j == 1) || ((i == 3 || i == 5) && j == 2) || ((i == 0 || i == 2 || i == 5 || i == 7) && j == 3)){ i--;} | ||
+ | if (((i == 2 || i == 4) && j == 4) || ((i == 1 || i == 4 || i == 5 || i == 6) && j == 5) || ((i == 3 || i == 4) && j == 6) || ((i == 1 || i == 4 || i == 6) && j == 7)){ i--;} | ||
+ | | ||
+ | //definice zastavení o okraje | ||
+ | if (i > 6){ i = 7; } | ||
+ | if (i < 1){ i = 0; } | ||
+ | |||
+ | sl(i); ra(j);} | ||
+ | . | ||
+ | . | ||
+ | . | ||
+ | | ||
+ | //konec smyčky když je kulička na souřadnicích cíle | ||
+ | if (i == 5 && j == 7){ | ||
+ | break;} | ||
+ | } | ||
+ | | ||
+ | //konec počítání času a zpracování | ||
+ | t.stop(); | ||
+ | | ||
+ | //načtení času do proměnné ke zpracování | ||
+ | float time = t.read(); | ||
+ | | ||
+ | //zaokrouhlení času na celé vteřiny | ||
+ | int t = int (time + 0.5); | ||
+ | | ||
+ | //zjištění desítek a jednotek vteřin | ||
+ | int td = t / 10; | ||
+ | int tj = t % 10; | ||
+ | | ||
+ | //při čase delším než 100 vteřin vypíše 99 | ||
+ | if (td >= 10) {td = 9; tj = 9;} | ||
+ | | ||
+ | //smyčka zobrazení času | ||
+ | while(1) { | ||
+ | nr(td, tj);} | ||
+ | } | ||
+ | </code> | ||
---- | ---- | ||
+ | |||
+ | |||
+ | ===== Video a foto ===== | ||
+ | |||
+ | Video ukazuje dvě hry od zapojení USB po dosažení cíle. | ||
+ | |||
+ | {{:2014:led-bludiste:demo.mp4|}} | ||
+ | |||
+ | Záznamové zařízení zobrazuje malé blikání, které ovšem pouhým okem vidět není. Míra osvětlení je kompromisem mezi viditelností zařízení a výrazností LED, proto je na první pohled zelený cíl od oranžového bludiště hůře odlišitelný. V reálu je rozlišitelnost dobrá, jak ukazují obrázky níže. | ||
+ | |||
+ | {{:2014:led-bludiste:bludiste.jpg?200|}} {{:2014:led-bludiste:cas.jpg?200|}} | ||
+ | |||
+ | ---- | ||
+ | |||
===== Závěr ===== | ===== Závěr ===== | ||
+ | Zadání projektu bylo splněno v plném rozsahu. Po zapojení do USB se objeví bludiště s kuličkou, která se nakláněním bludiště pohybuje mezi jeho stěnami. Počínaje prvním náklonem začíná běžet čas. Po dosažení cíle se objeví výsledný čas, který hráč k dosažení cíle potřeboval. Stiskem tlačítka Reset se opět objeví bludiště, kulička a čas čekají na náklon a hra začíná znovu. | ||
+ | |||
+ | Je škoda, že displej je moc malý na to, aby se dal čas zobrazit v pochopitelnějším formátu. Pro dobrou čitelnost čísel nezbývá místo ani na jednotku času, ani na dvojtečku před číslem, která by mohla indikovat na první pohled, co ono číslo zobrazuje. | ||
+ | |||
+ | Z hlediska softwaru by ještě šlo zapracovat na jednodušší implementaci stěn, například podle souřadnic, což by usnadnilo tvorbu dalších map. | ||
+ | |||
+ | Vzhledem k formě hardwaru je třeba držet bludiště za hranu převodníku, neboť dotykem pinů na jakékoli z desek může dojít ke zkratu a i poškození desky. I to může být důvod, proč se realizace podařila až na druhé vývojové desce. | ||
---- | ---- |