Table of Contents

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:

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:

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:

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