Innehållsförteckning:

Handhållen genvägskontroller (för Photoshop + Mer) [Arduino]: 4 steg
Handhållen genvägskontroller (för Photoshop + Mer) [Arduino]: 4 steg

Video: Handhållen genvägskontroller (för Photoshop + Mer) [Arduino]: 4 steg

Video: Handhållen genvägskontroller (för Photoshop + Mer) [Arduino]: 4 steg
Video: Handhållen Steamer 8000 series - Snabba resultat varje dag 2024, Juli
Anonim
Handhållen genvägskontroller (för Photoshop + Mer) [Arduino]
Handhållen genvägskontroller (för Photoshop + Mer) [Arduino]

Förra gången skapade jag en liten kontrollplatta för användning i Photoshop. Det gjorde underverk, och jag använder det fortfarande! Men det är också ganska begränsat, med bara fem knappar och användbara storlek och opacitet rattar. Jag hittade fortfarande mycket på tangentbordet …

Så jag började arbeta med nästa iteration av kontrollplattan, en med mycket fler knappar och funktioner. En kontrollplatta för att styra dem alla.

Det här är inte den där styrplattan. MEN på ett sätt kan det vara bättre.

Tänk om du kunde ha massor av genvägar, men i ett supertätt och lätt paket kan du hålla med din fria hand medan du ritar oavbrutet? … ok, nog med infomercial.

Denna handkontroll är programmerad på ett sätt som med bara 4 knappar kan kartläggas till upp till 32 möjliga genvägar! Den ytterligare femte knappen finns där för att tillåta mig att använda modifieringsnycklar i valfri kombination, vilket är användbart för många program (har du någonsin provat Alt-RMB-kombinationsrutan i PS? Om du inte har gjort det, gör det. Det är en livräddare). Jag förklarar systemet senare.

För att göra allt detta behöver du:

  • 1 mikrokontroller (jag använde ett Adafruit ItsyBitsy 32u4 men alla borde göra så länge det har atmega32u4 -chipet)
  • 1 mikro-USB-adapter (data, inte endast ström)
  • 5 tryckknappar (jag använde mjuka sådana som dessa)
  • 10k Ohm motstånd (1 per knapp)
  • Trådar, brödbräda, lödmaterial etc.
  • Något att göra ett hölje med (3D -skrivare, etc.)

Detta är ett Arduino-projekt på mellanliggande nivå, och jag föreslår att du tittar på min tidigare handledning för att bättre förstå vad som händer, eftersom mycket av detta är en upprepning av de saker jag förklarade där.

Ok, låt oss komma igång!

Steg 1: Planering

Planera
Planera

Detta är en grundläggande schematik som jag ritade av styrenheten. Kretsen är verkligen enkel när du jämför den med mitt tidigare projekt! Men vi kommer att kunna göra mycket mer med de få knappar den har, med kraften i kombinerade pressar!

Tanken bakom kontrollschemat är att varje knapp antingen kan vara ledig, tryckas och släpps eller hålls intryckt. Att trycka och släppa är det som faktiskt aktiverar genvägen, medan du håller ned knapparna ger oss tillgång till olika genvägar. Så om du bara trycker på knapp A aktiverar du genväg A, men om du håller B när du trycker på A får du en annan genväg. Du kan hålla upp till 3 knappar samtidigt medan du trycker på, så när du tillämpar några grundläggande kombinatorik ser du hur många kombinationer som är möjliga med detta system!

Den extra femte knappen kändes som ett naturligt tillägg, med tanke på formen på den handenhet jag kom på. Jag bestämde mig för att använda den för att komma åt modifieringsnycklar i Photoshop. Hur det fungerar skiljer sig något från de andra knapparna: när tumknappen hålls inne kommer endast modifierare att användas. Dessa aktiveras när de hålls kvar och flera kan tryckas. Så om knapp A är Skift och knapp B är Ctrl, när du håller ned A och B blir det som att trycka på både Skift och Ctrl, men bara så länge tumknappen hålls nedtryckt!

Skalet är utformat för att vara både ergonomiskt och ambidextrous. Jag var mycket noga med att få det att passa tätt så att lillfingret inte är för tröttsamt, och det borde fungera för dem med händer som är större än mina också.

Steg 2: Prototyp + kod

Prototyp + kod
Prototyp + kod

Det är bra att testa knapparna på en brödbräda. Det är ganska enkelt, anslut bara knapparna och motstånden som visas. Du kan testa den med koden här (alternativ för pastebinlänk):

#omfatta

// använd vthisv -alternativet för MacOS:

// char ctrlKey = KEY_LEFT_GUI;

// använd alternativet vthisv för Windows och Linux:

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

// Funktionstangenter här

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 med alla knappnålar

//Känslighet

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 ramar

const int DELAY = 0;

enum States {befriade, pressade, höll, släppte};

strukturknapp {

int pin; Stater uppger; int timeHeld; }; // tumme, index, mitt, ring, liten;

knappknappar [BUTTON_NUM] = {};

knapp initButton (int p) {

knapp b; pinMode (p, INPUT); b.pin = p; b.state = States:: befriad; b.timeHeld = 0; retur b; }

void setup () {

// lägg din installationskod här för att köra en gång: Serial.begin (9600); Keyboard.begin ();

medan (! Seriell) {};

// Knappar för (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("set -knapp"); Serial.print (i); Serial.print ("på pin:"); Serial.println (pins ); //knappar .pin = 1; knappar = initButton (pins ); Serial.println (knappar .pin); }

}

bool readButton (int pin) {

// kontrollera och avbocka knapparna om (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {return true; }} returnera false; }

int pintobin (int pin) {

om (pin == pins [0]) returnerar 1; om (pin == pins [1]) returnerar 10; om (pin == pins [2]) returnerar 100; om (pin == pins [3]) returnerar 1000; if (pin == pins [4]) returnera 10000; } knapp buttonStateUpdate (knapp b) {

bool press = readButton (b.pin);

switch (b.state) {case States:: freed: b.timeHeld = 0; om (tryck) b.state = States:: nedtryckt; ha sönder; fall tryckt: b.timeHeld+= 1; if (tryck) {if (b.timeHeld> (THRESH_1/(1+DELAY))) {b.state = States:: hålls; }} annat {// if (b.timeHeld

int getButtonStateCode (knapp b)

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

int getCodeByButton (int -kod, int -index) {

int rl, r2, r3, r4, r5; int opStep = BUTTON_NUM - (1+index);

// första operationen

om (opStep == 0) returkod/10000; r1 = kod%10000;

om (opStep == 1)

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

void completePress (int pin) {

// Serial.print ("input"); // Serial.println (pin); fördröjning (THRESH_3); Keyboard.releaseAll (); }

void doAction (int code) {

// Modifierare om (getCodeByButton (kod, 0) == 2) {// Serial.println ("--- modifierare ----"); if (getCodeByButton (kod, 1)> 0) {Keyboard.press (altKey); // Serial.println ("------- alt ---------"); } annars Keyboard.release (altKey); if (getCodeByButton (kod, 2)> 0) {Keyboard.press (ctrlKey); // Serial.println ("-------- ctrl ----------"); } annars Keyboard.release (ctrlKey); if (getCodeByButton (kod, 3)> 0) {Keyboard.press (''); } annars Keyboard.release (''); if (getCodeByButton (kod, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ skift ------"); } annars Keyboard.release (shiftKey); } annat {

// utför uppgifter

switch (kod) {case 30: // --- | Brush Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (kod); ha sönder; fall 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (kod); ha sönder; fall 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (kod); ha sönder; fall 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (kod); ha sönder; fall 320: //-| o Ångra Keyboard.press (ctrlKey); Keyboard.print ('z'); completePress (kod); ha sönder; fall 3020: //-| -o Gör om tangentbordet. tryck (ctrlKey); Keyboard.print ('y'); completePress (kod); ha sönder; fall 30020: // | --o History Keyboard.press (shiftKey); Keyboard.print ('y'); completePress (kod); ha sönder; fall 230: //-o | Spara Keyboard.press (ctrlKey); Keyboard.print ('s'); completePress (kod); ha sönder; fall 3200: //- | o- Quick-p.webp

int buttonCode = 0;

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

if (buttonCode! = 0) {

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

doAction (buttonCode);

// lägg din huvudkod här för att köra upprepade gånger: // för (int i = knappar [0]; i <sizeof (knappar)/sizeof (knappar [0])+knappar [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

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

Keyboard.releaseAll ();

fördröjning (DELAY);

}

Det finns inte mycket att säga om logiken eftersom den liknar min förra kontrollers, med två anmärkningsvärda skillnader:

  1. Knapparna är strukturer med sina egna tillståndsmaskiner
  2. Staterna summeras tillsammans för att skapa en kod som bestämmer åtgärden

Principen liknar bitskiftning, men eftersom knapparna har flera tillstånd och inte bara kan representeras med en binär multipliceras de med tio i stället. Jag lägger sedan ihop alla knapptillstånd till ett enda nummer och skickar det till doAction () switch -satsen, där jag lägger alla genvägskoder.

Som ni ser har jag inte kartlagt alla möjliga kombinationer. Jag har bara lagt till några av mina favoritgenvägar, jag lämnar det upp till dig att fylla i resten hur du tycker det passar bäst;)

Steg 3: Höljet

Höljet
Höljet
Höljet
Höljet
Höljet
Höljet

Jag använde en 3D -skrivare för höljet. Som du kan se har designen några brister och jag var tvungen att MacGyver ett sätt att bara stänga den. Så jag kommer inte att lägga upp modellfilen ännu.

Knapparna är limmade på "bänkar" så att de håller locken på plats. De mjuka tryckknapparna är särskilt bra på det, så se till att skaffa några av dem om du planerar att göra ett fodral som liknar mitt.

Jag föreslår också att du lägger till lite vikt inuti fodralet, eftersom det är mycket lätt. De extra gram kommer att göra att hålla det mer naturligt.

Löd allt som visas och anslut usb -kabeln, så ska allt passa på plats (med hjälp av lite lim)!

Steg 4: Resultat och möjliga förbättringar

Resultat och möjliga förbättringar
Resultat och möjliga förbättringar
Resultat och möjliga förbättringar
Resultat och möjliga förbättringar
Resultat och möjliga förbättringar
Resultat och möjliga förbättringar

Där har du det! En handhållen handkontroll som du kan använda för att komma åt alla dina viktiga genvägar med bara en hand!

Det tar lite muskelminne att använda, men det är verkligen mångsidigt!

Naturligtvis är det inte perfekt, och just nu funderar jag på några sätt att förbättra det. Förutom att förbättra höljet och lägga till genvägar, tror jag att jag skulle vara intressant att stödja flera applikationer med olika genvägar. Jag funderar på att ha en knappkombination för att växla mellan kontrollscheman, som att trycka på 4 knappar samtidigt för att växla mellan ett Photoshop-genvägsbibliotek till en skräddarsydd för Maya.

Bara några idéer.

Tack för att du läste, tills nästa gång!

Rekommenderad: