Indholdsfortegnelse:

Håndholdt genvejskontroller (til Photoshop + mere) [Arduino]: 4 trin
Håndholdt genvejskontroller (til Photoshop + mere) [Arduino]: 4 trin

Video: Håndholdt genvejskontroller (til Photoshop + mere) [Arduino]: 4 trin

Video: Håndholdt genvejskontroller (til Photoshop + mere) [Arduino]: 4 trin
Video: Сравнение Hasselblad X2D 100C vs Hasselblad X1D 50C II Subtitles Большой обзор и личный опыт ! 2024, Juli
Anonim
Håndholdt genvejskontroller (til Photoshop + mere) [Arduino]
Håndholdt genvejskontroller (til Photoshop + mere) [Arduino]

Sidste gang lavede jeg en lille kontrolplade til brug i Photoshop. Det gjorde underværker, og jeg bruger det stadig! Men det er også temmelig begrænset, med kun fem knapper og de nyttige størrelses- og opacitetskiver. Jeg fandt stadig ud af at jeg nåede meget efter tastaturet …

Så jeg begyndte at arbejde på den næste iteration af kontrolpladen, en med langt flere knapper og funktionalitet. En betjeningspude til at styre dem alle.

Dette er ikke den kontrolpude. MEN på en måde kan det være bedre.

Hvad hvis du kunne have masser af genveje, men i en super tæt og let pakke kan du holde med din frie hånd, mens du tegner uafbrudt? … ok, nok med infomercial.

Denne controller er programmeret på en måde, så den med bare 4 knapper kan kortlægges til op til 32 mulige genveje! Den ekstra femte knap er der for at tillade mig at bruge ændringstaster i enhver kombination, hvilket er nyttigt for mange programmer (har du nogensinde prøvet Alt-RMB-kombinationsboksen i PS? Hvis du ikke har gjort det, skal du gøre det. Det er en livredder). Jeg forklarer systemet senere.

For at lave alt dette skal du bruge:

  • 1 mikrokontroller (jeg brugte en Adafruit ItsyBitsy 32u4, men enhver skal gøre det, så længe den har atmega32u4 -chippen)
  • 1 mikro-USB-adapter (data, ikke kun strøm)
  • 5 trykknapper (jeg brugte bløde, som disse)
  • 10k Ohm modstande (1 pr. Knap)
  • Tråde, brødbræt, loddemateriale osv.
  • Noget at lave et kabinet med (3D -printer osv.)

Dette er et mellemliggende niveau Arduino-projekt, og jeg foreslår, at du ser på min tidligere tutorial for bedre at forstå, hvad der foregår, da meget af dette er en gentagelse af de ting, jeg forklarede der.

Ok, lad os komme i gang!

Trin 1: Planlægning

Planlægning
Planlægning

Dette er en grundlæggende skematisk tegning af controlleren. Kredsløbet er virkelig simpelt, når du sammenligner det med mit tidligere projekt! Men vi vil være i stand til at gøre meget mere med de få knapper, den har, med kraften i kombinerede tryk!

Ideen bag kontrolordningen er, at hver knap enten kan være fri, trykkes og slippes eller trykkes og holdes nede. Ved at trykke og slippe er det, der faktisk aktiverer genvejen, mens du holder knapperne nede, giver os adgang til forskellige genveje. Så hvis du bare trykker på knap A, aktiverer du genvej A, men hvis du holder B nede, når du trykker på A, får du en anden genvej. Du kan holde op til 3 knapper på én gang, mens du trykker på, så når du anvender nogle grundlæggende kombinatorik, vil du se, hvor mange kombinationer der er mulige med dette system!

Den ekstra femte knap føltes som en naturlig tilføjelse i betragtning af formen på den håndholdte, jeg kom på. Jeg besluttede mig for at bruge den til at få adgang til ændringsnøgler i Photoshop. Den måde, det fungerer på, er lidt anderledes end de andre knapper: Når tommelfingerknappen holdes inde, bruges der kun modifikatorer. Disse aktiveres, når de holdes inde, og der kan trykkes på flere. Så hvis knap A er Skift, og knap B er Ctrl, når du holder A og B nede, vil det være som at trykke på både Skift og Ctrl, men kun så længe tommelfingerknappen holdes nede!

Skallen er designet til at være både ergonomisk og ambidextrous. Jeg var meget omhyggelig med at få den til at sidde tæt, så det ikke er for kedeligt at bruge lillefingeren, og det burde også fungere for dem med hænder større end mine.

Trin 2: Prototype + kode

Prototype + kode
Prototype + kode

Det er god praksis at teste knapperne på et brødbræt. Det er ret enkelt, bare tilslut knapperne og modstandene som vist. Du kan teste den med koden her (alternativ til pastebin link):

#omfatte

// brug vthisv -indstilling til MacOS:

// char ctrlKey = KEY_LEFT_GUI;

// brug vthisv til Windows og Linux:

char ctrlKey = KEY_LEFT_CTRL; char shiftKey = KEY_LEFT_SHIFT; char altKey = KEY_LEFT_ALT;

// Funktionstaster her

char Fn1Key = KEY_F2; char Fn2Key = KEY_F3; char Fn3Key = KEY_F4; char Fn4Key = KEY_F5;

const int pins = {9, 10, 11, 12, 13}; // array af alle knapnåle

//Følsomhed

const int THRESH_0 = 10; const int THRESH_1 = 20; const int THRESH_2 = 25; const int THRESH_3 = 50; const int THRESH_4 = 100; const int THRESH_5 = 200;

const int BUTTON_NUM = 5;

// Frys rammer

const int DELAY = 0;

enum Stater {befriet, presset, holdt, frigivet};

struktur -knap {

int pin; Stater oplyser; int timeHeld; }; // tommelfinger, indeks, midten, ring, lille;

knapknapper [BUTTON_NUM] = {};

knap initButton (int p) {

knap b; pinMode (p, INPUT); b.pin = p; b.stat = stater:: frigivet; b.timeHeld = 0; returnere b; }

ugyldig opsætning () {

// sæt din opsætningskode her for at køre en gang: Serial.begin (9600); Keyboard.begin ();

mens (! Seriel) {};

// Knapper til (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("indstillingsknap"); Serial.print (i); Serial.print ("ved pin:"); Serial.println (pins ); //knapper .pin = 1; knapper = initButton (pins ); Serial.println (knapper .pin); }

}

bool readButton (int pin) {

// tjek og debounce knapper hvis (digitalRead (pin) == HIGH) {forsinkelse (10); hvis (digitalRead (pin) == HIGH) {return true; }} returner falsk; }

int pintobin (int pin) {

hvis (pin == pins [0]) returnerer 1; hvis (pin == pins [1]) returnerer 10; hvis (pin == pins [2]) returnerer 100; hvis (pin == pins [3]) returnerer 1000; hvis (pin == pins [4]) returnerer 10000; } knap buttonStateUpdate (knap b) {

bool press = readButton (b.pin);

switch (b.state) {case States:: freed: b.timeHeld = 0; hvis (tryk) b.state = States:: presset; pause; etui trykket: b.timeHeld+= 1; hvis (tryk) {if (b.timeHeld> (THRESH_1/(1+DELAY))) {b.state = States:: holdt; }} andet {// if (b.timeHeld

int getButtonStateCode (knap b)

{return b.state*pintobin (b.pin); }

int getCodeByButton (int -kode, int -indeks) {

int r1, r2, r3, r4, r5; int opStep = BUTTON_NUM - (1+indeks);

// første operation

hvis (opStep == 0) returkode/10000; r1 = kode%10000;

hvis (opStep == 1)

retur r1/1000; r2 = r1%1000; hvis (opStep == 2) returnerer r2/100; r3 = r2%100; hvis (opStep == 3) returnerer r3/10; r4 = r3%10; hvis (opStep == 4) returnerer r4/1; r5 = r4%1; }

void completePress (int pin) {

// Serial.print ("input"); // Serial.println (pin); forsinkelse (THRESH_3); Keyboard.releaseAll (); }

void doAction (int code) {

// Modifikatorer hvis (getCodeByButton (kode, 0) == 2) {// Serial.println ("--- modifikatorer ----"); hvis (getCodeByButton (kode, 1)> 0) {Keyboard.press (altKey); // Serial.println ("------- alt ---------"); } ellers Keyboard.release (altKey); hvis (getCodeByButton (kode, 2)> 0) {Keyboard.press (ctrlKey); // Serial.println ("-------- ctrl ----------"); } ellers Keyboard.release (ctrlKey); hvis (getCodeByButton (kode, 3)> 0) {Keyboard.press (''); } ellers Keyboard.release (''); hvis (getCodeByButton (kode, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ skift ------"); } ellers Keyboard.release (shiftKey); } andet {

// udføre opgaver

switch (kode) {case 30: // --- | Brush Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (kode); pause; sag 300: // --- | Viskelæder Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (kode); pause; sag 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (kode); pause; sag 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (kode); pause; sag 320: //-| o Fortryd tastatur. tryk (ctrlKey); Keyboard.print ('z'); completePress (kode); pause; sag 3020: //-| -o Redo Keyboard.press (ctrlKey); Keyboard.print ('y'); completePress (kode); pause; case 30020: // | --o History Keyboard.press (shiftKey); Keyboard.print ('y'); completePress (kode); pause; sag 230: //-o | Gem tastatur. Tryk (ctrlKey); Keyboard.print ('s'); completePress (kode); pause; case 3200: //- | o- Quick-p.webp

int buttonCode = 0;

for (int i = 0; i <BUTTON_NUM; ++ i) {knapper = buttonStateUpdate (knapper ); buttonCode+= getButtonStateCode (knapper ); }

hvis (buttonCode! = 0) {

Serial.print ("knapkode:"); Serial.println (buttonCode); }

doAction (buttonCode);

// sæt din hovedkode her for at køre gentagne gange: // for (int i = knapper [0]; i <sizeof (knapper)/sizeof (knapper [0])+knapper [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

hvis (getCodeByButton (buttonCode, 0)! = 2)

Keyboard.releaseAll ();

forsinkelse (DELAY);

}

Der er ikke meget at sige om logikken, da den ligner min sidste controller, med to bemærkelsesværdige forskelle:

  1. Knapperne er strukturer med deres egne statsmaskiner
  2. Staterne summeres sammen for at lave en kode, der bestemmer handlingen

Princippet ligner bit-shifting, men fordi knapperne har flere tilstande og ikke bare kan repræsenteres med en binær, multipliceres de med power i stedet for ti. Jeg lægger derefter alle knaptilstande sammen til et enkelt tal og sender det videre til doAction () switch -sætningen, hvor jeg sætter alle genvejskoder.

Som du kan se, kortlagde jeg ikke alle mulige kombinationer. Jeg har kun tilføjet et par af mine yndlingsgenveje, jeg lader det være op til dig at udfylde resten, hvordan du bedst synes;)

Trin 3: Kabinettet

Kabinettet
Kabinettet
Kabinettet
Kabinettet
Kabinettet
Kabinettet

Jeg brugte en 3D -printer til kabinettet. Som du kan se, har designet nogle fejl, og jeg var nødt til at MacGyver en måde at bare lukke det. Så jeg sender ikke modelfilen endnu.

Knapperne varmlimes på "bænke", så de holder hætterne på plads. De bløde trykknapper er især gode til det, så sørg for at få nogle af dem, hvis du planlægger at lave en sag, der ligner min.

Jeg foreslår også, at du tilføjer lidt vægt inde i kassen, da den er meget let. De ekstra gram får det til at føles mere naturligt.

Lod alt som vist, og tilslut usb -kablet, og alt skal passe på plads (ved hjælp af lidt lim)!

Trin 4: Resultat og mulige forbedringer

Resultat og mulige forbedringer
Resultat og mulige forbedringer
Resultat og mulige forbedringer
Resultat og mulige forbedringer
Resultat og mulige forbedringer
Resultat og mulige forbedringer

Der har du det! En håndholdt controller, du kan bruge til at få adgang til alle dine vigtige genveje med bare en hånd!

Det kræver lidt muskelhukommelse at bruge, men det er virkelig alsidigt!

Selvfølgelig er det ikke perfekt, og lige nu tænker jeg på nogle måder at forbedre det på. Bortset fra at forbedre kabinettet og tilføje genveje, tror jeg, at jeg ville være interessant at understøtte flere applikationer med forskellige genveje. Jeg tænker på at have en knapkombination til at skifte mellem kontrolordninger, som at trykke på 4 knapper på samme tid for at skifte mellem et Photoshop-genvejsbibliotek til en skræddersyet til Maya.

Bare nogle ideer.

Tak fordi du læste, indtil næste gang!

Anbefalede: