Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2018:goal-counter

Toto je starší verze dokumentu!


Počítadlo gólů

Zadání

Navrhněte zařízení sloužící k počítání gólů pro stolní fotbal. Zařízení realizujte pomocí mikrokontroléru FRDM-K64. K zobrazení skóre hry využijte RGB LED pásek s obvodem WS2812. Napájení uvažujte přes USB rozhraní.

Úvod

Cílem tohoto projektu je vytvořit zařízení pro počítání gólů pro hru stolní fotbal. Je tedy nutné vybrat vhodnou metodu detekce průletu míčku brankou. Míček může brankou prolétnout rychlostí až 56 km/h (zdroj: http://www.foosball-league.com/?pid=57) a je také poměrně malý - v průměru měří 34 mm. K zobrazování skóre hry je zvolen RGB LED pásek s obvodem WS2812, který umožňuje adresování každé LED diody zvlášť, obvod ale vyžaduje poměrně přesné časování pulzů.

Hardware

WS2812

WS2812 je LED dioda s integrovaným zdrojem konstatního proudu a posuvným registrem v pouzdře SMD 5050. Je možné ji zapojovat sériově za sebou a vytvořit tak řetěz diod, nebo matici. Každá LED dioda má maximální proudový odběr 20 mA, pro jednu RGB LED diodu to činí 60 mA. V našem případě budeme používat řetěz deseti RGB LED diod znázorňujícíh skóre hry. Napájecí napětí je 5 V, budeme tedy potřebovat zdroj schopný dodat alespoň 1,2 A.

Je vhodné ještě k napájení zařadit kondenzátor o větší kapacitě k vyhlazení proudových špiček, které by mohly poškodit LED diody, zvolil jsem kondenzátor o kapacitě 1uF.

Obvod WS2812 pro komunikaci vyžaduje 5 V logiku, ale FRDM K64 používá 3,3 V logiku TTL, takže bude nutné použít převodník logických úrovní, dají se použít například obvody řady 74HCTxxx.

FRDM K64F

Celým názvem NXP (Freescale) Freedom K64F je vývojová deska pro mikrokontrolér NXP Kinetis MK64FN1M0VLL12 založený na procesoru ARM Cortex M4 o frekvenci 120 MHz, 1 MB flash paměti a 256 kB RAM. Rozměry je kompatibilní se shieldy pro Arduino. Deska mimo jiné obsahuje i ethernet.

Senzor průchodu míčku bránou

Jako možný způsob detekce se nabízí použití optické závory v podobě IR LED diody a fototranzistoru, případně laserová dioda, kde dá využít přesné ohraničení brankoviště. Já jsem pro projekt zvolil laserovou diodu kvůli lepšímu vymezení polohy brankoviště.

Software

Použita je platforma Mbed, což je plně webové vývojové prostředí pro ARM Cortex-M mikrokontroléry. Kompilace kódu probíhá v cloudu, uživatel si poté stáhne připravený binární soubor, který nahraje do paměti mikrokontroléru pomocí DAPLink firmwaru. Klíčovým prvekm tohoto prostředí je sada knihoven napsaných v jazycích C a C++ nazvaná Mbed OS.

Výhodou tohoto prostředí je rychlost s jakou jsme schopni vytvořit první prototyp a také poměrně velká komunita produkující spoustu užitečných knihoven. Nespornou nevýhodou ale je malá podpora periferií v Mbed OS, v hodně případech tak jsme odkázáni pouze na softwarové řešení problémů, které by bylo mnohem vhodnější řešit hardwarovou periferií.

Řízení LED pásku WS2812

Na diodě jsou přítomny čtyři piny - VDD, tedy napájení 5 V, GND, DOUT, digitální výstup a DIN - digitální vstup. Posuvný registr obsahuje 24 bitů - 8 bitů pro každou barvu v pořadí GRB (zelená, červená a modrá), zbytek je posunut na digitální výstup. Každý 8bit určuje jas dané LED diody.

Obvod WS2812 je poměrně dost náchylný na přesné časování pulzů, tolerance je pouze v rozmezí 150 ns. Frekvence signálu je přitom 800 kHz. Generace signálu se dá řešit vícero způsoby, například s pomocí přesného časovače a generování přerušení, nebo pomocí DMA (Direct memory access - přímého přístupu do paměti), se kterým jsme schopni zapisovat do nějakého registru bez pomocí CPU.

Výše zmíněné způsoby, ale nejsou vhodné pro použití s Mbed OS, protože zde nejsou k dispozici knihovny pro obsluhu DMA. Bylo by sice možné použít přímého zápisu do registrů, ale bylo by to velmi zdlouhavé a odporovalo by to „filozofii“ platformy Mbed.

Nabízí se tedy ještě jedna - méně elegantní - možnost a to generovat signál pomocí kódu napsaného v assembleru u kterého můžeme spočítat přesnou délku trvání. Tato metoda se také nazývá „bit banging“ a její nevýhoda je v náročnosti na CPU a také v závislosti na taktovací frekvenci procesoru.

Knihovnu využívající bit banging pro řízení WS2812 už vytvořil Brian Daniels a je k dispozici v repozitáři Mbed pod názvem WS2812. Signál je generován pomocí vkládání přesného počtu instrukcí NOP (No operation), počet instrukcí, které se takto vkládají je nastavitelný v konstruktoru. Během generování signálu je samozřejmě nutné vypnout obsluhu přerušení.

Pro ověření, že generovaný signál opravdu odpovídá specifikacím je dobré použít logický analyzátor. Níže uvedené měření je provedeno na logickém analzyátoru Saleae Logic Pro.


T0H Symbol, doba trvání 364 ns leží v povoleném intervalu 200 až 500 ns.

 T0H Symbol


Detekce průchodu míčku bránou

Vzhledem k malé velikosti míčku a malému rozměru brankoviště připadají v úvahu optické metody detekce s pomocí fototranzistoru a nějakého zdroje světla. Protože je brankoviště ohraničené, tak bude dobré použít světlo směrové.

Zvolil jsem proto laserovou diodu, která umožňuje přesně ohraničit brankoviště a zároveň je s ní možně měřit rychlost průletu míčku brankou. Zároveň ale je nutné pokrýt větší plochu, takže použijeme linkovou fresnelovu čočku, která nám z bodu vytvoří linku a tak můžeme pokrýte celé brankoviště i v případě že se míček prolétne vzduchem.

Na druhé straně brankoviště je umístěno pole fototranzistorů, zvolil jsem 6 paralelně zapojených fototranzistorů v pouzdře SMD 1206 napájených do za sebou do pájivého pole.

Softwarová implementace detekce je závislá na třídách InterruptIn a Timer v mbed. InterruptIn poskytuje obsluhu přerušení na GPIO a Timer je jednoduchá implementace časovače.

Po detekci sestupné hrany je vytvořeno přerušení, které spustí časovač a po detekci vzestupné hrany je časovač zastaven, je ověřeno jestli pulz netrval déle než 2 vteřiny a pokud ne, je to prohlášeno za gól a čítač skóre je inkrementován.

Měření rychlosti průletu míčku bránou

Laserová dioda umožňuje přesné ohraničení. Se znalostí průměru míčku a doby průletu (šířka pulsu mezi dvěma hranami), jsme schopni - nepříliš přesně - změřit rychlost průletu brankovištěm. Nepřesnost je dána hlavně tím, že jsme schopni změřit rychlost pouze v přímém směru.

Rychlost v km/h, proměnná balltime je interval mezi dvěma hranami vyjádřený v sekundách.

float speed = 0.034f/balltime*3.6f;

Z měření, které jsem provedl na prototypu zařízení vyšlo najevo, že průměrná rychlost průletu míčkou brankou se pohybuje mezi 10 až 15 km/h. Nejvyšší naměřená rychlost míčku při přímé střele na bránu byla 18 km/h.

Zdrojový kód aplikace

Knihovna GoalCounter pro Mbed zajišťující počítání gólů je k dispozici zde: https://os.mbed.com/users/nxf46245/code/GoalCounter/ Dokumentace: https://os.mbed.com/users/nxf46245/code/GoalCounter/docs/tip/

TODO

Video a fotografie

TODO

Vylepšení

TODO LPC displej

Zdroje

2018/goal-counter.1547478965.txt.gz · Poslední úprava: 2019/01/14 16:16 autor: Marek Vitula