Innholdsfortegnelse:

Håndholdt snarvei -kontroller (for Photoshop + mer) [Arduino]: 4 trinn
Håndholdt snarvei -kontroller (for Photoshop + mer) [Arduino]: 4 trinn

Video: Håndholdt snarvei -kontroller (for Photoshop + mer) [Arduino]: 4 trinn

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

Sist gang lagde jeg en liten kontrollpute til bruk i Photoshop. Det gjorde underverker, og jeg bruker det fortsatt! Men det er også ganske begrenset, med bare fem knapper og de nyttige størrelsene og opasitetsskiven. Jeg fant fremdeles ut til å strekke meg mye etter tastaturet …

Så jeg begynte å jobbe med neste iterasjon av kontrollputen, en med mange flere knapper og funksjonalitet. En kontrollpute for å styre dem alle.

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

Hva om du kunne ha massevis av snarveier, men i en supertørr og lett pakke kan du holde med din frie hånd mens du tegner uavbrutt? … ok, nok med infomercial.

Denne kontrolleren er programmert slik at den med bare 4 knapper kan kartlegges til opptil 32 mulige snarveier! Den ekstra femte knappen er der for å tillate meg å bruke modifikatornøkler i en hvilken som helst kombinasjon, noe som er nyttig for mange programmer (har du noen gang prøvd Alt-RMB-kombinasjonen i PS? Hvis du ikke har gjort det, er det en redning). Jeg forklarer systemet senere.

For å lage alt dette trenger du:

  • 1 mikrokontroller (jeg brukte en Adafruit ItsyBitsy 32u4, men alle bør gjøre så lenge den har atmega32u4 -brikken)
  • 1 mikro-USB-adapter (data, ikke bare strøm)
  • 5 trykknapper (jeg brukte myke, som disse)
  • 10k Ohm motstander (1 per knapp)
  • Ledninger, brødbrett, loddemateriale, etc.
  • Noe å lage et hus med (3D -skriver, etc.)

Dette er et Arduino-prosjekt på mellomnivå, og jeg foreslår at du ser på tidligere opplæring for å bedre forstå hva som skjer, ettersom mye av dette er en gjentakelse av tingene jeg forklarte der.

Ok, la oss komme i gang!

Trinn 1: Planlegging

Planlegger
Planlegger

Dette er en grunnleggende skjematisk tegning av kontrolleren. Kretsen er veldig enkel når du sammenligner den med mitt forrige prosjekt! Men vi vil kunne gjøre mye mer med de få knappene den har, med kraften i kombinerte trykk!

Tanken bak kontrollopplegget er at hver knapp enten kan være gratis, trykkes og slippes, eller trykkes og holdes inne. Å trykke og slippe er det som faktisk vil aktivere snarveien, mens du holder inne knappene vil gi oss tilgang til forskjellige snarveier. Så hvis du bare trykker på knapp A, aktiverer du snarvei A, men hvis du holder B når du trykker på A, får du en annen snarvei. Du kan holde opptil 3 knapper samtidig mens du trykker, så når du bruker noen grunnleggende kombinatorikk, vil du se hvor mange kombinasjoner som er mulig med dette systemet!

Den ekstra femte knappen føltes som et naturlig tillegg, gitt formen på den grafregneren jeg kom på. Jeg bestemte meg for å bruke den for å få tilgang til modifikatornøkler i Photoshop. Måten den fungerer på er litt annerledes enn de andre knappene: Når tommelknappen holdes inne, vil bare modifikatorer brukes. Disse aktiveres når de holdes inne og flere kan trykkes. Så hvis knapp A er Shift, og knapp B er Ctrl, når du holder nede A og B, vil det være som å trykke både Shift og Ctrl, men bare så lenge tommelknappen holdes inne!

Skallet er designet for å være både ergonomisk og ambidextrous. Jeg var veldig forsiktig med å få den til å passe godt slik at det ikke er for slitsomt å bruke lillefingeren, og det burde fungere for de med hendene større enn mine også.

Trinn 2: Prototype + kode

Prototype + kode
Prototype + kode

Det er god praksis å teste knappene på et brødbrett. Det er ganske enkelt, bare koble til knappene og motstandene som vist. Du kan teste den med koden her (alternativ for pastebin link):

#inkludere

// bruk vthisv -alternativet for MacOS:

// char ctrlKey = KEY_LEFT_GUI;

// bruk vthisv -alternativet for Windows og Linux:

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

// Funksjonstaster 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}; // utvalg av alle knappestifter

//Følsomhet

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 {frigjort, presset, holdt, løslatt};

struktur -knapp {

int pin; Statene sier; int timeHeld; }; // tommel, indeks, midten, ring, liten;

knappeknapper [BUTTON_NUM] = {};

knapp initButton (int p) {

knapp b; pinMode (p, INNGANG); b.pin = p; b.state = Stater:: frigjort; b.timeHeld = 0; retur b; }

ugyldig oppsett () {

// legg oppsettskoden her for å kjøre en gang: Serial.begin (9600); Keyboard.begin ();

mens (! Seriell) {};

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

}

bool readButton (int pin) {

// sjekk og avbryt knappene hvis (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {return true; }} returner false; }

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; } knapp buttonStateUpdate (knapp b) {

bool press = readButton (b.pin);

switch (b.state) {case States:: freed: b.timeHeld = 0; hvis (trykk) b.state = States:: presset; gå i stykker; sak presset: b.timeHeld+= 1; if (trykk) {if (b.timeHeld> (THRESH_1/(1+DELAY))) {b.state = States:: held; }} annet {// if (b.timeHeld

int getButtonStateCode (knapp b)

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

int getCodeByButton (int code, int index) {

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

// første operasjon

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 ----"); if (getCodeByButton (kode, 1)> 0) {Keyboard.press (altKey); // Serial.println ("------- alt ---------"); } ellers Keyboard.release (altKey); if (getCodeByButton (kode, 2)> 0) {Keyboard.press (ctrlKey); // Serial.println ("-------- ctrl ----------"); } ellers Keyboard.release (ctrlKey); if (getCodeByButton (kode, 3)> 0) {Keyboard.press (''); } ellers Keyboard.release (''); if (getCodeByButton (kode, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ skift ------"); } ellers Keyboard.release (shiftKey); } annet {

// utføre oppgaver

switch (kode) {case 30: // --- | Brush Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (kode); gå i stykker; sak 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (kode); gå i stykker; sak 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (kode); gå i stykker; sak 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (kode); gå i stykker; case 320: //-| o Angre Keyboard.press (ctrlKey); Keyboard.print ('z'); completePress (kode); gå i stykker; sak 3020: //-| -o Redo Keyboard.press (ctrlKey); Keyboard.print ('y'); completePress (kode); gå i stykker; sak 30020: // | --o History Keyboard.press (shiftKey); Keyboard.print ('y'); completePress (kode); gå i stykker; sak 230: //-o | Lagre Keyboard.press (ctrlKey); Keyboard.print ('s'); completePress (kode); gå i stykker; sak 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 ("knappekode:"); Serial.println (buttonCode); }

doAction (buttonCode);

// legg hovedkoden din her for å kjøre gjentatte ganger: // 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);

}

Det er ikke mye å si om logikken, da den ligner den for min siste kontroller, med to bemerkelsesverdige forskjeller:

  1. Knappene er strukturer med sine egne statsmaskiner
  2. Statene summeres sammen for å lage en kode som bestemmer handlingen

Prinsippet ligner på bit-shifting, men fordi knappene har flere tilstander og ikke bare kan representeres med en binær, multipliseres de med potens i stedet for ti. Jeg legger deretter til alle knappestatusene i et enkelt tall, og sender det videre til doAction () switch -setningen, der jeg legger alle snarveikoden.

Som du kan se, kartla jeg ikke alle mulige kombinasjoner. Jeg har bare lagt til noen av mine favoritt snarveier, jeg lar det være opp til deg å fylle ut resten hvordan du synes det passer best;)

Trinn 3: Hylsteret

Hylsteret
Hylsteret
Hylsteret
Hylsteret
Hylsteret
Hylsteret

Jeg brukte en 3D -skriver til foringsrøret. Som du kan se, har designet noen feil, og jeg måtte MacGyver en måte å bare lukke det. Så jeg vil ikke legge ut modellfilen ennå.

Knappene varmlimes på "benker" slik at de holder lokkene på plass. De myke trykknappene er spesielt gode på det, så sørg for å få noen av dem hvis du planlegger å lage et etui som ligner på mitt.

Jeg foreslår også å legge til litt vekt inne i saken, da den er veldig lett. De ekstra gramene vil få det til å føles mer naturlig.

Lodd alt som vist og koble til usb -kabelen, så skal alt passe på plass (ved hjelp av litt lim)!

Trinn 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 kontroller du kan bruke til å få tilgang til alle dine viktige snarveier med bare en hånd!

Det krever litt muskelhukommelse å bruke, men det er veldig allsidig!

Selvfølgelig er det ikke perfekt, og akkurat nå tenker jeg på noen måter å forbedre det på. Bortsett fra å forbedre kabinettet og legge til snarveier, tror jeg det ville være interessant å støtte flere applikasjoner med forskjellige snarveier. Jeg tenker på å ha en knappekombinasjon for å bytte mellom kontrollordninger, som å trykke på 4 knapper samtidig for å bytte mellom et Photoshop-snarveibibliotek til en skreddersydd for Maya.

Bare noen ideer.

Takk for at du leser, til neste gang!

Anbefalt: