Indholdsfortegnelse:

Mini Control Pad til Photoshop (Arduino): 6 trin
Mini Control Pad til Photoshop (Arduino): 6 trin

Video: Mini Control Pad til Photoshop (Arduino): 6 trin

Video: Mini Control Pad til Photoshop (Arduino): 6 trin
Video: Building a MIDI Controller Using Arduino 2024, Juli
Anonim
Mini Control Pad til Photoshop (Arduino)
Mini Control Pad til Photoshop (Arduino)

Her viser jeg dig, hvordan du laver et lille værktøj, der hjælper dig med at arbejde hurtigere i Photoshop!

Tastaturer specielt lavet til PS er ikke nye, men de tilbyder ikke ligefrem det, jeg har brug for. Som maler bruges meget af min tid i Photoshop til at justere penselindstillingen, og jeg tror, at enkle genvejsknapper ikke giver mig kontrol til at matche min arbejdsgang. Så jeg besluttede at lave mit eget tastatur, et som er lille, diskret og har urskiver til at give mig den analoge interaktion, som jeg altid har ønsket.

Måden det fungerer på er enkel: For at få mikrokontrolleren til at interagere med Photoshop drager vi fordel af standardgenvejene. Med et kort, som computeren kan læse som et tastatur/mus, er alt, hvad vi skal gøre, at bruge nogle enkle kodelinjer til at fortælle computeren at læse hvert input som en kombination af tastetryk. Nu er fortrydsknappen bare et tryk på knappen!

Lad os komme igang! Til dette projekt skal du bruge:

  • 1 Sparkfun ProMicro (eller en Arduino Leonardo, anbefales ikke)
  • 1 mikro-USB-adapter
  • 6 trykknapper (eller et vilkårligt nummer)
  • 10k Ohm modstande (1 for hver knap)
  • 1 potentiometer
  • 1 roterende encoder
  • ledninger, brødbræt, perfboard, loddemetal, hovedstifter osv.

Du kan bruge en Arduino Leonardo til dette projekt, men ProMicro er et meget billigere alternativ, der bruger den samme atmega32u4 -chip, har flere pins og kommer i en meget mindre form, hvilket gør den perfekt til et tastatur.

For at programmere ProMicro i Arduino IDE skal du muligvis først konfigurere nogle ting. Du kan læse mere om det i SparkFuns vejledning:

Hvis din computer har problemer med at finde enheden, skal du sørge for, at den mikro-USB, du bruger, ikke kun er strømforsynet og understøtter dataoverførsel.

Dette er mit første Arduino -projekt, og er velegnet til begyndere.

Trin 1: Prototyping af kontrolpladen

Prototyper kontrolpladen
Prototyper kontrolpladen

Jeg anbefaler, at du tester dit program på et brødbræt, før du begynder at lodde.

Her kan du se mit skema.

Knapperne 1 og 2 vil være Fortryd og gentag, 3 til 5 er for værktøjerne Pensel, viskelæder og Lasso, knap 6 er en hurtig Gem -knap. Enkoderen og pulsmåleren styrer henholdsvis størrelse og opacitet.

Bemærk, at jeg er venstrehåndet og designet layoutet på den måde, der er mest behagelig for mig at bruge. Se det øjeblik, du bruger dit brødbræt som en mulighed for at tænke over, hvilke funktioner du gerne vil have, at din controller skal have, hvad der fungerer bedst for dig og i sidste ende, hvis du skal bruge yderligere dele til at lave det.

Trin 2: Trykknapper

Trykknapper
Trykknapper

Knapperne er de enkleste at implementere. Lad os se på koden:

#omfatte

const int -knapper = {2, 3, 4, 5, 6, 7, 8, 9}; // array af alle knapnåle char ctrlKey = KEY_LEFT_GUI; // brug denne mulighed til Windows og Linux: // char ctrlKey = KEY_LEFT_CTRL; char shiftKey = KEY_LEFT_SHIFT; char altKey = KEY_LEFT_ALT; void setup () {// sæt din opsætningskode her for at køre en gang: Serial.begin (9600); Keyboard.begin (); // Knapper - gå gennem arrayet, og kontroller, om der trykkes på (int i = knapper [0]; i <(sizeof (knapper)/sizeof (knapper [0]))+knapper [0]; ++ i) { pinMode (i, INPUT); }} boolsk readButton (int pin) {// check og debounce knapper hvis (digitalRead (pin) == HIGH) {delay (10); hvis (digitalRead (pin) == HIGH) {return true; }} returner falsk; } void doAction (int pin) {// udfør opgaver switch (pin) {// ---- Genveje ---- // Fortryd sag 4: Keyboard.press (ctrlKey); Keyboard.print ('z'); Serial.print ("input"); Serial.println (pin); forsinkelse (200); Keyboard.releaseAll (); pause; // Gentag sag 5: Keyboard.press (ctrlKey); Keyboard.print ('y'); Serial.print ("input"); Serial.println (pin); forsinkelse (200); Keyboard.releaseAll (); pause; // Børstetaske 6: Keyboard.press ('b'); Serial.print ("input"); Serial.println (pin); forsinkelse (200); Keyboard.releaseAll (); pause; // Viskelæderetui 7: Keyboard.press ('e'); Serial.print ("input"); Serial.println (pin); forsinkelse (200); Keyboard.releaseAll (); pause; // Lasso case 8: Keyboard.press ('l'); Serial.print ("input"); Serial.println (pin); forsinkelse (200); Keyboard.releaseAll (); pause; // Gem sag 9: Keyboard.press (ctrlKey); Keyboard.print ('s'); Serial.print ("input"); Serial.println (pin); forsinkelse (200); Keyboard.releaseAll (); pause; standard: Keyboard.releaseAll (); pause; }}

void loop () {

// 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); }}} // Nulstil modifikatorer Keyboard.releaseAll ();

}

De er ret ligetil. For at få computeren til at genkende et tastetryk som et tastetryk, bruger vi simpelthen funktionen Keyboard.press (). Så for at aktivere Fortryd genvej (ctrl+z), bruger vi simpelthen Keyboard.press (ctrlKey) og derefter Keyboard.press ('z'). Husk, at du skal inkludere Keyboard.h og initialisere tastaturet for at få adgang til disse funktioner.

Indgangsstifterne er gemt i en matrix, så du nemt kan gennemgå dem alle i loop () -funktionen. En nem måde at få adgang til og arraylængde i c ++ ved at dividere størrelsen på hele arrayet med array -elementet plus et element. Vi går gennem alle knapper for at kontrollere, om der er blevet trykket på en.

For at holde tingene organiseret lagrede jeg alle mine knappes handlinger i switch -sætningen i en funktion, der tager pin -nummeret som argument.

Hvis du vil have dine knapper til at gøre forskellige ting, eller hvis du vil tilføje flere knapper, skal du blot redigere indholdet i doAction -funktionen!

På grund af hvordan fysiske knapper fungerer, bliver vi nødt til at debounce dem. Dette er for at forhindre, at programmet læser uønskede presser forårsaget af trykknappernes fjedring. Der er mange måder at gøre dette på, men jeg tilføjede en simpel readButton () -funktion, der tager sig af det.

Bare tråd dine knapper op med nogle 10k modstande, og du skal være gylden!

Trin 3: Potentiometeret

Potentiometeret
Potentiometeret

Nu til potmeteret:

#omfatte

int dial0 = 0; void setup () {// sæt din opsætningskode her for at køre en gang: Serial.begin (9600); Keyboard.begin (); // Dial dial0 = analogRead (0); dial0 = kort (dial0, 0, 1023, 1, 20); } void dialAction (int dial, int newVal, int lastVal) {switch (dial) {// Opacity case 0: delay (200); hvis (newVal! = lastVal) {int decim = ((newVal*5)/10); int -enhed = ((newVal *5)% 10); hvis (newVal == 20) {Keyboard.write (48+0); Tastatur. Skriv (48+0); Serial.println ("max dial 1"); } ellers {decim = begrænsning (decim, 0, 9); enhed = begrænsning (enhed, 0, 9); Serial.println (newVal*2); Tastatur. Skriv (48+decim); Tastatur. Skriv (48+enhed); }} dial0 = newVal; pause; standard: pause; }} // ------------------ MAIN LOOP ------------------------- ugyldigt loop () {// sæt din hovedkode her for at køre gentagne gange: // Opacity // delay (500); int val0 = analogRead (0); val0 = map (val0, 0, 1023, 1, 20); //Serial.print ("dial0:"); //Serial.println(val0); hvis (val0! = dial0) {// Gør noget dialAction (0, val0, dial0); }}

Potmeteret følger den samme logik, men det er lidt vanskeligere.

Lad os først se på, hvordan vi vil have det til at fungere: Photoshop har nogle praktiske genveje til at ændre børstens opacitet. Hvis du trykker på en vilkårlig num -tast, vil uigennemsigtigheden svare til det tal*10. Men hvis du trykker på to tal, læser det andet nummer som en enhed, hvilket giver dig mere præcis kontrol.

Så vi vil have vores potmeter til at kortlægge dens rotation til en procentdel, men vi vil ikke gøre det hele tiden, da det ville være fjollet. Vi vil kun ændre opaciteten, når potmeteret drejes. Så vi gemmer en ekstra værdi, som vi sammenligner med analogRead () -værdien og kører kun handlingsskriptet, når der er en forskel.

Et andet problem, vi vil støde på, er, hvordan vi vender analogReads return int som input. Da der ikke er nogen let måde at omdanne et int til en streng, bliver vi nødt til at bruge selve inten. Men hvis du bare skriver Keyboard.press (int), vil du bemærke, at input ikke vil være det, du ønskede, og i stedet vil der blive trykket på en anden tast.

Dette er fordi tastaturets taster alle er kodet som heltal, hver tast har sit eget indeks. For at bruge num -tasten korrekt skal du slå deres indeks op i ASCII -tabellen:

Som du kan se, starter num -tasterne ved indeks 48. Så for at trykke på den korrekte tast, skal vi blot tilføje opkaldets værdi til 48. Decimal- og enhedsværdierne er separate tryk.

Endelig har vi brug for en måde at forhindre værdien i at hoppe frem og tilbage. Fordi hvis du prøver at bruge skiven med kort (val0, 0, 1023, 0, 100), finder du resultaterne meget rystende. På samme måde som hvordan vi fjernede knapperne, løser vi dette ved at ofre noget af nøjagtigheden. Jeg fandt ud af, at det at kortlægge det til 1-20 og derefter multiplicere argumenternes værdi med 5 for at være et acceptabelt kompromis.

For at tilslutte potentiometeret skal du bare tilslutte en 5V -ledning, en jordledning og en analog indgangskabel, og der burde ikke være nogen problemer.

Sjovt faktum: Hvis du bruger denne genvej, mens et værktøj som Lasso er valgt, ændrer det lagets opacitet i stedet. Noget at tage til efterretning.

Trin 4: Rotary Encoder

Rotary Encoder
Rotary Encoder

Rotary encoders er lidt som potentiometre, men uden en grænse for, hvor meget de kan dreje. I stedet for en analog værdi ser vi på encoderens drejeretning digitalt. Jeg vil ikke gå i detaljer med, hvordan disse fungerer, men hvad du skal vide er, at det bruger to inputstifter på arduinoen til at fortælle i hvilken retning det drejes. Den roterende encoder kan være vanskeligere at arbejde med, forskellige encodere kan kræve forskellige opsætninger. For at gøre tingene lettere købte jeg en med PCB, som er klar til at blive hooked med hunstifter. Nu er koden:

#omfatte

// Rotary encoder #define outputA 15 #define outputB 14 int counter = 0; int aState; int aLastState; void setup () {// sæt din opsætningskode her for at køre en gang: // Rotary pinMode (outputA, INPUT); pinMode (outputB, INPUT); // Læser udgangstilstanden for outputA aLastState = digitalRead (outputA); } void rotaryAction (int dir) {if (dir> 0) {Keyboard.press (']'); } ellers {Keyboard.press ('['); } Keyboard.releaseAll (); } // ------------------ MAIN LOOP ------------------------- ugyldig loop () {// sæt din hovedkode her for at køre gentagne gange: // Størrelse aState = digitalRead (outputA); if (aState! = aLastState) {if (digitalRead (outputB)! = aState) {// counter ++; roterende handling (1); } andet {// tæller -; rotaryAction (-1); } //Serial.print("Position: "); //Serial.println(tæller); } aLastState = aState; }

Som standard øger Photoshop's] og [genveje penselstørrelsen. Ligesom før vil vi indtaste dem som tastetryk. Koderen sender et antal indgange pr. Omgang (hvilket afhænger af modellen), og vi vil øge/reducere børstestørrelsen for hver af disse indgange, så du kan dreje skiven op eller ned rigtig hurtigt, men også kunne styr den langsomt med stor præcision.

Ligesom med potmeteret vil vi kun køre handlingen, når drejeknappen drejes. I modsætning til potmeteret, som jeg forklarede før, har den roterende encoder to alternerende indgange. Vi ser på, hvilken af disse der er ændret for at fastslå, i hvilken retning drejeknappen drejes.

Afhængigt af retningen trykker vi derefter på den korrekte tast.

Så længe du ikke har kontaktproblemer, burde det fungere.

Trin 5: Sæt det hele sammen

Samler det hele
Samler det hele
Samler det hele
Samler det hele
Samler det hele
Samler det hele

Nu til lodningen. Først borer vi to huller i perfboardet, så de passer til de to urskiver. vi lodder knapperne og deres respektive modstande. Jeg borede to ekstra små huller for at lade inputtrådene passere oven på for at spare plads nedenunder, men dette er ikke nødvendigt. Der er ikke mange indgangskabler, så GND- og 5V -ledningerne kører parallelt, men hvis du føler dig sløv, vil du måske lave en matrix. Jeg lodde mikrokontrolleren til et andet, mindre perfboard, der passede nedenunder sammen med encoderen og potmeteret. Nu lodder jeg alle ledninger til ProMicro. Der er ingen grund til at være kreativ, jeg var bare nødt til at følge den samme skematiske som den på brødbrættet, men lodning på et så lille sted kan forståeligt nok være kedeligt. Vær ikke som mig, brug en wire stripper og et godt loddemiddel!

Endelig vil du måske lave en god sag til din nye Photoshop -ven. En bedre end min, i hvert fald!

Men hvis du er ivrig efter at prøve det, skal du bruge noget pap og tape og tilslutte din mikro-USB.

Trin 6: Kode + demonstration

Image
Image

Sørg for at teste kontrolpanelens program, mens du bevæger dig videre i projektet for at undgå overraskelser!

Her er den komplette kode:

Mange tak fordi du læste!

Anbefalede: