Kazalo:

Ročni krmilnik bližnjic (za Photoshop + več) [Arduino]: 4 koraki
Ročni krmilnik bližnjic (za Photoshop + več) [Arduino]: 4 koraki

Video: Ročni krmilnik bližnjic (za Photoshop + več) [Arduino]: 4 koraki

Video: Ročni krmilnik bližnjic (za Photoshop + več) [Arduino]: 4 koraki
Video: SMASHY CITY CURES BAD HAIR DAY 2024, Julij
Anonim
Ročni krmilnik bližnjic (za Photoshop + več) [Arduino]
Ročni krmilnik bližnjic (za Photoshop + več) [Arduino]

Nazadnje sem ustvaril majhno kontrolno ploščico za uporabo v Photoshopu. Delal je čudeže in še vedno ga uporabljam! Je pa tudi precej omejen, saj ima le pet gumbov ter uporabne številčnice velikosti in motnosti. Še vedno sem veliko posegal po tipkovnici …

Tako sem začel delati na naslednji ponovitvi nadzorne ploščice, eni z veliko več gumbi in funkcionalnostjo. Ena kontrolna ploščica za vse.

To ni tista kontrolna ploščica. A na nek način bi bilo morda bolje.

Kaj pa, če bi imeli na voljo veliko bližnjic, a v super udobnem in lahkem paketu, ki ga lahko držite s prosto roko, medtem ko rišete neprekinjeno? … ok, dovolj z info reklamo.

Ta krmilnik je programiran tako, da ga je mogoče s samo 4 gumbi preslikati na največ 32 možnih bližnjic! Dodatni 5. gumb mi omogoča uporabo modifikacijskih tipk v kateri koli kombinaciji, kar je uporabno za številne programe (ali ste kdaj poskusili kombinacijo Alt-RMB v PS? Če niste, prosim. To je rešilni stroj). Sistem razložim kasneje.

Za vse to boste potrebovali:

  • 1 mikrokrmilnik (uporabil sem Adafruit ItsyBitsy 32u4, vendar mora vsak delati, dokler ima čip atmega32u4)
  • 1 adapter mikro-USB (podatki, ne samo za napajanje)
  • 5 gumbov (uporabil sem mehke, kot so ti)
  • 10 k ohmski upori (1 na gumb)
  • Žice, plošča, spajkalni material itd.
  • Nekaj za izdelavo ohišja (3D tiskalnik itd.)

To je vmesni projekt Arduino in predlagam, da si ogledate mojo preteklo vadnico, da boste bolje razumeli, kaj se dogaja, saj je veliko tega ponovitev stvari, ki sem jih tam razložil.

V redu, začnimo!

1. korak: Načrtovanje

Načrtovanje
Načrtovanje

To je osnovna shema, ki sem jo narisal za krmilnik. Vezje je zelo preprosto, če ga primerjate z mojim prejšnjim projektom! Toda z nekaj gumbi, ki jih ima, z močjo kombiniranih pritiskov bomo lahko naredili veliko več!

Ideja krmilne sheme je, da je vsak gumb lahko prost, pritisnjen in sproščen ali pritisnjen in zadržan. Pritisk in sprostitev je tisto, kar dejansko aktivira bližnjico, medtem ko držanje gumbov omogoča dostop do različnih bližnjic. Če torej samo pritisnete gumb A, boste aktivirali bližnjico A, če pa pritisnete B, ko pritisnete A, boste dobili drugo bližnjico. Med pritiskom lahko držite do 3 gumbe hkrati, tako da boste, ko boste uporabili nekaj osnovnih kombinatorik, videli, koliko kombinacij je mogoče s tem sistemom!

Dodatni peti gumb se mi je zdel naravni dodatek, glede na obliko ročnega računalnika, ki sem ga dobil. Odločil sem se, da ga uporabim za dostop do modifikacijskih tipk v Photoshopu. Način delovanja se nekoliko razlikuje od drugih gumbov: kadar koli držite gumb palca, se bodo uporabljali le modifikatorji. Te se aktivirajo, ko jih držite, in jih lahko pritisnete več. Torej, če je gumb A Shift, gumb B pa Ctrl, bo, ko držite tipki A in B, podobno, da pritisnete tako Shift kot Ctrl, vendar le toliko časa, dokler je pritisnjen gumb palca!

Lupina je zasnovana tako, da je ergonomska in dvostranska. Zelo sem skrbel, da je bil tesno prilegajoč, da uporaba mezinca ne bi bila preveč naporna in bi morala delovati tudi tistim, ki imajo roke večje od moje.

2. korak: Prototip + koda

Prototip + koda
Prototip + koda

Dobra praksa je, da gumbe preizkusite na plošči. To je precej preprosto, samo povežite gumbe in upore, kot je prikazano. Lahko ga preizkusite s kodo tukaj (alternativa pastebin link):

#vključi

// uporabite možnost vthisv za MacOS:

// char ctrlKey = KEY_LEFT_GUI;

// uporabite možnost vthisv za Windows in Linux:

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

// Funkcijski ključi tukaj

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

const int pin = {9, 10, 11, 12, 13}; // niz vseh zatičev gumbov

// Občutljivost

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 okvirje

const int DELAY = 0;

enum States {osvobojen, pritisnjen, zadržan, izpuščen};

gumb struct {

int pin; Države države; int timeHeld; }; // palec, kazalec, sredina, prstan, malo;

gumbi gumbov [BUTTON_NUM] = {};

button initButton (int p) {

gumb b; pinMode (p, INPUT); b.pin = p; b.država = države:: osvobojeno; b.timeHeld = 0; vrnitev b; }

void setup () {

// tukaj vstavite nastavitveno kodo, ki jo želite zagnati enkrat: Serial.begin (9600); Keyboard.begin ();

while (! Serijski) {};

// Gumbi za (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("gumb za nastavitev"); Serial.print (i); Serial.print ("na pin:"); Serial.println (zatiči ); // gumbi .pin = 1; gumbi = initButton (zatiči ); Serial.println (gumbi .pin); }

}

bool readButton (int pin) {

// gumbi za preverjanje in odvračanje if (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {vrne true; }} return false; }

int pintobin (int pin) {

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

bool press = readButton (b.pin);

switch (b.state) {primeri stanja:: sproščeno: b.timeHeld = 0; če (pritisnite) b.state = Stanja:: pritisnjeno; zlom; pritisnjen primer: b.timeHeld+= 1; if (pritisnite) {if (b.timeHeld> (THRESH_1/(1+ZAMADA))) {b.state = Države:: zadržan; }} else {// if (b.timeHeld

int getButtonStateCode (gumb b)

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

int getCodeByButton (koda int, int indeks) {

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

// prva operacija

if (opStep == 0) vrnitev kode/10000; r1 = koda%10000;

če (opStep == 1)

vrnitev r1/1000; r2 = r1%1000; če (opStep == 2) vrne r2/100; r3 = r2%100; če (opStep == 3) vrne r3/10; r4 = r3%10; if (opStep == 4) vrne r4/1; r5 = r4%1; }

void completePress (int pin) {

// Serial.print ("vnos"); // Serial.println (pin); zamuda (THRESH_3); Keyboard.releaseAll (); }

void doAction (int koda) {

// Modifikatorji if (getCodeByButton (code, 0) == 2) {// Serial.println ("--- modifikatorji ----"); 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 ("------ premik ------"); } else Keyboard.release (shiftKey); } drugo {

// opravljanje nalog

stikalo (koda) {primer 30: // --- | Brush Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (koda); zlom; primer 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (koda); zlom; primer 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (koda); zlom; primer 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (koda); zlom; primer 320: //-| o Razveljavi tipkovnico.press (ctrlKey); Keyboard.print ('z'); completePress (koda); zlom; ohišje 3020: //-| -o Redo Keyboard.press (ctrlKey); Keyboard.print ('y'); completePress (koda); zlom; primer 30020: // | --o Zgodovinska tipkovnica.press (shiftKey); Keyboard.print ('y'); completePress (koda); zlom; primer 230: //-o | Shrani tipkovnico.press (ctrlKey); Keyboard.print ('s'); completePress (koda); zlom; ohišje 3200: //- | o- Hitra tipkovnica PNG.press (shiftKey); Keyboard.press (ctrlKey); Keyboard.print ('\' '); completePress (koda); zlom; zadeva 22230: // ooo | Fn1 Keyboard.press (Fn1Key); completePress (koda); zlom; ohišje 22320: // oo | o Fn2 Keyboard.press (Fn2Key); completePress (koda); zlom; ohišje 23220: // 0 | 00 Fn3 Keyboard.press (Fn3Key); completePress (koda); zlom; ohišje 32220: // | ooo Fn4 Keyboard.press (Fn4Key); completePress (koda); zlom; }}} int f = 0; // ------------------ MAIN LOOP ------------------------- void loop () {

int buttonCode = 0;

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

if (buttonCode! = 0) {

Serial.print ("koda gumba:"); Serial.println (buttonCode); }

doAction (buttonCode);

// vnesite svojo glavno kodo sem, da se večkrat zažene: // 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 ();

zamuda (DELAY);

}

O logiki ni veliko za povedati, saj je podobna logiki mojega zadnjega krmilnika, z dvema opaznima razlikama:

  1. Gumbi so strukture z lastnimi državnimi stroji
  2. Stanja se seštejejo, da naredijo kodo, ki določa dejanje

Načelo je podobno premiku bitov, a ker imajo gumbi več stanj in jih ni mogoče preprosto predstaviti z binarno datoteko, se namesto tega pomnožijo z močmi desetih. Nato seštejem vsa stanja gumbov v eno samo številko in jo prenesem v stavek stikala doAction (), kamor vnesem vse kode bližnjic.

Kot vidite, nisem preslikal vseh možnih kombinacij. Dodal sem le nekaj mojih najljubših bližnjic, na vas prepuščam, da preostale izpolnite tako, kot se vam zdi primerno;)

3. korak: Ohišje

Ohišje
Ohišje
Ohišje
Ohišje
Ohišje
Ohišje

Za ohišje sem uporabil 3D tiskalnik. Kot lahko vidite, ima oblikovanje nekaj pomanjkljivosti, zato sem moral MacGyver način, da ga zaprem. Tako datoteke modela še ne bom objavil.

Gumbi so vroče prilepljeni na "klopi", tako da držijo pokrovčke na mestu. Mehki gumbi so pri tem še posebej dobri, zato se prepričajte, da jih dobite, če nameravate narediti primer podoben mojemu.

Prav tako predlagam, da notranjosti ohišja dodate malo teže, saj je zelo lahka. Dodatni grami bodo poskrbeli, da bo držanje bolj naravno.

Spajkajte vse, kot je prikazano, in priključite USB kabel, vse pa se mora prilegati na svoje mesto (s pomočjo lepila)!

4. korak: Rezultat in možne izboljšave

Rezultat in možne izboljšave
Rezultat in možne izboljšave
Rezultat in možne izboljšave
Rezultat in možne izboljšave
Rezultat in možne izboljšave
Rezultat in možne izboljšave

Evo ga! Ročni krmilnik, s katerim lahko z eno roko dostopate do vseh pomembnih bližnjic!

Za uporabo potrebuje nekaj mišičnega spomina, vendar je res vsestranski!

Seveda ni popoln in trenutno razmišljam o nekaterih načinih, kako ga izboljšati. Poleg izboljšanja ohišja in dodajanja bližnjic se mi zdi zanimivo podpreti več aplikacij z različnimi bližnjicami. Razmišljam o tem, da bi imel kombinacijo gumbov za preklapljanje med shemami nadzora, na primer za pritisk na 4 gumbe hkrati za preklop med knjižnico bližnjic v Photoshopu na enostavnega za Mayo.

Samo nekaj idej.

Hvala za branje, do naslednjič!

Priporočena: