Taula de continguts:

Controlador de drecera de mà (per a Photoshop + Més) [Arduino]: 4 passos
Controlador de drecera de mà (per a Photoshop + Més) [Arduino]: 4 passos

Vídeo: Controlador de drecera de mà (per a Photoshop + Més) [Arduino]: 4 passos

Vídeo: Controlador de drecera de mà (per a Photoshop + Més) [Arduino]: 4 passos
Vídeo: Как работает Spring Boot и что такое auto-configuration. Магия? 2024, Juliol
Anonim
Controlador de drecera de mà (per a Photoshop + Més) [Arduino]
Controlador de drecera de mà (per a Photoshop + Més) [Arduino]

La darrera vegada vaig crear un minúscul bloc de control per utilitzar-lo a Photoshop. Va funcionar de meravella i encara ho faig servir. Però també és bastant limitat, amb només cinc botons i els dials de mida i opacitat útils. Encara em vaig trobar buscant molt el teclat …

Així que vaig començar a treballar en la següent iteració del control pad, una amb molts botons i funcionalitat. Un coixinet de control per governar-los tots.

Això no és aquest bloc de control. PERUT en certa manera podria ser millor.

Què passa si poguessis tenir un munt de dreceres, però en un paquet molt còmode i lleuger pots aguantar amb la mà lliure mentre dibuixes sense interrupcions? … d'acord, prou amb la publicitat infomercial.

Aquest controlador està programat de manera que, amb només 4 botons, es pot assignar fins a 32 dreceres possibles. El cinquè botó addicional hi és per permetre'm utilitzar tecles modificadores en qualsevol combinació, cosa que és útil per a molts programes (alguna vegada heu provat el combinat Alt-RMB a PS? Si no ho heu fet, si us plau, feu-ho. És un salvavides). Més endavant explico el sistema.

Per fer tot això, necessitareu:

  • 1 microcontrolador (he utilitzat un Adafruit ItsyBitsy 32u4 però qualsevol ha de fer-ho sempre que tingui el xip atmega32u4)
  • 1 adaptador micro-USB (dades, no només alimentació)
  • 5 polsadors (n'he utilitzat de suaus, com aquests)
  • Resistències de 10 k ohmis (1 per botó)
  • Filferros, taulers de pa, material de soldadura, etc.
  • Alguna cosa amb què fer una carcassa (impressora 3D, etc.)

Es tracta d’un projecte Arduino de nivell intermedi i us suggereixo mirar el meu tutorial passat per entendre millor què passa, ja que bona part d’això és una repetició de les coses que hi vaig explicar.

D’acord, comencem!

Pas 1: planificació

Planificació
Planificació

Aquest és un esquema bàsic que vaig dibuixar del controlador. El circuit és realment senzill si el compareu amb el meu projecte anterior. Però podrem fer molt més amb els pocs botons que té, amb la potència de les premses combinades.

La idea darrere de l’esquema de control és que cada botó pot ser lliure, premut i alliberat, o bé mantingut premut. Premeu i deixeu anar el que realment activarà la drecera, mentre manteniu premuts els botons ens donarà accés a diferents dreceres. Per tant, si només premeu el botó A, activareu la drecera A, però si manteniu premut B en prémer A, obtindreu una drecera diferent. Podeu mantenir fins a 3 botons alhora alhora de prémer, de manera que quan apliqueu una combinatòria bàsica, veureu quantes combinacions són possibles amb aquest sistema.

El cinquè botó addicional em va semblar un complement natural, donada la forma del dispositiu de mà que em va semblar. Vaig decidir utilitzar-lo per accedir a les tecles modificadores de Photoshop. El seu funcionament és lleugerament diferent dels altres botons: sempre que es manté premut el botó polze, només s’utilitzaran modificadors. Aquests s'activaran quan es mantenen premuts i es poden prémer diversos. Per tant, si el botó A és Maj i el botó B és Ctrl, quan mantingueu premudes A i B serà com prémer Maj i Ctrl, però només mentre es mantingui premut el botó polze.

La carcassa està dissenyada per ser ergonòmica i ambidiestra. Vaig tenir molta cura de fer que encaixés perfectament de manera que fer servir el dit petit no resultés massa cansat i hauria de funcionar també per a aquells amb mans més grans que les meves.

Pas 2: prototip + codi

Prototip + Codi
Prototip + Codi

És una bona pràctica provar els botons d’una taula de treball. És bastant senzill, només cal que connecteu els botons i les resistències tal com es mostra. Podeu provar-ho amb el codi aquí (alternativa a l'enllaç pastebin):

#incloure

// utilitzeu l'opció vthisv per a MacOS:

// char ctrlKey = KEY_LEFT_GUI;

// utilitzeu l'opció vthisv per a Windows i Linux:

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

// Tecles de funció aquí

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

const int pins = {9, 10, 11, 12, 13}; // matriu de tots els pins dels botons

// Sensibilitat

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;

// Congelar fotogrames

const int DELAY = 0;

enum States {alliberat, pressionat, retingut, alliberat};

botó struct {

int pin; Estats estatals; int timeHeld; }; // polze, índex, mitjà, anell, poc;

botons de botó [BUTTON_NUM] = {};

botó initButton (int p) {

botó b; pinMode (p, INPUT); b.pin = p; b.state = Estats:: alliberat; b.timeHeld = 0; retorn b; }

configuració nul·la () {

// poseu aquí el vostre codi de configuració per executar-lo una vegada: Serial.begin (9600); Keyboard.begin ();

while (! Serial) {};

// Botons per a (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("botó de configuració"); Serial.print (i); Serial.print ("al pin:"); Serial.println (pins ); //butons.pin = 1; botons = initButton (pins ); Serial.println (botons .pin); }

}

bool readButton (pin int) {

// comproveu i rebutgeu els botons si (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {return true; }} retornar fals; }

int pintobin (int pin) {

if (pin == pins [0]) retorna 1; if (pin == pins [1]) retorna 10; if (pin == pins [2]) retorna 100; if (pin == pins [3]) retorna 1000; if (pin == pins [4]) retorna 10000; } botó buttonStateUpdate (botó b) {

bool press = readButton (b.pin);

switch (b.state) {case States:: alliberat: b.timeHeld = 0; if (premeu) b.state = Estats:: premut; trencar; majúscules i minúscules: b.timeHeld + = 1; if (premeu) {if (b.timeHeld> (THRESH_1 / (1 + DELAY))) {b.state = States:: held; }} else {// if (b.timeHeld

int getButtonStateCode (botó b)

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

int getCodeByButton (codi int, índex int) {

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

// primera operació

if (opStep == 0) return code / 10000; r1 = codi% 10000;

if (opStep == 1)

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

void completePress (int pin) {

// Serial.print ("entrada"); // Serial.println (pin); retard (THRESH_3); Keyboard.releaseAll (); }

void doAction (codi int) {

// Modificadors if (getCodeByButton (code, 0) == 2) {// Serial.println ("--- modificadors ----"); 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 ("------ shift ------"); } else Keyboard.release (shiftKey); } més {

// realitzar tasques

commutador (codi) {cas 30: // --- | Pinzell Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (codi); trencar; cas 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (codi); trencar; cas 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (codi); trencar; cas 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (codi); trencar; cas 320: // - | o Desfés Keyboard.press (ctrlKey); Keyboard.print ('z'); completePress (codi); trencar; case 3020: // - | -o Refés el teclat.press (ctrlKey); Keyboard.print ('y'); completePress (codi); trencar; case 30020: // | --o History Keyboard.press (shiftKey); Keyboard.print ('y'); completePress (codi); trencar; cas 230: // - o | Desa Keyboard.press (ctrlKey); Keyboard.print ('s'); completePress (codi); trencar; case 3200: // - | o- Quick-p.webp

int buttonCode = 0;

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

if (ButtonCode! = 0) {

Serial.print ("codi de botó:"); Serial.println (buttonCode); }

doAction (buttonCode);

// posa el codi principal aquí, per executar-lo repetidament: // per (int i = botons [0]; i <sizeof (botons) / sizeof (botons [0]) + botons [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

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

Keyboard.releaseAll ();

retard (DELAY);

}

No hi ha molt a dir sobre la lògica, ja que és similar a la del meu darrer controlador, amb dues diferències notables:

  1. Els botons són estructures amb les seves pròpies màquines d'estat
  2. Els estats es sumen junts per crear un codi que determina l'acció

El principi és similar al canvi de bits, però com que els botons tenen diversos estats i no es poden representar simplement amb un binari, es multipliquen per potències de deu. A continuació, afegeixo tots els estats del botó en un sol número i el passo a la instrucció doAction () switch, on he posat tots els codis de dreceres.

Com podeu veure, no he mapat totes les combinacions possibles. Només he afegit algunes de les meves dreceres preferides, deixo a vosaltres que ompliu la resta de la manera que millor cregueu convenient;)

Pas 3: la carcassa

La carcassa
La carcassa
La carcassa
La carcassa
La carcassa
La carcassa

Vaig utilitzar una impressora 3D per a la carcassa. Com podeu veure, el disseny té alguns defectes i he tingut a MacGyver una manera de tancar-lo. Per tant, encara no publicaré el fitxer model.

Els botons s’enganxen en calent als "bancs" per mantenir els taps al seu lloc. Els polsadors suaus són especialment bons per això, així que assegureu-vos d’obtenir alguns d’aquests si teniu previst fer un cas similar al meu.

A més, suggereixo afegir una mica de pes dins de la caixa, ja que és molt lleuger. Els grams addicionals faran que la seva celebració se senti més natural.

Soldeu-ho tot tal com es mostra i connecteu el cable USB i tot hauria d’encaixar al seu lloc (amb l’ajut d’alguna cola).

Pas 4: Resultat i possibles millores

Resultat i possibles millores
Resultat i possibles millores
Resultat i possibles millores
Resultat i possibles millores
Resultat i possibles millores
Resultat i possibles millores

Aquí el teniu! Un controlador de mà que podeu utilitzar per accedir a totes les dreceres importants amb una sola mà.

Es necessita una mica de memòria muscular, però és molt versàtil.

Per descomptat, no és perfecte i ara mateix estic pensant en algunes maneres de millorar-lo. A part de millorar la carcassa i afegir dreceres, crec que seria interessant donar suport a diverses aplicacions amb dreceres diferents. Estic pensant en tenir una combinació de botons per canviar entre esquemes de control, com prémer 4 botons al mateix temps per canviar entre una biblioteca de dreceres de Photoshop a una feta a mida per a Maya.

Només algunes idees.

Gràcies per llegir, fins a la propera!

Recomanat: