Sadržaj:

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

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

Video: Ručni kontroler prečica (za Photoshop + više) [Arduino]: 4 koraka
Video: Топ 5 скрытых полезных программ Windows 10 2024, Juli
Anonim
Ručni kontroler prečica (za Photoshop + više) [Arduino]
Ručni kontroler prečica (za Photoshop + više) [Arduino]

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

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 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 koje možete držati slobodnom rukom dok crtate bez prekida? … u redu, dosta s info reklamom.

Ovaj kontroler je programiran na način da se sa samo 4 tipke može mapirati na do 32 moguće prečice! Dodatno 5. dugme postoji kako bi mi omogućilo korištenje tipki modifikatora 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 spasilac). Objasniću sistem kasnije.

Za sve ovo potrebno vam je:

  • 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 dugmetu)
  • Žice, matična ploča, materijal za lemljenje itd.
  • Nešto sa čime možete napraviti kućište (3D štampač itd.)

Ovo je Arduino projekt srednjeg nivoa i predlažem da pogledate moj prethodni vodič kako biste bolje razumjeli šta se dešava, jer je ovo mnogo ponavljanja stvari koje sam tamo objasnio.

Ok, počnimo!

Korak 1: Planiranje

Planiranje
Planiranje

Ovo je osnovna shema koju sam nacrtao kontrolera. Krug je zaista jednostavan kad ga usporedite s mojim prethodnim projektom! Ali moći ćemo učiniti mnogo više s nekoliko tipki koje ima, uz snagu kombiniranih pritisaka!

Ideja iza kontrolne sheme je da se svako dugme može osloboditi, pritisnuti i otpustiti ili pritisnuti i držati. Pritisak i otpuštanje je ono što će zapravo aktivirati prečicu, dok će držanje tipki omogućiti pristup različitim prečicama. Dakle, ako samo pritisnete dugme A, aktiviraćete prečicu A, ali ako zadržite B kada pritisnete A, dobićete drugu prečicu. Možete pritisnuti do 3 gumba odjednom dok pritisnete, pa ćete primijeniti neke osnovne kombinatorike i vidjeti koliko je kombinacija moguće s ovim sistemom!

Dodatno peto dugme bilo je prirodan dodatak, s obzirom na oblik ručnog računara 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 tipki: kad god držite dugme palca, koristit će se samo modifikatori. One će se aktivirati kada se drže i višestruko se može pritisnuti. Dakle, ako je dugme A Shift, a dugme B Ctrl, kada držite pritisnute A i B, to će biti kao da pritisnete i Shift i Ctrl, ali samo dok je dugme palca držano!

Ljuska je dizajnirana tako da bude ergonomska i dvostrana. Pazio sam kako bi mu dobro prilegao 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 testirati 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):

#include

// koristite opciju vthisv za MacOS:

// char ctrlKey = KEY_LEFT_GUI;

// koristite 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 dugmadi

// Senzibility

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;

// Zamrzavanje okvira

const int DELAY = 0;

enum States {oslobođeno, pritisnuto, zadržano, pušteno};

struct button {

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

dugmad dugmeta [BUTTON_NUM] = {};

button initButton (int p) {

dugme b; pinMode (p, INPUT); b.pin = p; b.država = države:: oslobođeno; b.timeHeld = 0; return b; }

void setup () {

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

while (! Serijski) {};

// Dugmad za (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("dugme za postavljanje"); Serial.print (i); Serial.print ("na pinu:"); Serial.println (pinovi ); //buttons.pin = 1; dugmad = initButton (pinovi ); Serial.println (dugmad .pin); }

}

bool readButton (int pin) {

// tipke 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 (dugme b) {

bool press = readButton (b.pin);

switch (b.state) {slučajevi stanja:: oslobođeno: b.timeHeld = 0; if (pritisnite) b.state = States:: pritisnuto; break; 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 (dugme b)

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

int getCodeByButton (int kod, int indeks) {

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

// prva operacija

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

ako (opStep == 1)

povratak 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); break; slučaj 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (kod); break; slučaj 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (kod); break; slučaj 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (kod); break; slučaj 320: //-| o Poništi tipkovnicu.press (ctrlKey); Keyboard.print ('z'); completePress (kod); break; slučaj 3020: //-| -o Ponovi tipkovnicu.press (ctrlKey); Keyboard.print ('y'); completePress (kod); break; case 30020: // | --o History Keyboard.press (shiftKey); Keyboard.print ('y'); completePress (kod); break; slučaj 230: //-o | Sačuvaj Keyboard.press (ctrlKey); Keyboard.print ('s'); completePress (kod); break; kućište 3200: //- | o- Quick-p.webp

int buttonCode = 0;

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

if (buttonCode! = 0) {

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

doAction (buttonCode);

// ovdje unesite svoj glavni kôd, za ponavljanje: // 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 toga za reći o logici jer je slična onoj mog zadnjeg kontrolera, s dvije značajne razlike:

  1. Dugmad su strukture sa vlastitim mašinama za stanje
  2. Stanja se sabiraju 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 predstaviti binarno, umjesto toga se množe sa stepenima deset. Zatim zbrajam sva stanja dugmeta u jedan broj i prosleđujem ga u naredbu switch doAction (), gde stavljam sve kodove prečica.

Kao što vidite, nisam mapirao svaku moguću kombinaciju. Dodao sam samo nekoliko svojih omiljenih prečica, ostavljam vama da popunite ostale kako vam se čini prikladnim;)

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 štampač za kućište. Kao što vidite, dizajn ima nekih nedostataka i morao sam MacGyver -u na način da ga jednostavno zatvorim. Tako da još neću objavljivati datoteku modela.

Dugmad se vruće lijepe na "klupe" tako da drže kape na mjestu. Mekani gumbi su u tome posebno dobri, stoga svakako nabavite neke od njih ako namjeravate napraviti futrolu sličnu mojoj.

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čicama samo jednom rukom!

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

Naravno da nije savršeno, i trenutno razmišljam o nekim načinima da ga poboljšam. Osim poboljšanja kućišta i dodavanja prečica, mislim da bi bilo zanimljivo podržati više aplikacija s različitim prečicama. Razmišljam o kombinaciji dugmadi za prebacivanje između šema upravljanja, poput pritiskanja 4 dugmeta istovremeno za prebacivanje sa biblioteke prečica u Photoshopu na prilagođenu za Mayu.

Samo neke ideje.

Hvala na čitanju, do sljedećeg puta!

Preporučuje se: