Բովանդակություն:

Ձեռքի դյուրանցման վերահսկիչ (Photoshop + - ի համար) [Arduino] ՝ 4 քայլ
Ձեռքի դյուրանցման վերահսկիչ (Photoshop + - ի համար) [Arduino] ՝ 4 քայլ

Video: Ձեռքի դյուրանցման վերահսկիչ (Photoshop + - ի համար) [Arduino] ՝ 4 քայլ

Video: Ձեռքի դյուրանցման վերահսկիչ (Photoshop + - ի համար) [Arduino] ՝ 4 քայլ
Video: Բանտեր և վիշապներ. Ձեզ եմ ներկայացնում ԲՈԼՈՐ ԿԱUEՈԹՅԱՆ Magic The Gathering քարտերը 2024, Հուլիսի
Anonim
Ձեռքի դյուրանցման վերահսկիչ (Photoshop + ավելին) [Arduino]
Ձեռքի դյուրանցման վերահսկիչ (Photoshop + ավելին) [Arduino]

Անցյալ անգամ ես ստեղծեցի մի փոքրիկ կառավարման պահոց ՝ Photoshop- ում օգտագործելու համար: Այն հրաշքներ գործեց, և ես դեռ օգտագործում եմ այն: Բայց դա նաև բավականին սահմանափակ է ՝ ընդամենը հինգ կոճակով և օգտակար չափի և անթափանցիկ թվանշաններով: Ես դեռ շարունակում էի շատ հասնել ստեղնաշարին…

Այսպիսով, ես սկսեցի աշխատել կառավարման տախտակի հաջորդ կրկնության վրա, մեկը ՝ ավելի շատ կոճակներով և ֆունկցիոնալությամբ: Բոլորը կառավարելու համար մեկ կառավարման բարձիկ:

Սա այն կառավարման տախտակը չէ: Բայց ինչ -որ առումով գուցե ավելի լավ լինի:

Ի՞նչ կլիներ, եթե կարողանայիք ունենալ մեկ տոննա դյուրանցումներ, բայց գերհագեցած և թեթև փաթեթում կարող եք պահել ձեր ազատ ձեռքով, մինչ նկարում եք անխափան: … Լավ, բավական է infomercial- ի հետ:

Այս վերահսկիչը ծրագրված է այնպես, որ ընդամենը 4 կոճակով այն կարող է քարտեզագրվել մինչև 32 հնարավոր դյուրանցումների վրա: Լրացուցիչ 5-րդ կոճակը կա, որը թույլ է տալիս ինձ օգտագործել փոփոխիչ ստեղներ ցանկացած համադրությամբ, ինչը օգտակար է շատ ծրագրերի համար (երբևէ փորձե՞լ եք Alt-RMB կոմբինոն PS- ում: Եթե չեք փորձել, խնդրում եմ: Դա փրկարար է): Ես ավելի ուշ բացատրում եմ համակարգը:

Այս ամենը պատրաստելու համար ձեզ հարկավոր է.

  • 1 միկրոկոնտրոլեր (ես օգտագործել եմ Adafruit ItsyBitsy 32u4, բայց ցանկացածը պետք է անի այնքան ժամանակ, քանի դեռ ունի atmega32u4 չիպը)
  • 1 միկրո USB ադապտեր (տվյալները, ոչ միայն էներգիայի)
  • 5 կոճակ (ես օգտագործել եմ փափուկ, ինչպես սրանք)
  • 10k Ohm ռեզիստորներ (1 մեկ կոճակի համար)
  • Հաղորդալարեր, տախտակ, զոդման նյութ և այլն:
  • Ինչ -որ բան պատյան պատրաստելու համար (3D տպիչ և այլն)

Սա միջանկյալ մակարդակի Arduino նախագիծ է, և ես առաջարկում եմ նայել իմ անցած ձեռնարկը `ավելի լավ հասկանալու համար, թե ինչ է կատարվում, քանի որ դրա մեծ մասը կրկնում է այնտեղ բացատրածներիս:

Լավ, եկեք սկսենք:

Քայլ 1: Պլանավորում

Պլանավորում
Պլանավորում

Սա վերահսկիչի հիմնական սխեմատիկ պատկերն է: Շղթան իսկապես պարզ է, երբ այն համեմատում ես իմ նախորդ նախագծի հետ: Բայց մենք կկարողանանք շատ ավելին անել իր ունեցած մի քանի կոճակներով ՝ համակցված սեղմումների ուժով:

Կառավարման սխեմայի հիմքում ընկած է այն, որ յուրաքանչյուր կոճակ կարող է լինել ազատ, սեղմված և բաց թողնված, կամ սեղմված և պահված: Սեղմելը և բաց թողնելն այն է, ինչ իրականում կակտիվացնի դյուրանցումը, մինչդեռ կոճակները պահելը մեզ հնարավորություն կտա մուտք գործել տարբեր դյուրանցումների: Այսպիսով, եթե պարզապես սեղմեք A կոճակը, ապա կակտիվացնեք A դյուրանցումը, բայց եթե A- ն սեղմելիս պահեք B- ն, կստանաք այլ դյուրանցում: Սեղմելիս կարող եք միաժամանակ պահել մինչև 3 կոճակ, այնպես որ, երբ կիրառեք որոշ հիմնական կոմբինատորիկա, կտեսնեք, թե որքան համակցություններ են հնարավոր այս համակարգի հետ:

Լրացուցիչ հինգերորդ կոճակը կարծես բնական հավելում էր ՝ հաշվի առնելով իմ ձեռքի ձեռքի ձևը: Ես որոշեցի օգտագործել այն Photoshop- ում փոփոխիչ ստեղներ մուտք գործելու համար: Գործողության ձևը փոքր -ինչ տարբերվում է մյուս կոճակներից. Երբ բռնում եք բութ մատը, կօգտագործվեն միայն փոփոխիչներ: Դրանք կակտիվանան, երբ դրանք պահվում են, և բազմակի սեղմելը հնարավոր կլինի: Այսպիսով, եթե A կոճակը Shift է, և B կոճակը Ctrl է, A և B սեղմած պահելը նման կլինի ինչպես Shift- ը, այնպես էլ Ctrl- ը սեղմելուն, բայց միայն այնքան ժամանակ, քանի դեռ բռնում է բութ մատը:

Կեղևը նախագծված է այնպես, որ լինի ինչպես էրգոնոմիկ, այնպես էլ երկշերտ: Ես մեծ ջանքեր գործադրեցի, որպեսզի այն սերտորեն տեղավորվի, որպեսզի փոքր մատը օգտագործելը շատ հոգնեցուցիչ չլինի, և այն պետք է աշխատի նաև իմ ձեռքերից ավելի մեծ ձեռքերով:

Քայլ 2. Նախատիպ + ծածկագիր

Նախատիպ + ծածկագիր
Նախատիպ + ծածկագիր

Լավ պրակտիկա է ստուգել կոճակները հացահատիկի վրա: Դա բավականին պարզ է, պարզապես միացրեք կոճակները և ռեզիստորները, ինչպես ցույց է տրված: Կարող եք այն այստեղ ստուգել ծածկագրով (pastebin link alternative):

#ներառում

// օգտագործել 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}; // բոլոր կոճակների կապումների զանգված

// ensգայունություն

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 ՎԵՐELՈԹՅՈՆ = 0;

enum States {ազատ արձակված, սեղմված, պահված, ազատ արձակված};

կառուցվածքի կոճակ {

int քորոց; Նահանգների պետություն; int timeHeld; }; // բութ, ինդեքս, միջին, մատանի, փոքր;

կոճակների կոճակներ [BUTTON_NUM] = {};

կոճակ initButton (int p) {

կոճակ b; pinMode (p, INPUT); b.pin = p; բ. պետություն = Նահանգներ:: ազատ է արձակվել; բ. timeHeld = 0; վերադարձ բ; }

void setup () {

// տեղադրեք ձեր տեղադրման կոդը այստեղ ՝ մեկ անգամ գործարկելու համար. Serial.begin (9600); Keyboard.begin ();

իսկ (! Սերիա) {};

// կոճակներ (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("set set button"); Serial.print (i); Serial.print ("at pin:"); Serial.println (կապում ); // կոճակներ կոճակներ = initButton (կապում ); Serial.println (կոճակներ .pin); }

}

bool readButton (int pin) {

// ստուգել և հանել կոճակները, եթե (digitalRead (pin) == HIGH) {հետաձգում (10); if (digitalRead (pin) == HIGH) {return true; }} վերադարձնել կեղծ; }

int pintobin (int pin) {

if (pin == կապում [0]) վերադարձնել 1; if (pin == կապում [1]) վերադարձնել 10; if (pin == կապում [2]) վերադարձնել 100; if (pin == կապում [3]) վերադարձնել 1000; if (pin == կապում [4]) վերադարձնել 10000; } կոճակ buttonStateUpdate (կոճակ բ) {

bool press = readButton (b.pin);

switch (b.state) {case Նահանգներ:: ազատ է արձակվել ՝ b.timeHeld = 0; եթե (մամուլ) b.state = Նահանգներ:: սեղմված; ընդմիջում; գործը սեղմված է ՝ b.timeHeld+= 1; եթե (սեղմեք) {if (b.timeHeld> (THRESH_1/(1+DELAY))) {b.state = Նահանգներ:: անցկացված; }} այլ {// եթե (ծն. 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; եթե (opStep == 2) վերադարձնել r2/100; r3 = r2%100; եթե (opStep == 3) վերադարձնել r3/10; r4 = r3%10; եթե (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 ("--- փոփոխիչներ ----"); եթե (getCodeByButton (ծածկագիր, 1)> 0) {Keyboard.press (altKey); // Serial.println ("------- alt ---------"); } else Keyboard.release (altKey); եթե (getCodeByButton (կոդ, 2)> 0) {Keyboard.press (ctrlKey); // Serial.println ("-------- ctrl ----------"); } else Keyboard.release (ctrlKey); if (getCodeByButton (կոդ, 3)> 0) {Keyboard.press (''); } else Keyboard.release (''); եթե (getCodeByButton (կոդ, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ հերթափոխ ------"); } else Keyboard.release (shiftKey); } ուրիշ {

// կատարել առաջադրանքներ

անջատիչ (ծածկագիր) {դեպք 30: // --- | Խոզանակ Keyboard.press (shiftKey); Keyboard.print ('b'); ամբողջական Մամուլ (ծածկագիր); ընդմիջում; գործ 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); ամբողջական Մամուլ (ծածկագիր); ընդմիջում; գործ 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); ամբողջական Մամուլ (ծածկագիր); ընդմիջում; գործ 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); ամբողջական Մամուլ (ծածկագիր); ընդմիջում; գործ 320: //-| o Հետարկել Keyboard.press (ctrlKey); Keyboard.print ('z'); ամբողջական Մամուլ (ծածկագիր); ընդմիջում; գործ 3020: //-| -o Redo Keyboard.press (ctrlKey); Keyboard.print ('y'); ամբողջական Մամուլ (ծածկագիր); ընդմիջում; գործ 30020: // | --o Պատմության ստեղնաշար. սեղմում (shiftKey); Keyboard.print ('y'); ամբողջական Մամուլ (ծածկագիր); ընդմիջում; գործ 230: //-o | Պահել Keyboard.press (ctrlKey); Keyboard.print ('s'); ամբողջական Մամուլ (ծածկագիր); ընդմիջում; գործ 3200: //- | o- Quick-p.webp

int կոճակԿոդ = 0;

համար (int i = 0; i <BUTTON_NUM; ++ i) {կոճակներ = buttonStateUpdate (կոճակներ ); buttonCode+= getButtonStateCode (կոճակներ ); }

եթե (buttonCode! = 0) {

Serial.print ("կոճակի կոդը ՝"); Serial.println (buttonCode); }

doAction (կոճակի կոդ);

// տեղադրեք ձեր հիմնական կոդը այստեղ ՝ բազմիցս գործարկելու համար. // for (int i = կոճակներ [0]; i <sizeof (կոճակներ)/sizeof (կոճակներ [0])+կոճակներ [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

եթե (getCodeByButton (buttonCode, 0)! = 2)

Keyboard.releaseAll ();

հետաձգում (ՈELՇԱԴՐՈԹՅՈՆ);

}

Տրամաբանության մասին շատ բան չկա ասելու, քանի որ այն նման է իմ վերջին վերահսկիչի տրամաբանությանը ՝ երկու նշանակալի տարբերությամբ.

  1. Կոճակները կառուցվածքներ են `իրենց պետական մեքենաներով
  2. Նահանգները միասին ամփոփվում են ՝ կազմելով գործողություն որոշող ծածկագիր

Սկզբունքը նման է բիթ-տեղաշարժի, բայց քանի որ կոճակները ունեն բազմաթիվ վիճակներ և չեն կարող պարզապես ներկայացվել երկուականով, փոխարենը դրանք բազմապատկվում են տասի ուժերով: Այնուհետև ես ավելացնում եմ բոլոր կոճակների վիճակները մեկ համարի մեջ և փոխանցում այն doAction () switch հայտարարությանը, որտեղ ես դնում եմ բոլոր դյուրանցումների ծածկագիրը:

Ինչպես տեսնում եք, ես քարտեզագրեցի բոլոր հնարավոր համադրությունները: Ես ավելացրել եմ միայն իմ սիրած դյուրանցումներից մի քանիսը, մնացածը լրացնում եմ ձեզ ՝ ինչպես ամենալավը ձեզ հարմար է թվում;)

Քայլ 3: Պատյան

Պատյան
Պատյան
Պատյան
Պատյան
Պատյան
Պատյան

Ես պատյան օգտագործեցի 3D տպիչով: Ինչպես տեսնում եք, դիզայնը որոշ թերություններ ունի, և ես ստիպված էի MacGyver- ին պարզապես փակել այն: Այսպիսով, ես դեռ չեմ տեղադրի մոդելի ֆայլը:

Կոճակները տաք-սոսնձված են «նստարանների» վրա, որպեսզի նրանք գլխարկները տեղում պահեն: Փափուկ կոճակները հատկապես լավ են դրանում, այնպես որ, անպայման ձեռք բերեք դրանցից մի քանիսը, եթե մտադիր եք պատրաստել նմանը իմին:

Բացի այդ, ես առաջարկում եմ մի փոքր քաշ ավելացնել պատյանի ներսում, քանի որ այն շատ թեթև է: Լրացուցիչ գրամը դրան պահելը ավելի բնական կդարձնի:

Erոդեք ամեն ինչ, ինչպես ցույց է տրված և միացրեք USB մալուխը, և ամեն ինչ պետք է տեղավորվի տեղում (ինչ -որ սոսինձի օգնությամբ):

Քայլ 4: Արդյունք և հնարավոր բարելավումներ

Արդյունք և հնարավոր բարելավումներ
Արդյունք և հնարավոր բարելավումներ
Արդյունք և հնարավոր բարելավումներ
Արդյունք և հնարավոր բարելավումներ
Արդյունք և հնարավոր բարելավումներ
Արդյունք և հնարավոր բարելավումներ

Ահա դուք ունեք այն: Ձեռքի վերահսկիչ, որը կարող եք օգտագործել ձեր բոլոր կարևոր դյուրանցումները մուտք գործելու համար միայն մեկ ձեռքով:

Օգտագործման համար անհրաժեշտ է որոշակի մկանային հիշողություն, բայց դա իսկապես բազմակողմանի է:

Իհարկե, դա կատարյալ չէ, և հենց հիմա ես մտածում եմ այն բարելավելու որոշ ուղիների մասին: Բացի պատյանների բարելավումից և դյուրանցումների ավելացումից, կարծում եմ, որ հետաքրքիր կլիներ տարբեր դյուրանցումներով բազմաթիվ ծրագրերի աջակցությունը: Ես մտածում եմ ունենալ կոճակների համադրություն կառավարման սխեմաների միջև անցնելու համար, ինչպես միաժամանակ սեղմել 4 կոճակ ՝ Photoshop- ի դյուրանցման գրադարանից Մայայի համար ստեղծված մեկին հարմարեցված:

Պարզապես որոշ գաղափարներ:

Շնորհակալություն կարդալու համար, մինչև հաջորդ անգամ: