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 | ||
2017:pc-app-ctrl [2018/01/12 10:24] Dan Raszka |
2017:pc-app-ctrl [2018/01/14 19:51] (aktuální) Dan Raszka |
||
---|---|---|---|
Řádek 148: | Řádek 148: | ||
Tlačítka jsou připojena pomocí pull-up rezistorů k napájecímu napětí 3,3 V. Při sepnutí je tedy generována sestupná hrana, na kterou reaguje přerušení procesoru. Ošetření zákmitů je řešeno tak, že při vyvolání přerušení je do proměnné odpovídající danému tlačítku zapsána zpožďovací konstanta, která je v hlavním cyklu postupně dekrementována. Při dosažení nulové hodnoty je znova načtená hodnota na daném pinu a pokud je rovna nule (stále zmáčknuté tlačítko) je provedena obsluha stisknutého tlačítka. | Tlačítka jsou připojena pomocí pull-up rezistorů k napájecímu napětí 3,3 V. Při sepnutí je tedy generována sestupná hrana, na kterou reaguje přerušení procesoru. Ošetření zákmitů je řešeno tak, že při vyvolání přerušení je do proměnné odpovídající danému tlačítku zapsána zpožďovací konstanta, která je v hlavním cyklu postupně dekrementována. Při dosažení nulové hodnoty je znova načtená hodnota na daném pinu a pokud je rovna nule (stále zmáčknuté tlačítko) je provedena obsluha stisknutého tlačítka. | ||
- | Kapacitní snímač je řešen pomocí integrovaného obvodu AT42QT1011. Při dotyku je vyvoláno přerušení, které nastaví vlajku. Toho je využito v obsluze LED diod, kde dojde ke zvýšení intenzity svitu a zrychlení pulzování. Zde bylo zapotřebí pouze experimentálně zjistit hodnotu | + | Kapacitní snímač je řešen pomocí integrovaného obvodu AT42QT1011. Při dotyku je vyvoláno přerušení, které nastaví vlajku. Toho je využito v obsluze LED diod, kde dojde ke zvýšení intenzity svitu a zrychlení pulzování. Zde bylo zapotřebí pouze experimentálně zjistit hodnotu kondenzátoru, kterým byla ovlivněna citlivost tak, aby k detekci docházelo pouze při dotyku enkodéru. Funkčnost tohoto řešení lze vidět na konci demonstračního videa níže. |
+ | |||
+ | ==== Hlavní obslužný program ==== | ||
+ | |||
+ | V hlavní smyčce jsou 3 neblokující funkce: | ||
+ | <code c> | ||
+ | while (1) { | ||
+ | EncoderTask(); | ||
+ | LEDTask(); | ||
+ | ButtonTask(); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Funkce EncoderTask se stará o vyhodnocení otáčení rotačního enkodéru. To je řešeno pouhým načtením čítacího registru časovače TIM4. Vyhodnocení je řešeno porovnáním s minulou hodnotou s nastaveným prahem citlivosti. Aby vyhodnocování nedocházelo příliš často, je použito následující konstrukce zaručující neblokující čekání: | ||
+ | <code c> | ||
+ | static uint32_t delay = 18000; // Zpozdeni mezi vyhodnocenim | ||
+ | uint16_t i; // Aktualni hodnota citaciho registru | ||
+ | static uint16_t li; // Minula hodnota citaciho registru | ||
+ | |||
+ | delay--; | ||
+ | if(delay == 0) { | ||
+ | delay = 18000; | ||
+ | i = TIM4->CNT ; | ||
+ | |||
+ | if(li - i >= THRESHOLD) { | ||
+ | switch(MODE) { // Vyhodnoceni provedeni funkce na zaklade modu zarizeni | ||
+ | case MEDIA: | ||
+ | case SPOTIFY: | ||
+ | media(VOL_UP); | ||
+ | break; | ||
+ | case USER: | ||
+ | wheel(1); | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | li = i; | ||
+ | ... | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Stejná konstrukce je použita také ve funkci LEDTask starající se o obsluhu LED diod a tedy plnění časovače. Funkce ButtonTask zajišťuje ošetření zákmitů při stisku tlačítka a provedení dané funkce při korektním stisku. | ||
+ | |||
+ | Jak lze vidět z předcházejícího kódu, Zařízení pracuje ve 3 módech, které lze přepínat prvním tlačítkem, a které jsou signalizovány barvou podsvícení. Jedná se o módy Media, Spotify a User. V tabulce níže lze vidět funkce jednotlivých tlačítek: | ||
+ | |||
+ | ^ Mód ^ Barva podsvětlení ^ Rotační enkodér ^ Tlačítko 1 ^ Tlačítko 2 ^ Tlačítko 3 ^ Tlačítko 4 ^ | ||
+ | | Media | Modrá | Systémová hlasitost | Přepínání módů | Mute | Změna zvukové karty | Spuštění Spotify a přepnutí do tohoto módu | | ||
+ | | Spotify| Zelenomodrá | ::: | ::: | ::: | Play/Pause | Další skladba | | ||
+ | | User| Fialová | Kolečko myši | ::: | ::: | Spuštění Google Chrome | Spuštění kalkulačky | | ||
+ | |||
+ | ==== Pomocné funkce ==== | ||
+ | |||
+ | Jedná se především o podpůrné funkce zajišťující provedení zadané akce. Jde o odeslání specifického reportu pro jednotlivé akce po USB. | ||
+ | |||
+ | <code c> | ||
+ | void wheel(int8_t change); // Otočení kolečkem myši | ||
+ | void media(uint8_t change); // Zmáčknutí multimediální klávesy | ||
+ | void changeDevice(void); // Změna zvukového výstupu - klávesová zkratka | ||
+ | void runSpotify(void); // Spuštění Spotify | ||
+ | void runChrome(void); // Spuštění Google Chrome | ||
+ | void runCalc(void); // Spuštění kalkulačky | ||
+ | </code> | ||
+ | |||
+ | ===== Demonstrační video ===== | ||
+ | |||
+ | {{youtube>mtFv-kO_Qkk?medium}} | ||
+ | |||
+ | Zdrojová data: | ||
+ | {{ :2017:pc-app-ctrl:xraszk04_mpoa_projekt.zip |}} | ||
+ | |||
+ | ===== Závěr ===== | ||
+ | |||
+ | Zařízení je jak po hardwarové tak i po softwarové stránce funkční. Zbývají pouze kosmetické dokončovací práce typu finální broušení a namoření dřeva a instalace vyfrézovaných hmatníků. Úpravou jistě projde stojánek protože díky vyšší hmotnosti hmatníků tlačítek a celkově vyššímu těžišti zařízení nebylo dosaženo dostatečné stability. Překvapením byl kapacitní dotykový senzor, který přes mou počáteční nedůvěru funguje skvěle a díky tomu jsou v budoucnu možné úpravy kódu typ poklepání na enkodér jako stisk tlačítka myši apod. Dobrou volbou byl taky použitý optický rotační enkodér (přestože jde o čínský výrobek), díky jehož mechanické konstrukci bylo možné se vyvarovat složitých mechanických úprav. Zařízení je nyní ve fázi dlouhodobého testování, kdy bude třeba vypozorovat způsob využití a nejčastější úkony a případně optimalizovat program pro lepší uživatelský komfort. | ||
+ | |||
+ | ===== Zdroje ===== | ||
+ | |||
+ | USB HID Development on STM32 - [[http://andybrown.me.uk/2016/01/09/f042usbhid/]] | ||
+ | |||
+ | HID Consumer Device for volume control - [[http://www.microchip.com/forums/m618147.aspx]] | ||
+ | |||
+ | HID Descriptor Tool - [[http://www.usb.org/developers/hidpage/]] | ||
+ | |||
+ | AudioSwitch - [[https://github.com/sirWest/AudioSwitch]] |