Toto je starší verze dokumentu!
Realizujte s pomocí vývojové desky KL25Z prezentační HID zařízení. Zařízení by mělo mít funkci ukazovátka (na monitoru), listování v prezentaci, možnost zatmavení prezentace, případně další.
Autor: Miroslav Děcký
Cílem zadaného projektu je vytvořit zařízení připojitelné přes sběrnici USB k počítači pro potřeby počítačových prezentací realizovaných v programu MS PowerPoint. Tedy zařízení, které uživateli umožní prezentaci spustit, pohybovat se dopředu i zpět mezi snímky, zatmavit aktuální slide do černé a taktéž umožní uživateli zapnout integrované ukazovátko v PowerPointu.
Pro pohyb ukazovátka byl zvolen akcelerometr, díky kterému je možné nakláněním destičky docílit pohybu ukazovátka po monitoru.
Při vývoji reprezentant byly kromě vlastního HW a SW využit i následující prostředky:
Zadání specifikuje využití vývojové desky firmy NXP a to platformu Freedom ve velice známé verzi KL25z. KL25z je mikrokontrolér rodiny Kinetis s járdrem ARM Cortex-M0+.
Platforma freedom obsahuje arduino kompatibilní konektory. Rozložení pinů, na těchto konektorech je možné vidět na následujícím obrázku[1]:
Prezentér má umožnit použít ukazovátko, přepínat snímky, zapínat prezentaci, zatmavit prezentaci. K tomu je nutné mít dostatek tlačítek. na FRDM-KL25z je k dispozici pouze tlačítko reset, je tedy nutné vyrobit rozšiřující dceřinou destičku s tlačítky.
Schéma zapojení rozšiřující destičky je jednoduché, obsahuje dva samostatné hřebínkové konektory, jeden můžeme ponechat nezapojen, zajišťuje pouze stabilitu modulu, k druhému, jsou připojeny mikrospínače, celé schéma je zobrazeno na obrázku níže:
Výhodou kombinace THT hřebínků a SMD mikrotlačítek je, že výsledná destička je jednostranný plošný spoj. Kritické je dodržení rozteče konektorů. Potřebné rozměry jsou na obrázku plošného spoje okótovány níže.
Kompletní podklady (sch i brd soubory) jsou k dispozici ke stažení z [2].
Rozteč v ose X je brána jako rozteč děr. V ose Y je kótou zachycen střed prvních pinů obou hřebínků.
Je třeba si dát pozor na určité speciální piny, Piny vyvedení na tyto arduino konektory nejsou „volné“, ale mohou obsahovat například připojenou RGB led diodu, případně hodiny pro debugger. V první verzi DPS toto nebylo dodrženo a jedno tlačítko bylo spojeno právě s LED na destičce freedom. Tato chyba byla opravena, a výše prezentované schéma i PCB (případně data ke stažení) již tuto chybku neobsahují. Foto výsledného přípravku s KL25z je na obrázku níže, jedná se ovšem o první verzi,
Firma NXP dodává pro své mikrokontroléry knihovní balíček SDK. Tyto knihovní balíčky pro jednotlivé vývojové platformy, nebo čisté mikrokontroléry lze stahovat po registraci pomocí MCUXpresso aplikace z webu zde.
Součástí knihovního balíku pro FRDM-KL25z jsou taktéž demoaplikace. Pro implementaci USB HID zařízení je k dispozici několik aplikací. Jelikož prezentační zařízení využívá kromě tlačítek myši, taktéž klávesové zkratky klávesnice jako výchozí demoaplikace byla zvolena verze kompozitního zařízení MYŠ a KLÁVESNICE.
Každé funkce prezentéru odpovídá klávesová zkratka jednotlivé funkce shrnuje následující tabulka:
Tlačítko | Funkce | Klávesová zkratka |
---|---|---|
1. | Předchozí snímek | Levá šipka |
2. | Další snímek | Pravá šipka |
3. | Ukazovátko | Levé tlačítko myši |
4. | Spustit prezentaci | F5 |
5. | Začernění | B |
Prezentér pro pohyb ukazovátka po ploše prezentace využívá akcelerometru MMA8451Q, který je osazen na FRDM-KL25z.
Pro urychlení implementace pohybu myši, respektive ukazovátka, se pro obsluhu akcelerometru využila demoaplikace „BUBBLE“, využitím tohoto vzorového projektu se získalo základní nastavení a funkce pro vyčítání dat z akcelerometru.
Aplikace BUBBLE podle náklonu desky mění barvy RGB led. Pro potřeby použití bylo nutné tuto funkci upravit. Došlo k přenosu pouze inicializace akcelerometru, I2C a vyčítání dat do mého projektu. Náklon prezentéru převádí na pohyb do jednotlivých směrů následující kód:
/* Get the X and Y data from the sensor data structure in 14 bit left format data*/ xData = (int16_t)((uint16_t)((uint16_t)sensorData.accelXMSB << 8) | (uint16_t)sensorData.accelXLSB) / 4U; yData = (int16_t)((uint16_t)((uint16_t)sensorData.accelYMSB << 8) | (uint16_t)sensorData.accelYLSB) / 4U; if (xData > ANGLE_THRESHOLD){ dirUD = DOWN; }else if (xData < -ANGLE_THRESHOLD){ dirUD = UP; }else{ dirUD=STOP; } if (yData > ANGLE_THRESHOLD){ dirLR = LEFT; }else if (yData < -ANGLE_THRESHOLD){ dirLR = RIGHT; }else dirLR = STOP;
Proměnné dirLR a dirUD uchovávají aktuální požadavek na pohyb ve dvou osách, a jsou dále propagovány do obslužných funkcí USB aplikace. Původní myšlenka, že velikost náklonu by měnila rychlost pohybu kurzoru byla po otestování zavržena a ponechána rychlost posunu na pevnou hodnotu. V budoucnu by bylo možné otestovat změnu rychlosti posunu na dotykovém slideru.
Pro obsluhu tlačítek, byla napsána následující funkce. Tlačítka jsou obsluhovány tak, aby bylo nutné pro listování prezentací opakovaně mačkat tlačítka. Díky této úpravě, je možné minimalizovat ochrannou dobu pro detekci stisku a zároveň předejít nechtěnému listování o více listů prezentace:
if (is_time_now(true, &delay1, delay_button_sample)) { if (!GPIO_ReadPinInput(PLUG_BOARD_GPIO, SW_PREV_PIN)) {// previsou slide if (keyboard_release){ // detect release key = KEY_LEFTARROW; keyboard_release = 0; }else key = STOP; }else if (!GPIO_ReadPinInput(PLUG_BOARD_GPIO, SW_NEXT_PIN)) {// next slide if (keyboard_release){ // detect release key = KEY_RIGHTARROW; keyboard_release = 0; }else key = STOP; } else if (!GPIO_ReadPinInput(PLUG_BOARD_GPIO, SW_GO_PRES_PIN)) {// Presentation ON if (keyboard_release){ // detect release key = KEY_F5; keyboard_release = 0; }else key = STOP; }else if (!GPIO_ReadPinInput(PLUG_GO_BLACK_GPIO, SW_GO_BLACK_PIN)) {//Blackout if (keyboard_release){ // detect release key = KEY_B; keyboard_release = 0; }else key = STOP; } else { keyboard_release = 1; key = STOP; }
Obsluha tlačítka ukazovátka má specifickou obsluhu.
Pro zapnutí funkce ukazovátka je nutné držet levé tlačítko myši >1s a po dobu ukazování neuvolnit. Tento přístup se mi jeví jakožto nevhodný. Z tohoto důvodu důvodu je implementována logika, klopného obvodu, kdy první stisk tlačítka aktivuje „levé tlačítko myši“ a až následující stisk tuto funkci uvolní - není tedy nutné při prezentaci křečovitě držet mikrospínač.
if (!GPIO_ReadPinInput(PLUG_BOARD_GPIO, SW_LEFT_BUTTON_PIN)) {//Pointing function if(mouse_release){ mouse_release = 0; if( mouse_button == LEFT){ mouse_button = STOP; } else mouse_button = LEFT; } }else{ mouse_release = 1; } }
Takto předpřipravená data jsou dále předávána do aplikace pro obsluhu USB HID zařízení, které posílá data do počítače.
FRDM-KL25z je osazena dvěma USBmini konektory, jeden slouží pro programování, případně sériovou komunikaci s KL25 a druhý je vyveden přímo z USB periferie mikrokontroléru KL25z.
Jako výchozí bod, pro implementaci kompozitního USB HID zařízení posloužil demonstrační projekt z knihovního balíku SDK2.2. Tento projekt pohyboval kurzorem myši po monitoru ve tvaru obdélníka a pomocí kláves PAGE UP a PAGE DOWN pohyboval stránkou nahoru a dolů.
Celá aplikace s USB HID funkcionalitou byla implementována do předpřipravené části projektu s tlačítky a akcelerometrem.
Následovalo otestování funkčnosti obou spojených funkcí, po této fázi, došlo k upravě funkcí pro zasílání dat skrz USB:
#define MOVEMENT_SPEED 2 /* Update mouse pointer location.*/ static usb_status_t USB_DeviceHidMouseAction(void) { switch (mouse_button) { case LEFT: /*LEFT click*/ g_UsbDeviceHidMouse.buffer[0] = 1U; break; case RIGHT: /*right click*/ g_UsbDeviceHidMouse.buffer[0] = 2U; break; case STOP:/*NO click*/ g_UsbDeviceHidMouse.buffer[0] = 0U; break; default: break; } switch (dirUD) { case STOP:/* STOP */ g_UsbDeviceHidMouse.buffer[2] = 0U; break; case DOWN:/* Move down. Increase Y value. */ g_UsbDeviceHidMouse.buffer[2] = MOVEMENT_SPEED; break; case UP: /* Move up. Discrease Y value. */ g_UsbDeviceHidMouse.buffer[2] = (uint8_t)(-MOVEMENT_SPEED); break; default: break; } switch (dirLR) { case LEFT: /* Move left. Discrease X value. */ g_UsbDeviceHidMouse.buffer[1] = (uint8_t)(-MOVEMENT_SPEED); break; case RIGHT: /* Move right. Increase X value. */ g_UsbDeviceHidMouse.buffer[1] = MOVEMENT_SPEED; break; case STOP: /* STOP */ g_UsbDeviceHidMouse.buffer[1] = 0U; break; default: break; } /* Send mouse report to the host */ return USB_DeviceHidSend(g_UsbDeviceComposite->hidMouseHandle, USB_HID_MOUSE_ENDPOINT_IN, g_UsbDeviceHidMouse.buffer, USB_HID_MOUSE_REPORT_LENGTH); }
Jak je vidět z kódu výše, případné rozšíření na dynamickou změnu rychlosti pohybu kurzoru není problém. Postačí místo konstanty použít proměnnou.
Předložený projekt prezentačního zařízení se podařilo dokončit do plně použitelného stavu. Hlavním problémem zůstávají použité klávesové zkratky, při vývoji jsem nalezl na stránkách podpory office, že zatmavení prezentace pro office 2007 a vyšší je klávesová zkratka „B“ a opětovným stiskem „B“ dojde k návratu. Při vývoji byl použit PowerPoint verze 2016 a toto chování se potvrdilo.
Bohužel, na některých PowerPointech tato zkratka není plně funkční, návrat z černé obrazovky je možný stiskem libovolného tlačítka pro pohyb v prezentaci (tj 1. nebo 2.) tento stisk způsobí návrat do prezentace, nikoliv její přelistování. Důvod je mi neznámý, bohužel vlastní zařízení s tímto chování nemám.
Při testování funkčnosti (Viz video výše) si můžete povšimnout relativity času, kdy „stisk delší než 1s“ je opravdu nepříjemně dlouhá doba pro zapnutí ukazovátka. Pohyb pomocí akcelerometru je bezproblémový, jen vyžaduje trochu cviku, přesnost pohybu s laserovým ukazovátkem nelze srovnávat.
Zařízení je tedy po otestování plně funkční, základní účel plně splnilo - otestovat možnosti USB HID Demoaplikace pro potřeby mé diplomové práce. Největší očekávání jsem měl k ukazovátku, které by umožnilo být při prezentaci čelem k publiku, bez nutnosti otáčet se na projekční plochu, ovšem rychlost a přesnost ukazování je u laserového ukazovátka výrazně lepší.
[1] Obrázek arduino konektory: https://os.mbed.com/media/uploads/GregC/frdm-kl25z_headers2.png
[2] Podkldady pro výrobu plošného spoje s tlačítky ke stažení: XXXXX