Arduino a Tcl/Tk, časť 3 - HMI - klávesnica

Arduino a Tcl/Tk, časť 3 - HMI - klávesnica 
Richard Fabo Autor  Richard Fabo
  118 zobrazení
1
 0
Arduino a...
 Fórum

Dizajn a funkcionalitu vzdialenej HMI obrazovky pre arduino máme zvládnutú. Dnes si ukážeme, ako na dotykovej obrazovke zadávať údaje pomocou virtuálnej klávesnice.

Obsah minulej časti

V minulej, teda druhej časti sme si vytvorili grafický interfejs a.k.a. HMI v jazyku Tcl/Tk. Dnes si k nemu pridáme ešte virtuálnu klávesnicu.

Klávesnice takové i makové

Keďže naše HMI beží v spolupráci s Raspberry Pi, tak najjednoduchším riešením by bolo pripojenie USB klávesnice. Alebo hoci aj nejakej malej bluetooth klávesnice, aké existujú pre chytré TV. To by fungovalo bez problémov. Ale keď už máme tú dotykovú vrstvu, škoda by bolo používať na občasné zadanie parametrov nejaké ďalšie zariadenie. Najmä, ak v priemyselných strojoch existuje prax, že sa spravia nejaké nastavenia a predvoľby a tie sa potom používajú bez ďalších, alebo len veľmi zriedkavých úprav.

Onboard klávesnica

Virtulánych klávesníc existuje pre Raspberry Pi niekoľko. Námatkou spomeňme Florence alebo Matchbox. Ale najviac sa mi páči Onboard. Je veľmi konfigurovateľná a je v repozitároch operačného systému.

Nainštalujeme ju známym postupom:

sudo apt install onboard

V hlavnom menu v sekcii "Pre postihnutých" ju nájdeme pod názvom "Klávesnica na obrazovke". Teda v slovenskej mutácii Raspbianu (snímky obrazovky sú v VNC klienta v nenatívnom rozlíšení obrazovky).

Obr. 0: Spustenie virtuálnej klávesnice

Ak sa ju nepodarí spustiť, spustíme ju z emulátora terminálu a pravdepodobne nám bude chýbať at-spi2-core, ktoré doinštalujeme:

sudo apt install at-spi2-core

A do tretice, ak chceme, aby nám obrazovka "vyskakovala", ak sme v editačnom dialógu, doinštalujeme mousetweaks:

sudo apt install mousetweaks

Spustíme si potom náš program, klikneme do editačného okienka spinbox-u a… nič sa nedeje, klávesnica "nevyskočí", aj keď je spustená. A pritom, v textovom editore to ide… tak kde je problém?

Obr. 1: V textovom editore "mousepad" to funguje…

No problém spočíva v tom, že samotný balík AT-SPI, ktorý zahrňuje asistenčné technológie (patria tu lupy, čítačky obrazovky, klávesnice na obrazovke, braillovo písmo…) používa tzv. D-Bus, čo je spôsob vzájomnej komunikácie aplikácií. A to ide - keďže je to "dieťa" GNOME - ak sa využíva toolkit GTK. Ale Tcl/Tk používa toolkit Tkinter, a ten D-Bus nevie detegovať. Preto nám neostáva nič iné, len to nejako priohnúť

Program v Tcl/Tk

Riešenie je pomerne jednoduché - zistiť, či sa kliklo na editačné pole, a ak áno, tak klávesnicu spustiť. Zadefinujeme si pár premenných:

set prikazKlavesnice "onboard &"
set timeoutKillKeyboard 10000

Premenná prikazKlavesnice definuje samotnú spustiteľnú binárku, ak je klasicky (čo na 99% bude) v /usr/bin, a toto je definované v globálnych nastaveniach ciest v operačnom systéme, tak nie je potrebné určiť presnú cestu. & na konci je tam samozrejme preto, aby sa program spustil na pozadí. Premenná timeoutKillKeyboard definuje čas v ms, po ktorom sa, ak sa klávesnica nepoužíva, schová. Ďalšie procedúry sú zrejmé z opisu či názvu:

proc killProcessKeyboard {} {
    global prikazKlavesnice
    set prikazKill "killall "
    append spojene $prikazKill $prikazKlavesnice
    exec {*}$spojene
}


proc onSpinBoxClick {} {
    global prikazKlavesnice timeoutKillKeyboard
    set prikazGrep "ps ax | grep -c "
    append spojene $prikazGrep $prikazKlavesnice
    set psOutput [exec {*}[string replace $spojene end-1 end ""]]
    if {$psOutput ne "1"} {
      puts "Program už beží!"
    } else {
      puts "Program ešte nebeží!"
      exec {*}$prikazKlavesnice
      after $timeoutKillKeyboard killProcessKeyboard
    }
}

Procedúra killProcessKeyboard zabije zobrazenú klávesnicu, procedúra onSpinBoxClick ju naopak zobrazí, ak sa do neho klikne. Napohľad nepekná konštrukcia [exec {*}[string replace $spojene end-1 end ""]] spôsobí to, že zo spojeného reťazca, v ktorom je názov bežiaceho procesu a tiež príkaz grep -c, na zistenie počtu inštancií klávesnice, odreže & na konci. Následne porovnáva, koľko týchto grep-ov našiel. Len na okraj - vždy nájde o jeden viac - pretože nájde aj samotný proces oného aktuálneho grep-u. A niekde to definície dizajnu okna vložíme samotné prepojenie udalosti kliknutia na samotný prvok, teda náš spinBox.

bind .spinInterval {onSpinBoxClick}

No a takto to (neprekvapivo) vyzerá v praxi:

Obr. 2: HMI a zobrazená klávesnica

Obr. 2a: HMI a iný dizajn klávesnice

Obr. 2b: Fotka z reálneho života

Klávesnica i rozloženie môže mať kdejaký dizajn, výber je bohatý a dá sa všemožne upraviť. Napr. na dizajn kultovej klávesnice IBM Model M.

Odkaz na stiahnutie: https://gitlab.com/tcl-tk-public/arduino-hmi-lan

(priamy odkaz: https://gitlab.com/tcl-tk-public/arduino-hmi-lan/-/blob/main/arduino_RPi_LAN_klavesnica.tcl)

Obsah ďalšej časti

Aby sme si prácu pri zobrazovaní požiadaviek arduina voči HMI zjednodušili, plánujem vytvoriť knižnicu (knižnice), ktoré budú používaním blízke ovládaniu LCD displeja. Takže nejaká alternatíva k lcd.print() či lcd.setCursor(cols, rows).

No uvidíme, ako sa to podarí.

Happy hacking!


ElektroLab potrebuje aj vašu pomoc / ElektroLab also needs your help
Podpor nás!   Support us!


Páčil sa Vám článok? Pridajte k nemu hodnotenie, alebo podporte jeho autora.
 

       

Komentáre k článku

Zatiaľ nebol pridaný žiadny komentár k článku. Pridáte prvý? Berte prosím na vedomie, že za obsah komentára je zodpovedný užívateľ, nie prevádzkovateľ týchto stránok.
Pre komentovanie sa musíte prihlásiť.

Vaša reklama na tomto mieste



Vyhľadajte niečo na našom blogu

Máte záujem o reklamu?

PCBWay Promo

Máte záujem o reklamu?

PCBWay Promo

Máte záujem o reklamu?

PCBWay Promo

🎨 Rezistor
Pásiky: 4
Výsledok: 0.00 Ω ±1%
🔗 Zdieľať widget

💡 Vedeli ste, že…


Webwiki Button