PM Macropad

Introducere

Proiectul consta in crearea unei tastaturi mecanice 6×6 pentru macro-uri. Tastatura va comunica cu PC-ul prin USB si va trimite fiecare keypress unui client de pe PC. In functie de modul in care a fost configurat, clientul va putea efectua diferite actiuni pentru tasta apasa. Spre exemplu, daca apasam tasta C, se va lansa aplicatia de calculator.

Motivul Pentru care am ales acest proiect este faptul ca ma pasioneaza tastaturile mecanice si voiam de o vreme sa incerc sa creez una hand-wired.

Descriere generala

Switch-urile sunt aranjate sub forma de matrice (6×6) si legate intre ele pe randuri si pe coloane (cu o dioda la iesirea din fiecare switch pentru a nu a avea ghosting).

Microcontroller-ul activeaza pe rand fiecare coloana si citeste de pe fiecare linie (sau invers). Dupa scanarea matricei, in memoria microcontroller-ului se afla toate tastele apasate. Client-ul de pe PC va face query-uri catre tastatura pentru a afla starea acesteia si–in functie de ce taste sunt apasate–va lua actiunile programate pentru tastele respective.

Hardware Design

Lista de piese:

  • Placuta PM
  • Cabluri de cupru
  • 36x switch-uri Kailh Speed Bronze
  • 36x diode 1N4148
  • Switch-place fabricat din aluminiu
  • Carcasa fabricata din lemn
  • Suruburi pentru montare

Schema electrica:

Software Design

Tastatura are doua moduri de functionare. Primul mod este modul HID, in care tastatura functioneaza ca o tastatura normala. In al doilea mod (VENDOR), tastatura asteapta mesaje de control de la un soft host-side si ii trimite starea curenta a butoanelor acestui soft. Acest mod este folosit pentru implementarea macro-urilor. Soft-ul host-side–pe baza butoanelor apasate–lanseaza scripturi. Aceste scripturi sunt custom si pot sa faca ce vrea utilizatorul.

Am folosit biblioteca V-USB pentru a adauga functionalitate de USB tastaturii.

Fisierul keydefs.h contine definitii de taste conform standardului HID pentru tastaturi.

Fisierul macropad.c contine restul firmware-ului. In cod se intampla urmatoarele lucruri:

  • Se initializeaza USB-ul
  • Se deconecteaza dispozitivul (pentru a forta re-enumerarea)
  • Se reconecteaza dispozitivul
  • Se intra intr-o bucla infinita care face urmatoarele:
    • Citeste starea butoanelor. Acest lucru se face prin activarea pe rand a fiecarui rand din matrice (prin trecerea dintr-o stare de impedanta marita (mod input, fara rezistente de pull-ul) intr-o stare in care pin-ul este conectat la ground (mod output, valoare 0). Pentru fiecare rand, se citeste valoarea pe fiecare coloana si starea butoanelor este scrisa intr-un buffer.
    • Se construieste report-ul HID.
    • Se trimite o intrerupere USB care host cu report-ul construit.

In afara de main, o alta parte din functionalitate este implementata in functia usbFunctionSetup. Aceasta este un call-back apelat de V-USB atunci cand este primit un request. Functia trateaza request-urile pentru clasa HID (get_report, set_report (folosit pentru setarea starii LED-urilor), get_idle si set_idle) si request-uri de tip vendor. Requesturile de tip vendor sunt urmatoarele:

  • VREQ_STATUS – intoarce modul in care opereaza curent tastatura.
  • VREQ_GET_BUTTONS – intoarce butoanele apasate.
  • VREQ_SET_STATUS_HID – spune tastaturii sa comute in primul mod.
  • VREQ_SET_STATUS_VENDOR – spune tastaturii sa comute in al doilea mod.
  • VREQ_TOGGLE_STATUS – spune tastaturii sa comute intre primul si al doilea mod.

Pe partea de host am un daemon care asteapta ca device-ul sa se conecteze. Dupa ce acesta s-a conectat, daemon-ul ii interogheaza starea la fiecare secunda. Daca constata ca tastatura a trecut in modul al doilea (VENDOR), cere starea butoanelor (la fiecare 50ms) si executa scripturi in functie de ce butoane sunt apasate.

Pentru comutarea intre moduri, am un script care se conecteaza la tastatura si ii trimite request-ul VREQ_TOGGLE_STATUS.

Pentru mai multe informatii vis-a-vis de implementare, cititi comentariile din cod.

Rezultate Obţinute

Rezultatul final:

Urmeaza un build-log:

Concluzii

Chiar mi-a placut acest proiect (in ciuda faptului ca a fost un money-sink colosal). Am invatat lucruri despre programarea embedded, despre lipit piese si suficient de multe lucruri despre USB.

Download

Bibliografie/Resurse

pm/prj2019/amocanu/pm_macropad.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0