Съдържание:

Ръчен контролер за преки пътища (за Photoshop + Още) [Arduino]: 4 стъпки
Ръчен контролер за преки пътища (за Photoshop + Още) [Arduino]: 4 стъпки

Видео: Ръчен контролер за преки пътища (за Photoshop + Още) [Arduino]: 4 стъпки

Видео: Ръчен контролер за преки пътища (за Photoshop + Още) [Arduino]: 4 стъпки
Видео: Zero to Hero ControlNet Tutorial: Stable Diffusion Web UI Extension | Complete Feature Guide 2024, Юли
Anonim
Ръчен контролер за бърз достъп (за Photoshop + Още) [Arduino]
Ръчен контролер за бърз достъп (за Photoshop + Още) [Arduino]

Последният път създадох малка контролна подложка, която да използвам във Photoshop. Той направи чудеса и все още го използвам! Но също така е доста ограничен, само с пет бутона и полезни циферблати за размер и непрозрачност. Все още се озовах да посягам много към клавиатурата …

Затова започнах да работя върху следващата итерация на контролния панел, един с много повече бутони и функционалност. Един контролен панел за управление на всички тях.

Това не е контролната подложка. НО по някакъв начин може да е по -добре.

Ами ако можехте да имате много преки пътища, но в супер удобен и лек пакет можете да държите със свободната си ръка, докато рисувате непрекъснато? … добре, стига с информационната реклама.

Този контролер е програмиран по начин, че само с 4 бутона може да бъде съпоставен с до 32 възможни преки пътища! Допълнителният пети бутон е там, за да ми позволи да използвам модификаторни клавиши във всяка комбинация, което е полезно за много програми (опитвали ли сте някога комбинацията Alt-RMB в PS? Ако не сте, моля, направете. Това е спасител). Обяснявам системата по -късно.

За да направите всичко това, ще ви трябва:

  • 1 микроконтролер (използвах Adafruit ItsyBitsy 32u4, но всеки трябва да работи, стига да има чип atmega32u4)
  • 1 micro-USB адаптер (данни, не само за захранване)
  • 5 бутона (използвах меки, като тези)
  • 10k Ohm резистори (1 на бутон)
  • Проводници, платки, спойка и др.
  • Нещо, с което да направите корпус (3D принтер и др.)

Това е проект на средно ниво Arduino и предлагам да разгледам миналия урок, за да разбера по-добре какво се случва, тъй като голяма част от това е повторение на нещата, които обясних там.

Добре, нека започнем!

Стъпка 1: Планиране

Планиране
Планиране

Това е основна схема, която нарисувах на контролера. Веригата е наистина проста, когато я сравните с предишния ми проект! Но ще можем да направим много повече с малкото бутони, които има, със силата на комбинираните преси!

Идеята зад схемата за управление е, че всеки бутон може да бъде или свободен, натиснат и освободен, или натиснат и задържан. Натискането и освобождаването е това, което всъщност ще активира прекия път, докато задържането на бутоните ще ни даде достъп до различни преки пътища. Така че, ако просто натиснете бутона A, ще активирате пряк път A, но ако задържите B, когато натиснете A, ще получите различен пряк път. Можете да задържите до 3 бутона едновременно, докато натискате, така че когато приложите някои основни комбинаторики, ще видите колко много комбинации са възможни с тази система!

Допълнителният пети бутон се почувства като естествено допълнение, като се има предвид формата на ръчния, който измислих. Реших да го използвам за достъп до модификаторните клавиши във Photoshop. Начинът, по който работи, е малко по -различен от другите бутони: винаги, когато бутонът за палец е задържан, ще се използват само модификатори. Те ще се активират, когато се задържат и могат да бъдат натиснати няколко. Така че, ако бутон A е Shift, а бутон B е Ctrl, когато задържите A и B, това ще бъде като натискане на Shift и Ctrl, но само докато бутонът за палец е задържан!

Черупката е проектирана да бъде ергономична и двустранна. Положих много усилия, за да го направя плътно, така че използването на малкия пръст да не е прекалено уморително и трябва да работи и за тези с ръце, по -големи от моите.

Стъпка 2: Прототип + код

Прототип + код
Прототип + код

Добра практика е да тествате бутоните на макет. Това е доста просто, просто свържете бутоните и резисторите, както е показано. Можете да го тествате с кода тук (алтернатива на pastebin link):

#включва

// използвайте опцията vthisv за MacOS:

// char ctrlKey = KEY_LEFT_GUI;

// използвайте опцията vthisv за Windows и Linux:

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

// Функционални ключове тук

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

const int щифтове = {9, 10, 11, 12, 13}; // масив от всички щифтове на бутони

// Чувствителност

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;

// Замразяване на рамки

const int ЗАДЪРЖАНИЕ = 0;

изброява държави {освободен, натиснат, задържан, освободен};

бутон struct {

int щифт; Щати щат; int timeHeld; }; // палец, показалец, средата, пръстен, малко;

бутони [BUTTON_NUM] = {};

бутон initButton (int p) {

бутон b; pinMode (p, INPUT); b.pin = p; b.state = щати:: освободени; b.timeHeld = 0; връщане b; }

void setup () {

// поставете вашия код за настройка тук, за да стартирате веднъж: Serial.begin (9600); Keyboard.begin ();

while (! Сериен) {};

// Бутони за (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("бутон за настройка"); Serial.print (i); Serial.print ("на пин:"); Serial.println (щифтове ); // бутони .pin = 1; бутони = initButton (щифтове ); Serial.println (бутони .pin); }

}

bool readButton (int pin) {

// бутони за проверка и отстраняване ако (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {връщане true; }} return false; }

int pintobin (int pin) {

if (pin == pins [0]) връщане 1; if (pin == pins [1]) връщане 10; if (pin == pins [2]) връща 100; if (pin == pins [3]) връща 1000; if (pin == pins [4]) връщане 10000; } button buttonStateUpdate (бутон b) {

bool press = readButton (b.pin);

switch (b.state) {case States:: освободен: b.timeHeld = 0; ако (натиснете) b.state = Състояния:: натиснат; прекъсване; натиснат случай: b.timeHeld+= 1; if (натиснете) {if (b.timeHeld> (THRESH_1/(1+DELAY))) {b.state = Състояние:: задържано; }} else {// if (b.timeHeld

int getButtonStateCode (бутон б)

{връщане b.state*pintobin (b.pin); }

int getCodeByButton (int код, int индекс) {

int r1, r2, r3, r4, r5; int opStep = BUTTON_NUM - (1+индекс);

// първа операция

if (opStep == 0) код за връщане/10000; r1 = код%10000;

ако (opStep == 1)

връщане r1/1000; r2 = r1%1000; if (opStep == 2) връща r2/100; r3 = r2%100; if (opStep == 3) връща r3/10; r4 = r3%10; if (opStep == 4) връща r4/1; r5 = r4%1; }

void completePress (int pin) {

// Serial.print ("вход"); // Serial.println (щифт); забавяне (THRESH_3); Keyboard.releaseAll (); }

void doAction (int код) {

// Модификатори if (getCodeByButton (код, 0) == 2) {// Serial.println ("--- модификатори ----"); if (getCodeByButton (код, 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 (код, 3)> 0) {Keyboard.press (''); } else Keyboard.release (''); if (getCodeByButton (код, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ изместване ------"); } else Keyboard.release (shiftKey); } else {

// изпълнява задачи

ключ (код) {случай 30: // --- | Brush Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (код); прекъсване; случай 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (код); прекъсване; случай 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (код); прекъсване; случай 30000: // --- | Клавиатура Lasso.press (shiftKey); Keyboard.print ('l'); completePress (код); прекъсване; случай 320: //-| o Отмяна на клавиатурата.press (ctrlKey); Keyboard.print ('z'); completePress (код); прекъсване; case 3020: //-| -o Redo Keyboard.press (ctrlKey); Keyboard.print ('y'); completePress (код); прекъсване; case 30020: // | --o History Keyboard.press (shiftKey); Keyboard.print ('y'); completePress (код); прекъсване; случай 230: //-o | Запазване на Keyboard.press (ctrlKey); Keyboard.print ('s'); completePress (код); прекъсване; case 3200: //- | o- Quick-p.webp

int buttonCode = 0;

for (int i = 0; i <BUTTON_NUM; ++ i) {бутони = buttonStateUpdate (бутони ); buttonCode+= getButtonStateCode (бутони ); }

if (buttonCode! = 0) {

Serial.print ("код на бутона:"); Serial.println (buttonCode); }

doAction (buttonCode);

// поставете основния си код тук, за да се изпълнява многократно: // за (int i = бутони [0]; i <sizeof (бутони)/sizeof (бутони [0])+бутони [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

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

Keyboard.releaseAll ();

забавяне (ЗАДЪЛЖЕНИЕ);

}

Няма много какво да се каже за логиката, тъй като тя е подобна на тази на последния ми контролер, с две забележими разлики:

  1. Бутоните са структури със собствени машини
  2. Състоянията се сумират, за да се направи код, който определя действието

Принципът е подобен на изместването на битове, но тъй като бутоните имат множество състояния и не могат просто да бъдат представени с двоичен код, те вместо това се умножават по степени на десет. След това събирам всички състояния на бутоните в едно число и го прехвърлям в оператора doAction () switch, където поставям всички кодове за бърз достъп.

Както виждате, не съм картографирал всяка възможна комбинация. Добавих само няколко от любимите си преки пътища, оставям на вас да попълните останалите според вас;

Стъпка 3: Корпусът

Корпусът
Корпусът
Корпусът
Корпусът
Корпусът
Корпусът

Използвах 3D принтер за корпуса. Както можете да видите, дизайнът има някои недостатъци и трябваше да MacGyver начин просто да го затворя. Така че все още няма да публикувам файла с модела.

Бутоните са залепени горещо върху "пейки", така че да държат капачките на място. Меките бутони са особено добри в това, така че не забравяйте да вземете някои от тях, ако планирате да направите случай, подобен на моя.

Също така предлагам да добавите малко тегло вътре в кутията, тъй като е много лека. Допълнителните грамове ще накарат да го държите по -естествено.

Запоявайте всичко, както е показано, и свържете usb кабела и всичко трябва да се побере на място (с помощта на малко лепило)!

Стъпка 4: Резултат и възможни подобрения

Резултат и възможни подобрения
Резултат и възможни подобрения
Резултат и възможни подобрения
Резултат и възможни подобрения
Резултат и възможни подобрения
Резултат и възможни подобрения

Ето го! Ръчен контролер, който можете да използвате за достъп до всички важни преки пътища само с една ръка!

Необходима е мускулна памет, за да се използва, но е наистина универсална!

Разбира се, това не е перфектно и в момента мисля за някои начини да го подобря. Освен подобряването на корпуса и добавянето на преки пътища, мисля, че би било интересно да поддържам множество приложения с различни преки пътища. Мисля да имам комбинация от бутони за превключване между схеми за управление, като например натискане на 4 бутона едновременно, за да превключвате между библиотека за бърз достъп на Photoshop към еднократна, създадена за Мая.

Само някои идеи.

Благодаря за четенето, до следващия път!

Препоръчано: