Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2017:hid-prez

Zadání

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ý


Úvod

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.


Použité prostředky

Při vývoji prezentéru byly kromě vlastního HW a SW využity i následující prostředky:

  • IAR Embedded Workbench 7.80.4
  • Integrovaný PE Micro debugger na KL25z
  • Balík knihoven SDK 2.2
  • Vývojový kit FRDM-KL25z
  • MS PowerPoint 2016

Vývoj HW

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]:

Rozšiřující destička

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.

Seznam součástek:

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 v programu Eagle 6.6.0 jsou k dispozici ke stažení.

prezenter_vyrobni_podklady.zip

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 vždy „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.


Vývoj SW

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.

Funkce prezentéru

Každé funkci 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 rychlost posunu ponechána na pevnou hodnotu. V budoucnu by bylo možné otestovat změnu rychlosti posunu na dotykovém slideru.

Makro ANGLE_THRESHOLD slouží pro nastavení oblasti, kdy má kurzor stát, jedná se tedy o citlivost na malý náklon. Díky řešení pomocí makra je možné jednoduchou změnou z jednoho místa ovlivnit všechny směry současně.

Pro obsluhu tlačítek byla napsána následující funkce. Tlačítka jsou obsluhována 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. Tato logika obsluhuje pouze tlačítka pro listování v prezentaci, její spuštění a zatmavení. Tlačítko ukazovátka má zvláštní obsluhu, viz dále.

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 podobu.

Pro zapnutí funkce ukazovátka je nutné držet levé tlačítko myši >1s a po celou dobu ukazování neuvolnit. Tento přístup se mi jeví jakožto nevhodný. Z tohoto 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 části aplikace pro obsluhu USB HID zařízení, která posílá data do počítače.

Celý výše uvedený kód se odehrává v hlavní smyčce programu.

USB HID

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 je v případě požadavku na toto chování možné.

Kompletní projekt prezentéru ve vývojovém prostředí IAR 7.80.4 je k dispozici ke stažení: prezenter_iar.zip


Video s demonstrací funkčnosti

Pro demonstraci funkčnosti jsem natočil následující video.


Závěr

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ší.


Použité zdroje a odkazy

2017/hid-prez.txt · Poslední úprava: 2018/01/14 20:28 autor: Miroslav Děcký