Inhaltsverzeichnis:

Mini Control Pad für Photoshop (Arduino) - Gunook
Mini Control Pad für Photoshop (Arduino) - Gunook

Video: Mini Control Pad für Photoshop (Arduino) - Gunook

Video: Mini Control Pad für Photoshop (Arduino) - Gunook
Video: Dynamically Assignable Macro Keyboard with e-ink Display 2024, Juli
Anonim
Mini Control Pad für Photoshop (Arduino)
Mini Control Pad für Photoshop (Arduino)

Hier zeige ich Ihnen, wie Sie ein kleines Tool erstellen, mit dem Sie schneller in Photoshop arbeiten können!

Tastaturen, die speziell für PS entwickelt wurden, sind nicht neu, aber sie bieten nicht genau das, was ich brauche. Als Maler verbringe ich einen Großteil meiner Zeit in Photoshop damit, die Pinseleinstellungen anzupassen, und ich denke, dass mir einfache Tastenkombinationen nicht die Kontrolle geben, um meinem Workflow zu entsprechen. Also beschloss ich, meine eigene Tastatur zu bauen, die klein und unauffällig ist und über Wählscheiben verfügt, um mir die analoge Interaktion zu ermöglichen, die ich immer wollte.

Die Funktionsweise ist einfach: Damit der Mikrocontroller mit Photoshop interagiert, nutzen wir die Standard-Shortcuts. Bei einer Platine, die der Computer als Tastatur/Maus lesen kann, müssen wir nur einige einfache Codezeilen verwenden, um dem Computer mitzuteilen, dass er jede Eingabe als Kombination von Tastendrücken lesen soll. Jetzt ist der Rückgängig-Knopf nur einen Knopfdruck entfernt!

Lass uns anfangen! Für dieses Projekt benötigen Sie:

  • 1 Sparkfun ProMicro (oder ein Arduino Leonardo, nicht empfohlen)
  • 1 Micro-USB-Adapter
  • 6 Drucktasten (oder eine beliebige Zahl)
  • 10k Ohm Widerstände (1 für jede Taste)
  • 1 Potentiometer
  • 1 Drehgeber
  • Drähte, Steckbrett, Perfboard, Lötzinn, Stiftleisten usw.

Sie können für dieses Projekt einen Arduino Leonardo verwenden, aber der ProMicro ist eine viel billigere Alternative, die den gleichen atmega32u4-Chip verwendet, mehr Pins hat und in einer viel kleineren Form daherkommt, was ihn perfekt für eine Tastatur macht.

Um das ProMicro in der Arduino IDE zu programmieren, müssen Sie möglicherweise zuerst einige Dinge einrichten. Sie können mehr darüber in der Anleitung von SparkFun lesen:

Wenn Ihr Computer das Gerät nicht finden kann, stellen Sie sicher, dass der von Ihnen verwendete Micro-USB nicht nur mit Strom versorgt wird und die Datenübertragung unterstützt.

Dies ist mein erstes Arduino-Projekt und ist für Anfänger geeignet.

Schritt 1: Prototyping des Control Pads

Prototyping des Control Pads
Prototyping des Control Pads

Ich empfehle Ihnen, Ihr Programm zuerst auf einem Steckbrett zu testen, bevor Sie mit dem Löten beginnen.

Hier seht ihr meinen Schaltplan.

Schaltflächen 1 und 2 sind Rückgängig und Wiederherstellen, 3 bis 5 sind für die Werkzeuge Pinsel, Radiergummi und Lasso, Schaltfläche 6 ist eine schnelle Schaltfläche zum Speichern. Der Encoder und das Potentiometer steuern Size bzw. Opazität.

Beachten Sie, dass ich Linkshänder bin und das Layout so gestaltet habe, dass es für mich am angenehmsten ist. Betrachten Sie den Moment, in dem Sie Ihr Steckbrett verwenden, als Gelegenheit, darüber nachzudenken, welche Funktionen Ihr Controller haben soll, was für Sie am besten funktioniert und ob Sie eventuell zusätzliche Teile benötigen, um ihn herzustellen.

Schritt 2: Drucktasten

Drück Knöpfe
Drück Knöpfe

Die Tasten sind am einfachsten zu implementieren. Schauen wir uns den Code an:

#enthalten

const int-Tasten = {2, 3, 4, 5, 6, 7, 8, 9}; // Array aller Button-Pins char ctrlKey = KEY_LEFT_GUI; // diese Option für Windows und Linux verwenden: //char ctrlKey = KEY_LEFT_CTRL; char shiftKey = KEY_LEFT_SHIFT; char altKey = KEY_LEFT_ALT; Void setup () { // Geben Sie Ihren Setup-Code hier ein, um ihn einmal auszuführen: Serial.begin (9600); Tastatur.begin(); //Buttons -- Schleife durch das Array und prüfe auf Drücken for(int i = buttons[0]; i < (sizeof(buttons)/sizeof(buttons[0]))+buttons[0]; ++i) { pinMode (i, EINGANG); aufrechtzuerhalten. if (digitalRead (pin) == HIGH) { return true; } } falsch zurückgeben; aufrechtzuerhalten. Void doAction (int pin) { // Aufgaben ausführen Schalter (pin) { // ---- Shortcuts ---- // Fall 4 rückgängig machen: Keyboard.press (ctrlKey); Keyboard.print('z'); Serial.print ("Eingabe"); Serial.println (Stift); Verzögerung (200); Keyboard.releaseAll(); brechen; // Fall 5 wiederholen: Keyboard.press (ctrlKey); Keyboard.print('y'); Serial.print ("Eingabe"); Serial.println (Stift); Verzögerung (200); Keyboard.releaseAll(); brechen; // Pinseletui 6: Keyboard.press('b'); Serial.print ("Eingabe"); Serial.println (Stift); Verzögerung (200); Keyboard.releaseAll(); brechen; //Radiergummi Fall 7: Keyboard.press('e'); Serial.print ("Eingabe"); Serial.println (Stift); Verzögerung (200); Keyboard.releaseAll(); brechen; // Lasso-Fall 8: Keyboard.press('l'); Serial.print ("Eingabe"); Serial.println (Stift); Verzögerung (200); Keyboard.releaseAll(); brechen; // Fall 9 speichern: Keyboard.press (ctrlKey); Keyboard.print('s'); Serial.print ("Eingabe"); Serial.println (Stift); Verzögerung (200); Keyboard.releaseAll(); brechen; Standard: Keyboard.releaseAll(); brechen; } }

Leere Schleife () {

// Geben Sie Ihren Hauptcode hier ein, um ihn wiederholt auszuführen:

for(int i = buttons[0]; i < sizeof(buttons)/sizeof(buttons[0])+buttons[0]; ++i) { if (readButton(i)) { doAction(i); } } // Modifikatoren zurücksetzen Keyboard.releaseAll();

}

Sie sind ziemlich unkompliziert. Damit der Computer einen Tastendruck als Tastendruck erkennt, verwenden wir einfach die Funktion Keyboard.press(). Um die Rückgängig-Verknüpfung (Strg+z) zu aktivieren, verwenden wir einfach Keyboard.press(StrgKey) und dann Keyboard.press('z'). Denken Sie daran, dass Sie Keyboard.h einbinden und die Tastatur initialisieren müssen, um auf diese Funktionen zuzugreifen.

Die Eingangspins werden in einem Array gespeichert, sodass Sie alle in der Funktion loop() problemlos durchlaufen können. Eine einfache Möglichkeit, in C++ auf die Länge des Arrays zuzugreifen, indem die Größe des gesamten Arrays durch das Array-Element plus ein Element geteilt wird. Wir durchlaufen alle Tasten, um zu überprüfen, ob eine gedrückt wurde.

Um die Ordnung zu halten, habe ich alle Aktionen meiner Schaltfläche in der switch-Anweisung einer Funktion gespeichert, die die Pin-Nummer als Argument verwendet.

Wenn Sie möchten, dass Ihre Schaltflächen verschiedene Dinge tun oder weitere Schaltflächen hinzufügen möchten, bearbeiten Sie einfach den Inhalt der doAction-Funktion!

Aufgrund der Funktionsweise physischer Tasten müssen wir sie entprellen. Dadurch soll verhindert werden, dass das Programm ungewollte Betätigungen durch die Federung der Drucktasten liest. Es gibt viele Möglichkeiten, dies zu tun, aber ich habe eine einfache readButton()-Funktion hinzugefügt, die sich darum kümmert.

Verdrahten Sie einfach Ihre Tasten mit einigen 10k-Widerständen, und Sie sollten golden sein!

Schritt 3: Das Potentiometer

Das Potentiometer
Das Potentiometer

Nun zum Potmeter:

#enthalten

int dial0 = 0; Void setup () { // Geben Sie Ihren Setup-Code hier ein, um ihn einmal auszuführen: Serial.begin (9600); Tastatur.begin(); // Zifferblätter dial0 = analogRead (0); dial0= map(dial0, 0, 1023, 1, 20); aufrechtzuerhalten. Void dialAction (int dial, int newVal, int lastVal) { switch (dial) {// Deckkraft Fall 0: Verzögerung (200); if (newVal!=lastVal) { int decim = ((newVal*5)/10); int-Einheit = ((newVal *5)% 10); if (newVal==20) { Keyboard.write (48+0); Tastatur.schreiben(48+0); Serial.println ("maximal 1"); aufrechtzuerhalten. Sonst { decim = constrain (decim, 0, 9); unit=constrain(Einheit, 0, 9); Serial.println (neuer Wert * 2); Keyboard.write (48+dezim); Keyboard.write (48+Einheit); } } dial0=newVal; brechen; Standard: Pause; } } //------------------HAUPTSCHLEIFE------------------------- void loop() { // Setzen Sie Ihren Hauptcode hier ein, um ihn wiederholt auszuführen: //Opacity //delay(500); int val0 = analogRead(0); val0 = map(val0, 0, 1023, 1, 20); //Serial.print ("dial0: "); //Seriell.println(val0); if (val0!=dial0) { // Etwas tun dialAction (0, val0, dial0); } }

Das Potmeter folgt der gleichen Logik, ist aber etwas kniffliger.

Schauen wir uns zunächst an, wie es funktionieren soll: Photoshop bietet einige praktische Tastenkombinationen, um die Deckkraft eines Pinsels zu ändern. Wenn Sie eine beliebige Num-Taste drücken, entspricht die Deckkraft dieser Zahl*10. Wenn Sie jedoch zwei Zahlen drücken, wird die zweite Zahl als Einheit gelesen, sodass Sie eine genauere Kontrolle haben.

Wir möchten also, dass unser Potometer seine Drehung auf einen Prozentsatz abbildet, aber wir möchten dies nicht die ganze Zeit tun, da das albern wäre. Wir wollen die Deckkraft nur ändern, wenn am Potmeter gedreht wird. Wir speichern also einen zusätzlichen Wert, den wir mit dem analogRead()-Wert vergleichen und führen das Aktionsskript nur dann aus, wenn es einen Unterschied gibt.

Ein weiteres Problem, auf das wir stoßen werden, ist, wie wir den Return int von analogRead als Eingabe verwenden. Da es keine einfache Möglichkeit gibt, ein int in einen String umzuwandeln, müssen wir das int selbst verwenden. Wenn Sie jedoch einfach Keyboard.press(int) schreiben, werden Sie feststellen, dass die Eingabe nicht Ihren Wünschen entspricht und stattdessen eine andere Taste gedrückt wird.

Dies liegt daran, dass die Tasten Ihrer Tastatur alle als ganze Zahlen codiert sind, wobei jede Taste ihren eigenen Index hat. Um den Zahlenschlüssel richtig zu verwenden, müssen Sie den Index in der ASCII-Tabelle nachschlagen:

Wie Sie sehen, beginnen die Num-Tasten bei Index 48. Um also die richtige Taste zu drücken, müssen wir nur den Wert des Zifferblatts zu 48 addieren. Die Dezimal- und Einheitenwerte sind getrennte Tastendrücke.

Schließlich brauchen wir eine Möglichkeit, um zu verhindern, dass der Wert hin und her springt. Denn wenn Sie versuchen, das Dial mit map(val0, 0, 1023, 0, 100) zu verwenden, werden Sie feststellen, dass die Ergebnisse sehr nervös sind. Ähnlich wie wir die Tasten entprellt haben, werden wir dies beheben, indem wir einen Teil der Genauigkeit opfern. Ich fand, dass es ein akzeptabler Kompromiss ist, ihn auf 1-20 zuzuordnen und dann den Wert der Argumente mit 5 zu multiplizieren.

Um das Potentiometer anzuschließen, schließen Sie einfach ein 5V-Kabel, ein Massekabel und ein analoges Eingangskabel an und es sollte keine Probleme geben.

Interessante Tatsache: Wenn Sie diese Verknüpfung verwenden, während ein Werkzeug wie das Lasso ausgewählt ist, ändert es stattdessen die Deckkraft der Ebene. Etwas zu beachten.

Schritt 4: Der Drehgeber

Der Drehgeber
Der Drehgeber

Drehgeber sind ein bisschen wie Potentiometer, aber ohne Begrenzung, wie viel sie drehen können. Anstelle eines analogen Wertes betrachten wir die Drehrichtung des Encoders digital. Ich werde nicht ins Detail gehen, wie diese funktionieren, aber was Sie wissen müssen, ist, dass zwei Eingangspins am Arduino verwendet werden, um zu sagen, in welche Richtung es gedreht wird. Der Drehgeber kann schwieriger zu handhaben sein, verschiedene Encoder erfordern möglicherweise unterschiedliche Setups. Um es einfacher zu machen, habe ich eine mit PCB gekauft, die bereit sind, mit weiblichen Stiften eingehakt zu werden. Nun der Code:

#enthalten

// Drehgeber #define outputA 15 #define outputB 14 int counter = 0; int aState; int aLastState; Void setup () { // Geben Sie Ihren Setup-Code hier ein, um ihn einmal auszuführen: // Rotary pinMode (outputA, INPUT); pinMode (AusgangB, INPUT); // Liest den Anfangszustand von outputA aLastState = digitalRead(outputA); aufrechtzuerhalten. Void rotationAction (int dir) { if (dir> 0) { Keyboard.press (']'); } else { Keyboard.press('['); } Keyboard.releaseAll(); } //------------------MAIN LOOP------------------------- void loop () { // Geben Sie Ihren Hauptcode hier ein, um ihn wiederholt auszuführen: // Größe aState = digitalRead (outputA); if (aState!= aLastState) { if (digitalRead (outputB) != aState) {//Zähler ++; DrehAction(1); } else { //Zähler --; DrehAction(-1); } //Serial.print("Position: "); //Seriell.println (Zähler); } aLastState = aState; }

Standardmäßig erhöhen und verringern die Photoshop-Verknüpfungen] und [die Pinselgröße. Genau wie zuvor möchten wir diese als Tastendrücke eingeben. Der Encoder sendet eine Anzahl von Eingaben pro Umdrehung (je nach Modell), und wir möchten die Pinselgröße für jeden dieser Eingaben erhöhen / verringern, damit Sie das Drehrad wirklich schnell nach oben oder unten drehen können, aber auch in der Lage sind kontrolliere es langsam mit großer Präzision.

Genau wie beim Potentiometer wollen wir die Aktion nur ausführen, wenn das Zifferblatt gedreht wird. Im Gegensatz zum Potmeter hat der Drehgeber, wie ich bereits erläutert habe, zwei alternierende Eingänge. Wir schauen uns an, welche davon sich geändert hat, um festzustellen, in welche Richtung das Zifferblatt gedreht wird.

Dann drücken wir je nach Richtung die richtige Taste.

Solange Sie keine Kontaktprobleme haben, sollte es funktionieren.

Schritt 5: Alles zusammenfügen

Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen

Nun zum Löten. Zuerst bohren wir zwei Löcher in das Perfboard, um die beiden Zifferblätter zu passen. Wir löten die Tasten und ihre jeweiligen Widerstände. Ich bohrte zwei zusätzliche kleine Löcher, um die Eingangsdrähte oben passieren zu lassen, um Platz darunter zu sparen, aber das ist nicht notwendig. Es gibt nicht viele Eingangskabel, so dass die GND- und 5V-Kabel parallel verlaufen, aber wenn Sie sich schlau fühlen, möchten Sie vielleicht eine Matrix erstellen. Ich lötete den Mikrocontroller an ein anderes, kleineres Perfboard, das neben dem Encoder und dem Potmeter darunter passte. Jetzt löte ich alle Drähte an das ProMicro. Ich muss nicht kreativ sein, ich musste nur dem gleichen Schema wie dem auf dem Steckbrett folgen, aber das Löten an einem so kleinen Ort kann verständlicherweise mühsam sein. Seien Sie nicht wie ich, verwenden Sie eine Abisolierzange und ein gutes Lötmittel!

Schließlich möchten Sie vielleicht einen schönen Fall für Ihren neuen Photoshop-Kumpel machen. Zumindest einer besser als meiner!

Aber wenn Sie es versuchen möchten, verwenden Sie etwas Pappe und Klebeband und schließen Sie Ihren Micro-USB an.

Schritt 6: Code + Demonstration

Image
Image

Testen Sie unbedingt das Programm des Control Pads, während Sie im Projekt voranschreiten, um Überraschungen zu vermeiden!

Hier ist der vollständige Code:

Vielen Dank fürs Lesen!

Empfohlen: