Sadržaj:

Mini kontrolni jastučić za Photoshop (Arduino): 6 koraka
Mini kontrolni jastučić za Photoshop (Arduino): 6 koraka

Video: Mini kontrolni jastučić za Photoshop (Arduino): 6 koraka

Video: Mini kontrolni jastučić za Photoshop (Arduino): 6 koraka
Video: Leap Motion SDK 2024, Novembar
Anonim
Mini kontrolni jastučić za Photoshop (Arduino)
Mini kontrolni jastučić za Photoshop (Arduino)

Evo pokazat ću vam kako napraviti mali alat koji će vam pomoći da brže radite u Photoshopu!

Tastature posebno napravljene za PS nisu nove, ali ne nude baš ono što mi treba. Kao slikar, većinu svog vremena u Photoshopu trošim na prilagođavanje postavki četkice i mislim da mi jednostavne tipke za prečice ne daju kontrolu u skladu s mojim radnim tokom. Stoga sam odlučio napraviti svoju tastaturu, onu malu, nenametljivu i sa brojčanicima koji mi daju onu analognu interakciju koju sam oduvijek želio.

Način na koji funkcionira je jednostavan: kako bismo omogućili interakciju mikrokontrolera sa Photoshopom, koristimo zadane prečice. Sa pločom koju računar može čitati kao tastatura/miš, sve što trebamo učiniti je koristiti neke jednostavne redove koda kako bismo rekli računaru da čita svaki unos kao kombinaciju pritiska na tipke. Sada je dugme za poništavanje samo jedno dugme pritisnuto!

Hajde da počnemo! Za ovaj projekat trebat će vam:

  • 1 Sparkfun ProMicro (ili Arduino Leonardo, ne preporučuje se)
  • 1 mikro-USB adapter
  • 6 tastera (ili bilo koji broj koji želite)
  • 10k Ohm otpornici (po 1 za svako dugme)
  • 1 potenciometar
  • 1 rotacijski davač
  • žice, matična ploča, ploča za lemljenje, lemljenje, igle zaglavlja itd.

Za ovaj projekt možete koristiti Arduino Leonardo, ali ProMicro je mnogo jeftinija alternativa koja koristi isti čip atmega32u4, ima više pinova i dolazi u mnogo manjem obliku, što ga čini savršenim za tipkovnicu.

Da biste programirali ProMicro u Arduino IDE -u, možda ćete morati prvo postaviti neke stvari. Više o tome možete pročitati u SparkFunovom vodiču:

Ako vaš računar ima problema s pronalaženjem uređaja, provjerite da mikro-USB koji koristite nije samo za napajanje i podržava prijenos podataka.

Ovo je moj prvi Arduino projekt i prikladan je za početnike.

Korak 1: Prototipiranje kontrolne pločice

Prototipiranje kontrolne pločice
Prototipiranje kontrolne pločice

Preporučujem da prije početka lemljenja testirate svoj program na ploči.

Ovdje možete vidjeti moju shemu.

Dugmad 1 i 2 će biti Poništi i Ponovi, 3 do 5 su za alate Četka, Gumica i Laso, dugme 6 je dugme za brzo spremanje. Enkoder i potmetar kontroliraju veličinu i neprozirnost.

Imajte na umu da sam ljevoruk i dizajnirao sam raspored na način koji mi je najudobniji za upotrebu. Pogledajte trenutak kada koristite svoju ploču kao priliku da razmislite o tome koje funkcije biste željeli da vaš kontroler ima, šta vam najbolje odgovara i na kraju ako vam za izradu budu potrebni dodatni dijelovi.

Korak 2: Pritisnite dugmad

Push Buttons
Push Buttons

Gumbi su najjednostavniji za implementaciju. Pogledajmo kod:

#include

const int tasteri = {2, 3, 4, 5, 6, 7, 8, 9}; // niz svih pinova dugmadi char ctrlKey = KEY_LEFT_GUI; // koristi ovu opciju za Windows i Linux: // char ctrlKey = KEY_LEFT_CTRL; char shiftKey = KEY_LEFT_SHIFT; char altKey = KEY_LEFT_ALT; void setup () {// ovdje postavite svoj kod za postavljanje, da biste ga jednom pokrenuli: Serial.begin (9600); Keyboard.begin (); // Dugmad - prođite kroz niz i provjerite ima li pritisaka na (int i = dugmad [0]; i <(veličinaof (dugmad)/veličinaof (dugmad [0]))+dugmad [0]; ++ i) { pinMode (i, INPUT); }} boolean readButton (int pin) {// tipke za provjeru i uklanjanje if (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {return true; }} return false; } void doAction (int pin) {// izvršava zadatke switch (pin) {// ---- Prečice ---- // Poništi velika slova 4: Keyboard.press (ctrlKey); Keyboard.print ('z'); Serial.print ("ulaz"); Serial.println (pin); kašnjenje (200); Keyboard.releaseAll (); break; // Ponovno pisanje slučaja 5: Keyboard.press (ctrlKey); Keyboard.print ('y'); Serial.print ("ulaz"); Serial.println (pin); kašnjenje (200); Keyboard.releaseAll (); break; // Slučaj četke 6: Keyboard.press ('b'); Serial.print ("ulaz"); Serial.println (pin); kašnjenje (200); Keyboard.releaseAll (); break; // Eraser case 7: Keyboard.press ('e'); Serial.print ("ulaz"); Serial.println (pin); kašnjenje (200); Keyboard.releaseAll (); break; // Lasso case 8: Keyboard.press ('l'); Serial.print ("ulaz"); Serial.println (pin); kašnjenje (200); Keyboard.releaseAll (); break; // Spremi slučaj 9: Keyboard.press (ctrlKey); Keyboard.print ('s'); Serial.print ("ulaz"); Serial.println (pin); kašnjenje (200); Keyboard.releaseAll (); break; default: Keyboard.releaseAll (); break; }}

void loop () {{100} {101}

// ovdje unesite svoj glavni kôd, za ponavljanje:

for (int i = dugmad [0]; i <sizeof (dugmad)/sizeof (dugmad [0])+dugmad [0]; ++ i) {if (readButton (i)) {doAction (i); }} // Poništi modifikatore Keyboard.releaseAll ();

}

Prilično su jednostavni. Da bismo naterali računar da prepozna pritiskanje tastera kao pritisak tastera, jednostavno koristimo funkciju Keyboard.press (). Dakle, za aktiviranje prečice Undo (ctrl+z), jednostavno koristimo Keyboard.press (ctrlKey), a zatim Keyboard.press ('z'). Zapamtite da ćete za pristup ovim funkcijama morati uključiti Keyboard.h i inicijalizirati tastaturu.

Ulazni pinovi su pohranjeni u nizu, tako da ih možete lako proći kroz funkciju loop (). Jedan jednostavan način pristupa i dužine niza u c ++ dijeljenjem veličine cijelog niza na element niza, plus jedan element. Prolazimo kroz sve tipke kako bismo provjerili je li neko pritisnuto.

Da bi stvari bile organizirane, pohranio sam sve radnje svog gumba u naredbu switch funkcije koja uzima pin broj kao argument.

Ako želite da vaši gumbi rade različite stvari ili želite dodati još gumba, jednostavno uredite sadržaj funkcije doAction!

Zbog načina na koji fizički gumbi rade, morat ćemo ih otkloniti. Ovo služi za sprečavanje programa da pročita bilo kakve neželjene pritiske uzrokovane gipkošću tipki. Postoji mnogo načina za to, ali dodao sam jednostavnu funkciju readButton () koja se brine za to.

Samo povežite svoje tipke s nekih 10k otpornika i trebali biste biti zlatni!

Korak 3: Potenciometar

Potenciometar
Potenciometar

A sada na mjerač udaljenosti:

#include

int biranje0 = 0; void setup () {// ovdje postavite svoj kod za postavljanje, da biste ga jednom pokrenuli: Serial.begin (9600); Keyboard.begin (); // bira dial0 = analogRead (0); biranje0 = karta (biranje0, 0, 1023, 1, 20); } void dialAction (int biranje, int newVal, int lastVal) {switch (biranje) {// Slučaj neprozirnosti 0: kašnjenje (200); if (newVal! = lastVal) {int decim = ((newVal*5)/10); int jedinica = ((newVal *5)% 10); if (newVal == 20) {Keyboard.write (48+0); Keyboard.write (48+0); Serial.println ("max dial 1"); } else {decim = constrain (decim, 0, 9); jedinica = ograničenje (jedinica, 0, 9); Serial.println (newVal*2); Keyboard.write (48+decim); Keyboard.write (48+jedinica); }} biraj0 = newVal; break; default: break; }} // ------------------ GLAVNA PETLJA ------------------------- praznina loop () {// stavite glavni kod ovde, da biste ga ponavljali: // Opacity // delay (500); int val0 = analogRead (0); val0 = karta (val0, 0, 1023, 1, 20); //Serial.print ("biranje0:"); //Serial.println(val0); if (val0! = dial0) {// Učinite nešto dialAction (0, val0, dial0); }}

Potmetar slijedi istu logiku, ali je malo zeznutiji.

Prvo pogledajmo kako želimo da funkcionira: Photoshop ima neke zgodne prečice za promjenu neprozirnosti četke. Ako pritisnete bilo koji taster num, neprozirnost će biti jednaka tom broju*10. Ali ako pritisnete dva broja, drugi broj će se pročitati kao jedinica, dajući vam precizniju kontrolu.

Zato želimo da naš mjerač puta preslikava rotaciju na postotak, ali ne želimo to raditi stalno jer bi to bilo glupo. Opacitet želimo promijeniti samo kada okrećemo mjerač. Zato spremamo dodatnu vrijednost koju uspoređujemo s analogRead () vrijednosti i pokrećemo skriptu akcije samo kad postoji razlika.

Još jedno pitanje na koje ćemo naići je kako pretvaramo povratni int analognog čitača kao ulaz. Kako ne postoji jednostavan način pretvaranja int -a u niz, morat ćemo koristiti sam int. Međutim, ako jednostavno napišete Keyboard.press (int) primijetit ćete da unos neće biti ono što ste htjeli, već će se umjesto toga pritisnuti drugi taster.

To je zato što su svi ključevi na vašoj tastaturi kodirani kao cijeli brojevi, a svaki ključ ima svoj indeks. Da biste pravilno koristili num ključ, morat ćete potražiti njihov indeks u ASCII tablici:

Kao što vidite, numerički tasteri počinju sa indeksom 48. Dakle, da bismo pritisnuli ispravan taster, sve što moramo da uradimo je da dodamo vrednost točkića na broj 48. Decimalna i jedinična vrednost su odvojeni pritisci.

Konačno, potreban nam je način da zadržimo vrijednost od skakanja naprijed -natrag. Jer ako pokušate koristiti brojčanik s kartom (val0, 0, 1023, 0, 100), rezultati će biti vrlo nervozni. Slično onome kako smo uklonili dugmad, to ćemo popraviti žrtvovanjem neke tačnosti. Otkrio sam da je preslikavanje na 1-20, a zatim množenje vrijednosti argumenata sa 5 kao prihvatljiv kompromis.

Za povezivanje potenciometra samo spojite žicu od 5 V, žicu za uzemljenje i žicu za analogni ulaz i ne bi trebalo biti problema.

Zabavna činjenica: ako koristite ovu prečicu dok je odabran alat poput Lassa, umjesto toga će se promijeniti neprozirnost sloja. Nešto na što treba obratiti pažnju.

Korak 4: Rotacijski koder

Rotacijski koder
Rotacijski koder

Rotacijski koderi su pomalo poput potenciometara, ali bez ograničenja koliko se mogu okretati. Umjesto analogne vrijednosti, digitalno ćemo gledati smjer okretanja kodera. Neću ulaziti u detalje o tome kako oni rade, ali ono što trebate znati je da koristi dva ulazna pina na arduinu kako bi rekao u kojem smjeru se okreće. S rotacijskim davačem može biti teže raditi, različiti koderi mogu zahtijevati različite postavke. Da bih olakšao stvari, kupio sam jedan sa PCB -om, koji je spreman za pričvršćivanje ženskim iglama. Sada kod:

#include

// Rotacijski davač #define outputA 15 #define outputB 14 int counter = 0; int aState; int aLastState; void setup () {// ovdje postavite svoj kod za postavljanje, da biste ga jednom pokrenuli: // Rotary pinMode (outputA, INPUT); pinMode (outputB, INPUT); // Čita početno stanje outputA aLastState = digitalRead (outputA); } void rotaryAction (int dir) {if (dir> 0) {Keyboard.press (']'); } else {Keyboard.press ('['); } Keyboard.releaseAll (); } // ------------------ MAIN LOOP ------------------------- void petlja () {// ovdje unesite svoj glavni kôd, da biste ga ponavljali: // Veličina aState = digitalRead (outputA); if (aState! = aLastState) {if (digitalRead (outputB)! = aState) {// brojač ++; rotaryAction (1); } else {// brojač -; rotaryAction (-1); } //Serial.print("Position: "); //Serial.println(counter); } aLastState = aState; }

Prema zadanim postavkama, Photoshop -ove] i [prečice povećavaju i smanjuju veličinu četke. Kao i prije, želimo ih unijeti kao pritiske tipki. Enkoder šalje broj ulaza po zavoju (što ovisi o modelu), a mi želimo povećati/smanjiti veličinu četke za svaki od ovih ulaza, tako da možete okrenuti brojčanik gore ili dolje jako brzo, ali i biti u mogućnosti kontrolirajte ga polako s velikom preciznošću.

Baš kao i kod mjerača udaljenosti, akciju želimo pokrenuti samo kada je brojčanik okrenut. Za razliku od mjerača udaljenosti, kao što sam već objasnio, rotacijski davač ima dva izmjenična ulaza. Gledamo šta se od ovoga promijenilo kako bismo utvrdili smjer u kojem se okreće brojčanik.

Zatim, ovisno o smjeru, pritisnemo odgovarajuću tipku.

Sve dok nemate problema s kontaktom, to bi trebalo funkcionirati.

Korak 5: Sastavite sve zajedno

Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno
Spajajući sve zajedno

Sada na lemljenje. Prvo izbušimo dvije rupe u ploči za postavljanje kako bi se uklopila dva brojčanika. lemimo dugmad i njihove otpornike. Izbušio sam dvije dodatne male rupice da propustim ulazne žice na vrhu kako bih uštedio prostor ispod, ali to nije potrebno. Nema mnogo ulaznih žica pa žice GND i 5V teku paralelno, ali ako se osjećate lukavo, možda biste htjeli napraviti matricu. Lemio sam mikrokontroler na drugu, manju ploču koja je stajala ispod kodera i merača dužine. Sada sam lemio sve žice na ProMicro. Nema potrebe za kreativnošću, samo sam morao slijediti istu shemu kao ona na osnovnoj ploči, ali lemljenje na tako malom mjestu razumljivo može biti dosadno. Ne budi poput mene, koristi mašinu za skidanje žice i dobro lemljenje!

Konačno, možda biste htjeli napraviti lijepu torbicu za svog novog prijatelja iz Photoshopa. Bar jedan bolji od mene!

Ali ako želite isprobati, upotrijebite karton i traku i priključite mikro-USB.

Korak 6: Kod + demonstracija

Image
Image

Obavezno isprobajte program kontrolne pločice dok se krećete po projektu kako biste izbjegli iznenađenja!

Evo potpunog koda:

Hvala vam puno na čitanju!

Preporučuje se: