Taula de continguts:

Mini control Pad per Photoshop (Arduino): 6 passos
Mini control Pad per Photoshop (Arduino): 6 passos

Vídeo: Mini control Pad per Photoshop (Arduino): 6 passos

Vídeo: Mini control Pad per Photoshop (Arduino): 6 passos
Vídeo: CNC Mill Conversion Part 6 - Arduino Joypad Control 2024, Desembre
Anonim
Mini control Pad per Photoshop (Arduino)
Mini control Pad per Photoshop (Arduino)

Aquí us mostraré com fer una petita eina per ajudar-vos a treballar més ràpidament a Photoshop.

Els teclats dissenyats específicament per a PS no són nous, però no ofereixen exactament el que necessito. Com a pintor, la major part del meu temps a Photoshop la dedico a ajustar la configuració del pinzell i crec que els simples botons de drecera no em donen el control perquè coincideixi amb el meu flux de treball. Així que vaig decidir fabricar el meu propi teclat, petit, discret i amb dials per donar-me aquesta interacció analògica que sempre he volgut.

La seva manera de funcionar és senzilla: per fer que el microcontrolador interactuï amb Photoshop, aprofitem les dreceres predeterminades. Amb un tauler que l’ordinador pot llegir com a teclat / ratolí, només hem d’utilitzar algunes línies de codi senzilles per dir a l’ordinador que llegeixi cada entrada com una combinació de tecles. Ara, el botó de desfer només es pot prémer.

Comencem! Per a aquest projecte necessitareu:

  • 1 Sparkfun ProMicro (o un Arduino Leonardo, no recomanat)
  • 1 adaptador micro-USB
  • 6 polsadors (o qualsevol número que vulgueu)
  • Resistències de 10 k ohmis (1 per a cada botó)
  • 1 potenciòmetre
  • 1 codificador rotatiu
  • cables, taulers, taulers de perfils, soldadura, passadors de capçalera, etc.

Podeu utilitzar un Arduino Leonardo per a aquest projecte, però el ProMicro és una alternativa molt més barata que utilitza el mateix xip atmega32u4, té més pins i es presenta en una forma molt més petita, cosa que el fa perfecte per a un teclat.

Per programar el ProMicro a l'IDE Arduino, és possible que hàgiu de configurar algunes coses primer. Podeu llegir-ne més a la guia de SparkFun:

Si l’ordinador té problemes per trobar el dispositiu, assegureu-vos que el micro-USB que utilitzeu no sigui només d’energia i que admeti la transferència de dades.

Aquest és el meu primer projecte Arduino i és apte per a principiants.

Pas 1: prototipatge del control pad

Prototipatge del control pad
Prototipatge del control pad

Abans de començar a soldar, us recomano que proveu el programa en una taula de treball.

Aquí podeu veure el meu esquema.

Els botons 1 i 2 seran Desfer i Refés, del 3 al 5 són per a les eines Pinzell, Esborrador i Lasso, el botó 6 és un botó de Desa ràpid. El codificador i el potòmetre controlen la mida i l’opacitat respectivament.

Tingueu en compte que sóc esquerrà i he dissenyat el disseny de la manera més còmoda per a mi. Vegeu el moment en què utilitzeu la taula de proves com una oportunitat per pensar quines funcions voleu que tingui el controlador, què us funciona millor i, finalment, si necessiteu peces addicionals per fer-la.

Pas 2: premeu els botons

Botons de pressió
Botons de pressió

Els botons són els més senzills d'implementar. Fem una ullada al codi:

#incloure

botons const int = {2, 3, 4, 5, 6, 7, 8, 9}; // matriu de tots els pins dels botons char ctrlKey = KEY_LEFT_GUI; // utilitzeu aquesta opció per a Windows i Linux: // char ctrlKey = KEY_LEFT_CTRL; char shiftKey = KEY_LEFT_SHIFT; char altKey = KEY_LEFT_ALT; void setup () {// poseu aquí el vostre codi de configuració per executar-lo una vegada: Serial.begin (9600); Keyboard.begin (); // Botons: fa un recorregut per la matriu i comprova si hi ha premsa per (int i = botons [0]; i <(sizeof (botons) / sizeof (botons [0])) + botons [0]; ++ i) { pinMode (i, INPUT); }} boolean readButton (pin int) {// comprova i rebota botons si (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {return true; }} retornar fals; } void doAction (pin int) {// realitzar tasques commutador (pin) {// ---- dreceres ---- // Desfer cas 4: Keyboard.press (ctrlKey); Keyboard.print ('z'); Serial.print ("entrada"); Serial.println (pin); retard (200); Keyboard.releaseAll (); trencar; // Refés la minúscula 5: Keyboard.press (ctrlKey); Keyboard.print ('y'); Serial.print ("entrada"); Serial.println (pin); retard (200); Keyboard.releaseAll (); trencar; // Cas de pinzell 6: Keyboard.press ('b'); Serial.print ("entrada"); Serial.println (pin); retard (200); Keyboard.releaseAll (); trencar; // Goma d'esborrar 7: Keyboard.press ('e'); Serial.print ("entrada"); Serial.println (pin); retard (200); Keyboard.releaseAll (); trencar; // Lasso case 8: Keyboard.press ('l'); Serial.print ("entrada"); Serial.println (pin); retard (200); Keyboard.releaseAll (); trencar; // Desa el cas 9: Keyboard.press (ctrlKey); Keyboard.print ('s'); Serial.print ("entrada"); Serial.println (pin); retard (200); Keyboard.releaseAll (); trencar; per defecte: Keyboard.releaseAll (); trencar; }}

bucle buit () {

// posa aquí el teu codi principal per executar-lo repetidament:

for (int i = botons [0]; i <sizeof (botons) / sizeof (botons [0]) + botons [0]; ++ i) {if (readButton (i)) {doAction (i); }} // Restableix modificadors Keyboard.releaseAll ();

}

Són bastant senzills. Per aconseguir que l’ordinador reconegui un botó premut com a tecla, simplement fem servir la funció Keyboard.press (). Per activar la drecera Desfés (ctrl + z), simplement fem servir Keyboard.press (ctrlKey) i després Keyboard.press ('z'). Recordeu que haureu d’incloure Keyboard.h i inicialitzar el teclat per accedir a aquestes funcions.

Els pins d'entrada s'emmagatzemen en una matriu, de manera que podeu recórrer-los fàcilment a la funció loop (). Una manera fàcil d'accedir a la longitud de la matriu en c ++ dividint la mida de tota la matriu per l'element de la matriu, més un element. Recorrem tots els botons per comprovar si se n’ha premut un.

Per mantenir les coses organitzades, he emmagatzemat totes les accions del meu botó a la sentència switch d’una funció que pren el número de pin com a argument.

Si voleu que els vostres botons facin coses diferents o voleu afegir-ne més, només cal que editeu el contingut de la funció doAction.

A causa del funcionament dels botons físics, els haurem de rebutjar. Això és per evitar que el programa llegeixi les premses no desitjades causades per la elasticitat dels botons. Hi ha moltes maneres de fer-ho, però he afegit una senzilla funció readButton () que s’encarrega d’això.

Simplement connecteu els botons amb unes resistències de 10 k i hauríeu d’estar daurats.

Pas 3: el potenciòmetre

El Potenciòmetre
El Potenciòmetre

Ara al potòmetre:

#incloure

int dial0 = 0; void setup () {// poseu aquí el vostre codi de configuració per executar-lo una vegada: Serial.begin (9600); Keyboard.begin (); // Marca dial0 = analogRead (0); dial0 = mapa (dial0, 0, 1023, 1, 20); } void dialAction (int dial, int newVal, int lastVal) {switch (dial) {// Opacity case 0: delay (200); if (newVal! = lastVal) {int decim = ((newVal * 5) / 10); int unit = ((newVal * 5)% 10); if (newVal == 20) {Keyboard.write (48 + 0); Keyboard.write (48 + 0); Serial.println ("marcatge màxim 1"); } else {decim = restringir (decim, 0, 9); unitat = restringir (unitat, 0, 9); Serial.println (newVal * 2); Keyboard.write (48 + decim); Keyboard.write (48 + unitat); }} dial0 = newVal; trencar; per defecte: trencar; }} // ------------------ LOOP PRINCIPAL ------------------------- nul loop () {// posa aquí el teu codi principal per executar-lo repetidament: // Opacitat // delay (500); int val0 = analogRead (0); val0 = mapa (val0, 0, 1023, 1, 20); //Serial.print ("dial0:"); //Serial.println(val0); if (val0! = dial0) {// Feu alguna cosa dialAction (0, val0, dial0); }}

El mesurador de potes segueix la mateixa lògica, però és una mica més complicat.

Primer, vegem com volem que funcioni: Photoshop té algunes dreceres útils per canviar l’opacitat d’un pinzell. Si premeu qualsevol tecla num, l’opacitat serà igual a aquest número * 10. Però si premeu dos números, es llegirà el segon número com a unitat, donant-vos un control més precís.

Per tant, volem que el nostre potòmetre assigni la rotació a un percentatge, però no volem fer-ho tot el temps, ja que seria una ximpleria. Només volem canviar l’opacitat quan es gira el potòmetre. Per tant, emmagatzemem un valor addicional que comparem amb el valor analogRead () i només executem el script d’acció quan hi ha una diferència.

Un altre problema que ens trobarem és com convertim el retorn de analogRead com a entrada. Com que no hi ha cap manera fàcil de convertir un int en una cadena, haurem d'utilitzar el propi int. No obstant això, si només escriviu Keyboard.press (int), notareu que l'entrada no serà el que volíeu i, en canvi, es prem una altra tecla.

Això es deu al fet que les tecles del vostre teclat estan codificades com a enters, cada tecla té el seu propi índex. Per utilitzar correctament la tecla num, haureu de buscar el seu índex a la taula ASCII:

Com podeu veure, les tecles num comencen a l’índex 48. Per tant, per prémer la tecla correcta, tot el que haurem de fer és afegir el valor del dial a 48. Els valors decimals i unitaris són pressions separades.

Finalment, necessitem una manera d’evitar que el valor salti endavant i enrere. Perquè si proveu d’utilitzar el dial amb el mapa (val0, 0, 1023, 0, 100), trobareu que els resultats seran molt molestos. De manera similar a la forma en què vam rebutjar els botons, solucionarem això sacrificant part de la precisió. Vaig trobar que assignar-lo a 1-20 i multiplicar el valor dels arguments per 5 per ser un compromís acceptable.

Per connectar el potenciòmetre, només cal que connecteu un cable de 5 V, un cable de terra i un cable d’entrada analògic i no hi hauria d’haver problemes.

Dada curiosa: si utilitzeu aquesta drecera mentre es selecciona una eina com el Lasso, canviarà l’opacitat de la capa. Alguna cosa a tenir en compte.

Pas 4: el codificador rotatiu

El codificador rotatiu
El codificador rotatiu

Els codificadors rotatius s’assemblen una mica als potenciòmetres, però sense un límit de quant poden girar. En lloc d’un valor analògic, mirarem la direcció de gir del codificador digitalment. No entraré en molts detalls de com funcionen, però el que heu de saber és que utilitza dos pins d'entrada a l'arduino per dir en quina direcció s'està girant. El codificador rotatiu pot ser més complicat de treballar, és possible que diferents codificadors necessitin configuracions diferents. Per fer les coses més fàcils, en vaig comprar un amb PCB, que es pot lligar amb passadors femella. Ara, el codi:

#incloure

// Codificador rotatiu #define outputA 15 #define outputB 14 int counter = 0; int aEstat; int aLastState; void setup () {// poseu aquí el vostre codi de configuració per executar-lo una vegada: // Rotary pinMode (outputA, INPUT); pinMode (sortida B, INPUT); // Llegeix l'estat inicial de la sortidaA aLastState = digitalRead (sortidaA); } void rotaryAction (int dir) {if (dir> 0) {Keyboard.press (']'); } else {Keyboard.press ('['); } Keyboard.releaseAll (); } // ------------------ LOOP PRINCIPAL ------------------------- bucle buit () {// poseu aquí el vostre codi principal per executar-lo repetidament: // Mida aState = digitalRead (sortidaA); if (aState! = aLastState) {if (digitalRead (sortidaB)! = aState) {// counter ++; rotaryAction (1); } else {// counter -; rotaryAction (-1); } //Serial.print("Position: "); //Serial.println(counter); } aLastState = aState; }

Per defecte, Photoshop] i [dreceres] augmenten i redueixen la mida del pinzell. Igual que abans, volem introduir-les com a tecles. El codificador envia diverses entrades per torn (que depèn del model), i volem augmentar / disminuir la mida del pinzell per a cadascuna d’aquestes entrades, de manera que pugueu pujar o baixar el dial molt ràpidament, però també controleu-lo lentament amb gran precisió.

Igual que amb el potòmetre, només volem executar l'acció quan es gira el dial. A diferència del potòmetre, com he explicat abans, el codificador rotatiu té dues entrades alternes. Veiem quin ha canviat per establir la direcció en què es gira el dial.

Després, segons la direcció, premem la tecla correcta.

Mentre no tingueu problemes de contacte, hauria de funcionar.

Pas 5: ajuntar-ho tot

Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt
Posant-ho tot junt

Ara a la soldadura. En primer lloc, perforem dos forats al tauler de perfecció per adaptar-se a les dues esferes. soldem els botons i les seves respectives resistències. He perforat dos forats petits per deixar passar els cables d’entrada per estalviar espai a sota, però això no és necessari. No hi ha molts cables d’entrada, de manera que els cables GND i 5V funcionen en paral·lel, però si us sentiu astut potser voldreu fer una matriu. Vaig soldar el microcontrolador amb un altre perfboard més petit, que cabia a sota al costat del codificador i el mesurador de pot. Ara he soldat tots els cables al ProMicro. No cal ser creatiu, només havia de seguir el mateix esquema que el que apareix a la taula de treball, però comprendre que soldar en un lloc tan petit pot ser tediós. No siguis com jo, fes servir una tira de filferro i una bona soldadura!

Finalment, és possible que vulgueu fer un bon cas per al vostre nou company de Photoshop. Una millor que la meva, almenys!

Però si teniu ganes de provar-ho, utilitzeu una mica de cartró i cinta adhesiva i connecteu el vostre micro-USB.

Pas 6: Codi + demostració

Image
Image

Assegureu-vos de provar el programa del control pad a mesura que avanceu en el projecte per evitar sorpreses.

Aquí teniu el codi complet:

Moltes gràcies per llegir!

Recomanat: