Оглавление:

Мини-панель управления для Photoshop (Arduino): 6 шагов
Мини-панель управления для Photoshop (Arduino): 6 шагов

Видео: Мини-панель управления для Photoshop (Arduino): 6 шагов

Видео: Мини-панель управления для Photoshop (Arduino): 6 шагов
Видео: Панель управления шаговым двигателем на Arduino. 2024, Ноябрь
Anonim
Мини-панель управления для Photoshop (Arduino)
Мини-панель управления для Photoshop (Arduino)

Вот я покажу вам, как сделать небольшой инструмент, который поможет вам работать в Photoshop быстрее!

Клавиатуры, специально созданные для PS, не новы, но они не совсем то, что мне нужно. Как художник, я большую часть времени в Photoshop трачу на настройку кисти, и я думаю, что простые кнопки быстрого доступа не дают мне контроля, соответствующего моему рабочему процессу. Поэтому я решил сделать свою собственную клавиатуру, маленькую, ненавязчивую, с циферблатами, которые дают мне то аналоговое взаимодействие, которое я всегда хотел.

Принцип работы прост: чтобы микроконтроллер взаимодействовал с Photoshop, мы используем ярлыки по умолчанию. С платой, которую компьютер может читать как клавиатуру / мышь, все, что нам нужно сделать, это использовать несколько простых строк кода, чтобы сообщить компьютеру, что каждый ввод будет считываться комбинацией нажатий клавиш. Теперь кнопка отмены находится всего в одном нажатии кнопки!

Давайте начнем! Для этого проекта вам понадобятся:

  • 1 Sparkfun ProMicro (или Arduino Leonardo, не рекомендуется)
  • 1 адаптер micro-USB
  • 6 кнопок (или любое количество, которое вам нравится)
  • Резисторы 10 кОм (по 1 на каждую кнопку)
  • 1 потенциометр
  • 1 поворотный энкодер
  • провода, макет, монтажная плата, припой, штыри и т. д.

Вы можете использовать Arduino Leonardo для этого проекта, но ProMicro - гораздо более дешевая альтернатива, которая использует тот же чип atmega32u4, имеет больше контактов и имеет гораздо меньшую форму, что делает его идеальным для клавиатуры.

Чтобы запрограммировать ProMicro в Arduino IDE, вам может потребоваться сначала настроить некоторые вещи. Вы можете узнать больше об этом в руководстве SparkFun:

Если вашему компьютеру не удается найти устройство, убедитесь, что используемый вами разъем micro-USB не предназначен только для питания и поддерживает передачу данных.

Это мой первый проект Arduino, он подходит для новичков.

Шаг 1. Создание прототипа панели управления

Создание прототипа контрольной панели
Создание прототипа контрольной панели

Я рекомендую вам сначала протестировать вашу программу на макетной плате, прежде чем приступить к пайке.

Здесь вы можете увидеть мою схему.

Кнопки 1 и 2 будут «Отменить» и «Вернуть», 3–5 - для инструментов «Кисть», «Ластик» и «Лассо», кнопка 6 - это кнопка быстрого сохранения. Кодировщик и потенциометр управляют размером и непрозрачностью соответственно.

Обратите внимание, что я левша и разработал макет таким образом, чтобы мне было удобнее его использовать. Воспринимайте момент, когда вы используете макетную плату, как возможность подумать о том, какие функции вы хотите, чтобы ваш контроллер имел, что лучше всего подходит для вас и, в конечном итоге, понадобятся ли вам дополнительные детали для этого.

Шаг 2: нажмите кнопки

Нажмите на кнопки
Нажмите на кнопки

Кнопки реализовать проще всего. Взглянем на код:

#включают

const int buttons = {2, 3, 4, 5, 6, 7, 8, 9}; // массив всех выводов кнопок char ctrlKey = KEY_LEFT_GUI; // используйте эту опцию для Windows и Linux: // char ctrlKey = KEY_LEFT_CTRL; char shiftKey = KEY_LEFT_SHIFT; char altKey = KEY_LEFT_ALT; void setup () {// поместите сюда ваш установочный код, чтобы запустить его один раз: Serial.begin (9600); Keyboard.begin (); // Кнопки - перебираем массив и проверяем нажатия для (int i = buttons [0]; i <(sizeof (buttons) / sizeof (buttons [0])) + buttons [0]; ++ i) { pinMode (я, ВХОД); }} boolean readButton (int pin) {// кнопки проверки и устранения ошибок if (digitalRead (pin) == HIGH) {delay (10); если (digitalRead (контакт) == ВЫСОКИЙ) {вернуть истину; }} return false; } void doAction (int pin) {// выполнение задач switch (pin) {// ---- Горячие клавиши ---- // Отменить случай 4: Keyboard.press (ctrlKey); Keyboard.print ('z'); Serial.print («вход»); Serial.println (контакт); задержка (200); Keyboard.releaseAll (); перерыв; // Повторить случай 5: Keyboard.press (ctrlKey); Keyboard.print ('y'); Serial.print («вход»); Serial.println (контакт); задержка (200); Keyboard.releaseAll (); перерыв; // Кисть 6: Keyboard.press ('b'); Serial.print («вход»); Serial.println (контакт); задержка (200); Keyboard.releaseAll (); перерыв; // Ластик 7: Keyboard.press ('e'); Serial.print («вход»); Serial.println (контакт); задержка (200); Keyboard.releaseAll (); перерыв; // Случай лассо 8: Keyboard.press ('l'); Serial.print («вход»); Serial.println (контакт); задержка (200); Keyboard.releaseAll (); перерыв; // Сохраняем регистр 9: Keyboard.press (ctrlKey); Keyboard.print ('s'); Serial.print («вход»); Serial.println (контакт); задержка (200); Keyboard.releaseAll (); перерыв; по умолчанию: Keyboard.releaseAll (); перерыв; }}

void loop () {

// поместите сюда свой основной код, чтобы запускать его повторно:

for (int я = кнопки [0]; я <размер (кнопки) / размер (кнопки [0]) + кнопки [0]; ++ i) {если (readButton (i)) {doAction (i); }} // Сброс модификаторов Keyboard.releaseAll ();

}

Они довольно простые. Чтобы компьютер распознавал нажатие кнопки как нажатие клавиши, мы просто используем функцию Keyboard.press (). Итак, чтобы активировать сочетание клавиш Undo (ctrl + z), мы просто используем Keyboard.press (ctrlKey), а затем Keyboard.press ('z'). Помните, что вам нужно будет включить Keyboard.h и инициализировать клавиатуру для доступа к этим функциям.

Входные контакты хранятся в массиве, поэтому вы можете легко перебрать их все в функции loop (). Один простой способ получить доступ к длине массива в C ++, разделив размер всего массива на элемент массива плюс один элемент. Мы перебираем все кнопки, чтобы проверить, была ли нажата одна из них.

Чтобы все было организовано, я сохранил все действия моей кнопки в операторе switch функции, которая принимает номер контакта в качестве аргумента.

Если вы хотите, чтобы ваши кнопки выполняли разные функции или хотите добавить больше кнопок, просто отредактируйте содержимое функции doAction!

Из-за того, как работают физические кнопки, нам нужно будет заблокировать их. Это сделано для того, чтобы программа не считывала любые нежелательные нажатия, вызванные упругостью кнопок. Есть много способов сделать это, но я добавил простую функцию readButton (), которая позаботится об этом.

Просто подключите свои кнопки с резисторами 10 кОм, и вы должны быть золотыми!

Шаг 3: потенциометр

Потенциометр
Потенциометр

Теперь о горшке:

#включают

int dial0 = 0; void setup () {// поместите сюда ваш установочный код для однократного запуска: Serial.begin (9600); Keyboard.begin (); // Набирает dial0 = analogRead (0); dial0 = map (dial0, 0, 1023, 1, 20); } void dialAction (int dial, int newVal, int lastVal) {switch (dial) {// Непрозрачность case 0: delay (200); если (newVal! = lastVal) {int decim = ((newVal * 5) / 10); int unit = ((newVal * 5)% 10); если (newVal == 20) {Keyboard.write (48 + 0); Keyboard.write (48 + 0); Serial.println («макс. Циферблат 1»); } else {decim = ограничение (decim, 0, 9); unit = ограничить (unit, 0, 9); Serial.println (newVal * 2); Keyboard.write (48 + десятичное); Keyboard.write (48 + единица); }} dial0 = newVal; перерыв; по умолчанию: перерыв; }} // ------------------ MAIN LOOP ------------------------- void loop () {// поместите сюда ваш основной код для повторного запуска: // Opacity // delay (500); int val0 = аналоговое чтение (0); val0 = карта (val0, 0, 1023, 1, 20); //Serial.print ("dial0:"); //Serial.println(val0); if (val0! = dial0) {// Что-нибудь делаем dialAction (0, val0, dial0); }}

Потметр следует той же логике, но немного сложнее.

Сначала давайте посмотрим, как мы хотим, чтобы это работало: в Photoshop есть несколько удобных ярлыков для изменения непрозрачности кисти. Если вы нажмете любую клавишу с цифрой, непрозрачность будет равна этому числу * 10. Но если вы нажмете две цифры, вторая цифра будет считаться как единое целое, что даст вам более точный контроль.

Итак, мы хотим, чтобы наш потметр отображал свое вращение в процентах, но мы не хотим делать это все время, поскольку это было бы глупо. Мы хотим изменить непрозрачность только при повороте потенциометра. Таким образом, мы сохраняем дополнительное значение, которое сравниваем со значением analogRead (), и запускаем сценарий действия только тогда, когда есть разница.

Еще одна проблема, с которой мы столкнемся, - это то, как мы превратим int, возвращаемый функцией analogRead, в качестве входных данных. Поскольку нет простого способа превратить int в строку, нам придется использовать само int. Однако, если вы просто напишите Keyboard.press (int), вы заметите, что ввод не будет тем, что вы хотели, и вместо этого будет нажата другая клавиша.

Это потому, что все клавиши вашей клавиатуры закодированы как целые числа, и каждая клавиша имеет свой индекс. Чтобы правильно использовать ключ num, вам нужно будет найти их индекс в таблице ASCII:

Как вы можете видеть, цифровые клавиши начинаются с индекса 48. Итак, чтобы нажать правильную клавишу, все, что нам нужно сделать, это добавить значение шкалы к 48. Десятичные значения и единицы измерения - это отдельные нажатия.

Наконец, нам нужен способ, чтобы значение не прыгало вперед и назад. Потому что, если вы попытаетесь использовать циферблат с map (val0, 0, 1023, 0, 100), вы обнаружите, что результаты будут очень нестабильными. Подобно тому, как мы отклоняли кнопки, мы исправим это, пожертвовав некоторой точностью. Я обнаружил, что сопоставление его с 1-20, а затем умножение значения аргументов на 5 является приемлемым компромиссом.

Чтобы подключить потенциометр, просто подключите провод 5 В, провод заземления и провод аналогового входа, и проблем быть не должно.

Интересный факт: если вы используете этот ярлык, когда выбран такой инструмент, как Лассо, вместо этого он изменит непрозрачность слоя. На что стоит обратить внимание.

Шаг 4: поворотный энкодер

Поворотный энкодер
Поворотный энкодер

Поворотные энкодеры немного похожи на потенциометры, но без ограничения на то, на сколько они могут поворачиваться. Вместо аналогового значения мы будем смотреть на направление вращения энкодера в цифровом виде. Я не буду вдаваться в подробности того, как они работают, но вам нужно знать, что он использует два входных контакта на Arduino, чтобы определить, в каком направлении он поворачивается. С поворотным энкодером может быть сложнее работать, для разных энкодеров могут потребоваться разные настройки. Чтобы упростить задачу, я купил одну с печатной платой, которая готова к подключению с помощью штифтов. Теперь код:

#включают

// Круговой энкодер #define outputA 15 #define outputB 14 int counter = 0; int aState; int aLastState; void setup () {// поместите сюда ваш установочный код, чтобы запустить его один раз: // Rotary pinMode (outputA, INPUT); pinMode (outputB, INPUT); // Считывает начальное состояние outputA aLastState = digitalRead (outputA); } void rotaryAction (int dir) {если (каталог> 0) {Keyboard.press (']'); } else {Keyboard.press ('['); } Keyboard.releaseAll (); } // ------------------ MAIN LOOP ------------------------- void loop () {// поместите сюда ваш основной код для повторного запуска: // Size aState = digitalRead (outputA); if (aState! = aLastState) {if (digitalRead (outputB)! = aState) {// counter ++; rotaryAction (1); } else {// счетчик -; rotaryAction (-1); } //Serial.print("Position: "); //Serial.println(counter); } aLastState = aState; }

По умолчанию ярлыки Photoshop] и [увеличивают и уменьшают размер кисти. Как и раньше, мы хотим вводить их как нажатия клавиш. Кодировщик отправляет несколько входов за один ход (в зависимости от модели), и мы хотим увеличивать / уменьшать размер кисти для каждого из этих входов, чтобы вы могли очень быстро поворачивать циферблат вверх или вниз, но также иметь возможность управляйте им медленно и с большой точностью.

Как и в случае с потметром, мы хотим запускать действие только при повороте шкалы. В отличие от потенциометра, как я объяснял ранее, угловой энкодер имеет два чередующихся входа. Мы смотрим, какая из них изменилась, чтобы определить направление вращения циферблата.

Затем в зависимости от направления нажимаем правильную клавишу.

Пока у вас нет проблем с контактами, он должен работать.

Шаг 5: Собираем все вместе

Собираем все вместе
Собираем все вместе
Собираем все вместе
Собираем все вместе
Собираем все вместе
Собираем все вместе

Теперь перейдем к пайке. Сначала мы просверливаем два отверстия в перфорированной плате, чтобы они соответствовали двум циферблатам. Припаиваем кнопки и соответствующие им резисторы. Я просверлил два дополнительных маленьких отверстия, чтобы подводящие провода проходили сверху, чтобы сэкономить место под ними, но в этом нет необходимости. Входных проводов не так много, поэтому провода GND и 5V идут параллельно, но если вы чувствуете себя хитрым, вы можете сделать матрицу. Я припаял микроконтроллер к другой плате меньшего размера, которая помещалась под ней рядом с энкодером и потенциометром. Теперь припаиваю все провода к ProMicro. Не нужно проявлять творчества, мне просто нужно было следовать той же схеме, что и на макетной плате, но пайка в таком маленьком месте, по понятным причинам, может быть утомительной. Не будь таким, как я, используйте инструмент для зачистки проводов и хороший припой!

Наконец, вы можете сделать хороший футляр для своего нового друга по Photoshop. По крайней мере, на один лучше моего!

Но если вы хотите попробовать, используйте картон и скотч и подключите свой micro-USB.

Шаг 6: Код + демонстрация

Image
Image

Обязательно тестируйте программу панели управления по мере продвижения по проекту, чтобы избежать сюрпризов!

Вот полный код:

Большое спасибо за чтение!

Рекомендуемые: