Sadržaj:

Ručni kontroler prečaca (za Photoshop + više) [Arduino]: 4 koraka
Ručni kontroler prečaca (za Photoshop + više) [Arduino]: 4 koraka

Video: Ručni kontroler prečaca (za Photoshop + više) [Arduino]: 4 koraka

Video: Ručni kontroler prečaca (za Photoshop + više) [Arduino]: 4 koraka
Video: Program for utilities 2024, Srpanj
Anonim
Ručni kontroler prečaca (za Photoshop + više) [Arduino]
Ručni kontroler prečaca (za Photoshop + više) [Arduino]

Zadnji put stvorio sam sićušni kontrolni jastučić za korištenje u Photoshopu. Činio je čuda, a ja ga i dalje koristim! Ali također je prilično ograničen, sa samo pet gumba i brojčanicima korisne veličine i neprozirnosti. I dalje sam mnogo posegnuo za tipkovnicom …

Tako sam počeo raditi na sljedećoj iteraciji kontrolne pločice, jednoj s mnogo više gumba i funkcionalnosti. Jedan kontrolni jastučić za sve njih.

Ovo nije onaj kontrolni jastučić. ALI na neki način bi moglo biti bolje.

Što ako biste mogli imati hrpu prečaca, ali u super udobnom i laganom pakiranju možete držati slobodnu ruku dok crtate bez prekida? … u redu, dosta s info reklamom.

Ovaj upravljač programiran je na način da se sa samo 4 gumba može mapirati na do 32 moguća prečaca! Dodatni 5. gumb postoji kako bi mi omogućio korištenje tipki za mijenjanje u bilo kojoj kombinaciji, što je korisno za mnoge programe (jeste li ikada probali kombinaciju Alt-RMB u PS-u? Ako niste, učinite to. To je spas.). Sustav ću objasniti kasnije.

Za sve ovo trebat će vam:

  • 1 mikrokontroler (koristio sam Adafruit ItsyBitsy 32u4, ali svaki bi trebao raditi sve dok ima čip atmega32u4)
  • 1 mikro-USB adapter (podaci, ne samo za napajanje)
  • 5 tipki (koristio sam mekane, poput ovih)
  • 10k Ohm otpornici (1 po gumbu)
  • Žice, matična ploča, materijal za lemljenje itd.
  • Nešto za izradu kućišta (3D pisač itd.)

Ovo je Arduino projekt srednje razine i predlažem da pogledate moj prošli vodič kako biste bolje razumjeli što se događa, jer je mnogo toga ponavljanje stvari koje sam tamo objasnio.

U redu, počnimo!

Korak 1: Planiranje

Planiranje
Planiranje

Ovo je osnovna shema koju sam nacrtao kontrolera. Krug je stvarno jednostavan kad ga usporedite s mojim prijašnjim projektom! No moći ćemo učiniti mnogo više s nekoliko gumba koje ima, snagom kombiniranih pritisaka!

Ideja iza kontrolne sheme je da svaki gumb može biti slobodan, pritisnuti i otpustiti ili pritisnuti i držati. Pritisak i otpuštanje je ono što će zapravo aktivirati prečac, dok će držanje tipki omogućiti pristup različitim prečacima. Dakle, ako samo pritisnete gumb A, aktivirat ćete prečac A, ali ako zadržite B kada pritisnete A, dobit ćete drugačiji prečac. Možete pritisnuti do 3 gumba odjednom dok pritisnete, pa ćete primijeniti neke osnovne kombinatorike i vidjeti koliko je kombinacija moguće s ovim sustavom!

Dodatni peti gumb osjetio se kao prirodan dodatak, s obzirom na oblik ručnog uređaja koji sam smislio. Odlučio sam ga koristiti za pristup modifikacijskim tipkama u Photoshopu. Način na koji se radi malo se razlikuje od ostalih gumba: kad god se pritisne gumb palca, koristit će se samo modifikatori. One će se aktivirati kada se drže i višestruko se može pritisnuti. Dakle, ako je gumb A Shift, a gumb B Ctrl, kad držite pritisnute A i B, to će biti kao da pritisnete i Shift i Ctrl, ali samo dok je pritisnuta tipka palca!

Ljuska je dizajnirana tako da bude ergonomska i dvostrana. Dobro sam pazio da mi dobro prilegne kako korištenje malog prsta ne bi bilo previše zamorno, a trebao bi djelovati i onima s većim rukama od moje.

Korak 2: Prototip + kod

Prototip + kod
Prototip + kod

Dobra je praksa isprobati gumbe na ploči. Prilično je jednostavno, samo spojite gumbe i otpornike kao što je prikazano. Ovdje ga možete testirati pomoću koda (alternativa pastebin link):

#uključi

// koristiti opciju vthisv za MacOS:

// char ctrlKey = KEY_LEFT_GUI;

// koristiti opciju vthisv za Windows i Linux:

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

// Funkcijski ključevi ovdje

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

const int pins = {9, 10, 11, 12, 13}; // niz svih pinova gumba

// Osjetljivost

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;

// Zamrzni okvire

const int DELAY = 0;

enum States {oslobođen, pritisnut, zadržan, pušten};

gumb struct {

int pin; Države države; int timeHeld; }; // palac, kažiprst, sredina, prsten, malo;

gumbi gumba [BUTTON_NUM] = {};

button initButton (int p) {

gumb b; pinMode (p, INPUT); b.pin = p; b.država = države:: oslobođen; b.timeHeld = 0; povrat b; }

void setup () {

// ovdje postavite svoj kôd za postavljanje, da biste ga jednom pokrenuli: Serial.begin (9600); Keyboard.begin ();

while (! Serijski) {};

// Gumbi za (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("gumb za postavljanje"); Serijski.ispis (i); Serial.print ("na pin:"); Serial.println (pinovi ); // gumbi .pin = 1; gumbi = initButton (pinovi ); Serial.println (gumbi .pin); }

}

bool readButton (int pin) {

// gumbi za provjeru i otkazivanje if (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {return true; }} return false; }

int pintobin (int pin) {

if (pin == pins [0]) vrati 1; if (pin == pins [1]) vrati 10; if (pin == pins [2]) vrati 100; if (pin == pins [3]) vrati 1000; if (pin == pins [4]) vrati 10000; } button buttonStateUpdate (gumb b) {

bool press = readButton (b.pin);

switch (b.state) {slučajevi stanja:: oslobođeno: b.timeHeld = 0; if (pritisnite) b.state = Države:: pritisnuto; pauza; pritisnuto kućište: b.timeHeld+= 1; if (pritisnite) {if (b.timeHeld> (THRESH_1/(1+DELAY))) {b.state = States:: held; }} else {// if (b.timeHeld

int getButtonStateCode (gumb b)

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

int getCodeByButton (int kôd, int indeks) {

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

// prva operacija

if (opStep == 0) povratni kod/10000; r1 = kôd%10000;

ako (opStep == 1)

povrat r1/1000; r2 = r1%1000; if (opStep == 2) vrati r2/100; r3 = r2%100; if (opStep == 3) vrati r3/10; r4 = r3%10; if (opStep == 4) vrati r4/1; r5 = r4%1; }

void completePress (int pin) {

// Serial.print ("ulaz"); // Serial.println (pin); kašnjenje (THRESH_3); Keyboard.releaseAll (); }

void doAction (int kod) {

// Modifikatori if (getCodeByButton (code, 0) == 2) {// Serial.println ("--- modifikatori ----"); if (getCodeByButton (code, 1)> 0) {Keyboard.press (altKey); // Serial.println ("------- alt ---------"); } else Keyboard.release (altKey); if (getCodeByButton (code, 2)> 0) {Keyboard.press (ctrlKey); // Serial.println ("-------- ctrl ----------"); } else Keyboard.release (ctrlKey); if (getCodeByButton (code, 3)> 0) {Keyboard.press (''); } else Keyboard.release (''); if (getCodeByButton (code, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ pomak ------"); } else Keyboard.release (shiftKey); } else {

// izvršavanje zadataka

prekidač (kod) {slučaj 30: // --- | Brush Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (kod); pauza; slučaj 300: // --- | Tipkovnica za brisanje.pritisnite (shiftKey); Keyboard.print ('e'); completePress (kod); pauza; slučaj 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (kod); pauza; slučaj 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (kod); pauza; slučaj 320: //-| o Poništi tipkovnicu.press (ctrlKey); Keyboard.print ('z'); completePress (kod); pauza; kućište 3020: //-| -o Ponovi tipkovnicu.press (ctrlKey); Keyboard.print ('y'); completePress (kod); pauza; case 30020: // | --o History Keyboard.press (shiftKey); Keyboard.print ('y'); completePress (kod); pauza; slučaj 230: //-o | Spremi tipkovnicu.press (ctrlKey); Keyboard.print ('s'); completePress (kod); pauza; kućište 3200: //- | o- Quick-p.webp

int buttonCode = 0;

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

if (buttonCode! = 0) {

Serial.print ("kôd gumba:"); Serial.println (buttonCode); }

doAction (buttonCode);

// ovdje unesite svoj glavni kôd, da biste ga ponavljali: // for (int i = gumbi [0]; i <sizeof (gumbi)/sizeof (gumbi [0])+gumbi [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

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

Keyboard.releaseAll ();

kašnjenje (DELAY);

}

Nema se puno za reći o logici jer je slična onoj mog zadnjeg kontrolera, s dvije značajne razlike:

  1. Gumbi su strukture s vlastitim strojevima za stanje
  2. Stanja se zbrajaju zajedno kako bi se napravio kod koji određuje radnju

Princip je sličan pomaku bitova, ali budući da gumbi imaju više stanja i ne mogu se jednostavno prikazati binarno, umjesto toga se množe sa stepenima deset. Zatim zbrajam sva stanja gumba u jedan broj i prosljeđujem ga u naredbu switch doAction (), gdje stavljam sve kodove prečaca.

Kao što vidite, nisam mapirao svaku moguću kombinaciju. Dodao sam samo nekoliko svojih najdražih prečaca, ostavljam vama da popunite ostale kako vam odgovara;)

Korak 3: Kućište

Kućište
Kućište
Kućište
Kućište
Kućište
Kućište

Koristio sam 3D pisač za kućište. Kao što vidite, dizajn ima neke nedostatke i morao sam MacGyver način da ga samo zatvoriti. Tako da još neću objavljivati datoteku modela.

Gumbi su vruće zalijepljeni na "klupe" tako da drže kape na mjestu. Mekani gumbi u tome su posebno dobri, stoga svakako nabavite neke od njih ako namjeravate napraviti slučaj sličan mom.

Također, predlažem da dodate malo težine unutar kućišta jer je vrlo lagano. Dodatni grami učinit će držanje prirodnijim.

Lemite sve kako je prikazano i spojite USB kabel, i sve bi trebalo stati na svoje mjesto (uz pomoć ljepila)!

Korak 4: Rezultat i moguća poboljšanja

Rezultat i moguća poboljšanja
Rezultat i moguća poboljšanja
Rezultat i moguća poboljšanja
Rezultat i moguća poboljšanja
Rezultat i moguća poboljšanja
Rezultat i moguća poboljšanja

Evo ga! Ručni kontroler pomoću kojeg možete pristupiti svim važnim prečacima samo jednom rukom!

Za korištenje je potrebno malo mišićne memorije, ali zaista je svestrano!

Naravno da nije savršeno, a sada razmišljam o nekim načinima da ga poboljšam. Osim poboljšanja kućišta i dodavanja prečaca, mislim da bi bilo zanimljivo podržati više aplikacija s različitim prečacima. Razmišljam o kombinaciji gumba za prebacivanje između kontrolnih shema, poput istovremenog pritiskanja 4 gumba za prebacivanje s biblioteke prečaca u Photoshopu na prilagođenu za Mayu.

Samo neke ideje.

Hvala na čitanju, do sljedećeg puta!

Preporučeni: