Sisukord:

Käeshoitav otseteekontroller (Photoshop + jaoks) [Arduino]: 4 sammu
Käeshoitav otseteekontroller (Photoshop + jaoks) [Arduino]: 4 sammu

Video: Käeshoitav otseteekontroller (Photoshop + jaoks) [Arduino]: 4 sammu

Video: Käeshoitav otseteekontroller (Photoshop + jaoks) [Arduino]: 4 sammu
Video: Парусная навигация и связь в море / Sextant-Ipad, SSB-Iridium Go! Патрик Чилдресс Парусный спорт 2024, Juuli
Anonim
Käeshoitav otseteekontroller (Photoshop + jaoks) [Arduino]
Käeshoitav otseteekontroller (Photoshop + jaoks) [Arduino]

Viimati lõin Photoshopis kasutamiseks pisikese juhtimispuldi. See tegi imesid ja ma kasutan seda siiani! Kuid see on ka üsna piiratud, vaid viie nupuga ning kasuliku suuruse ja läbipaistmatuse ketastega. Leidsin end ikka palju klaviatuuri poole sirutamas …

Nii hakkasin töötama järgmise juhtimispuldi iteratsiooni kallal, kus oli palju rohkem nuppe ja funktsioone. Üks juhtimispult nende kõigi juhtimiseks.

See pole see juhtimispult. AGA mõnes mõttes võib see olla parem.

Mis siis, kui teil oleks palju otseteid, kuid ülimalt mugavas ja kergemas pakendis saate katkestusteta joonistades vaba käega kinni hoida? … Ok, piisab infomaterjalist.

See kontroller on programmeeritud nii, et vaid 4 nupuga saab selle kaardistada kuni 32 võimalikuks otseteeks! Täiendav viies nupp on selleks, et saaksin kasutada muuteklahve suvalises kombinatsioonis, mis on kasulik paljudele programmidele (kas olete kunagi proovinud PS-is Alt-RMB kombinatsiooni? Kui te pole seda teinud, palun tehke seda. See on elupäästja). Ma selgitan süsteemi hiljem.

Selle kõige tegemiseks vajate:

  • 1 mikrokontroller (kasutasin Adafruit ItsyBitsy 32u4, kuid igaüks peaks seda tegema seni, kuni sellel on atmega32u4 kiip)
  • 1 mikro-USB-adapter (andmed, mitte ainult toide)
  • 5 vajutusnuppu (ma kasutasin selliseid pehmeid)
  • 10 kΩ takistid (1 nupu kohta)
  • Juhtmed, leivaplaat, jootematerjal jne.
  • Midagi korpuse valmistamiseks (3D -printer jne)

See on keskastme Arduino projekt ja ma soovitan vaadata oma varasemat õpetust, et paremini aru saada, mis toimub, kuna suur osa sellest kordab neid asju, mida ma seal selgitasin.

Ok, alustame!

Samm: planeerimine

Planeerimine
Planeerimine

See on kontrolleri põhiskeem. Ahel on tõesti lihtne, kui võrrelda seda minu eelmise projektiga! Kuid me suudame kombineeritud presside abil teha palju rohkem selle nuppude abil!

Juhtimisskeemi idee seisneb selles, et iga nupp võib olla vaba, vajutatud ja vabastatud või all hoitud. Vajutamine ja vabastamine on see, mis otsetee tegelikult aktiveerib, samal ajal kui nuppe all hoides saame juurdepääsu erinevatele otseteedele. Nii et kui vajutate lihtsalt nuppu A, aktiveerite otsetee A, kuid kui vajutate nuppu B vajutades, saate teistsuguse otsetee. Vajutades saate vajutada korraga kuni 3 nuppu, nii et kui kasutate mõnda põhilist kombinatoorikat, näete, kui palju kombinatsioone on selle süsteemiga võimalik teha!

Täiendav viies nupp tundus loomuliku lisandina, arvestades pihuarvuti kuju, mille ma välja mõtlesin. Otsustasin seda kasutada Photoshopis muutmisvõtmete juurde pääsemiseks. Selle toimimisviis erineb pisut teistest nuppudest: kui pöidla nuppu all hoitakse, kasutatakse ainult modifikaatoreid. Need aktiveeruvad, kui neid hoitakse ja mitut saab vajutada. Nii et kui nupp A on tõstuklahv ja nupp B on Ctrl, siis kui hoiate all klahve A ja B, on see sama, mis vajutades nii tõstuklahvi kui ka klahvi Ctrl, kuid ainult seni, kuni pöidla nuppu all hoitakse!

Kest on disainitud nii ergonoomiliseks kui ka kahepoolseks. Hoolitsesin selle eest, et see sobiks tihedalt nii, et väikese sõrme kasutamine ei oleks liiga väsitav ja see peaks toimima ka neil, kellel on minust suuremad käed.

2. samm: prototüüp + kood

Prototüüp + kood
Prototüüp + kood

Hea tava on testida leivalaua nuppe. See on üsna lihtne, lihtsalt ühendage nupud ja takistid, nagu näidatud. Saate seda siin koodiga testida (pastebin link alternatiiv):

#kaasake

// kasuta MacOS -i jaoks vthisv valikut:

// char ctrlKey = KEY_LEFT_GUI;

// kasuta suvandit vthisv Windowsi ja Linuxi jaoks:

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

// Funktsiooniklahvid siin

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

const int tihvtid = {9, 10, 11, 12, 13}; // kõigi nööpnõelte massiiv

// Tundlikkus

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;

// Raamide külmutamine

const int DELAY = 0;

enum States {vabastatud, pressitud, hoitud, vabastatud};

struktuuri nupp {

int pin; Osariigid; int timeHeld; }; // pöial, indeks, keskel, rõngas, väike;

nupunupud [BUTTON_NUM] = {};

nupp initButton (int p) {

nupp b; pinMode (p, INPUT); b.pin = p; b.riik = osariigid:: vabastatud; b. timeHeld = 0; tagasitulek b; }

tühine seadistus () {

// pange oma seadistuskood siia, et üks kord käivitada: Serial.begin (9600); Klaviatuur.begin ();

while (! Seeria) {};

// Nupud (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("set button"); Seeriatrükk (i); Serial.print ("pin:"); Serial.println (tihvtid ); //nupud.pin = 1; nupud = initButton (tihvtid ); Serial.println (nupud .pin); }

}

bool readButton (int pin) {

// kontrollimise ja tagasilükkamise nupud, kui (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {return true; }} return false; }

int pintobin (int pin) {

if (pin == tihvtid [0]) tagastab 1; if (pin == tihvtid [1]) tagastab 10; if (pin == tihvtid [2]) tagastab 100; if (pin == tihvtid [3]) tagastab 1000; if (pin == tihvtid [4]) tagastab 10000; } nupp buttonStateUpdate (nupp b) {

bool press = readButton (b.pin);

lüliti (b.riik) {juhtumi olekud:: vabastatud: b.timeHeld = 0; if (press) b.state = Olekud:: pressitud; murda; korpust vajutatud: b.timeHeld+= 1; if (vajutage) {if (b.timeHeld> (THRESH_1/(1+DELAY)))) {b.state = States:: held; }} muu {// kui (b.timeHeld

int getButtonStateCode (nupp b)

{return b.state*pintobin (b.pin); }

int getCodeByButton (int -kood, int -indeks) {

int r1, r2, r3, r4, r5; int opStep = BUTTON_NUM - (1+indeks);

// esimene operatsioon

if (opStep == 0) tagastuskood/10000; r1 = kood%10000;

kui (opStep == 1)

tagasitulek r1/1000; r2 = r1%1000; if (opStep == 2) tagasta r2/100; r3 = r2%100; if (opStep == 3) tagasta r3/10; r4 = r3%10; if (opStep == 4) tagasta r4/1; r5 = r4%1; }

void completePress (int pin) {

// Serial.print ("sisend"); // Serial.println (pin); viivitus (THRESH_3); Keyboard.releaseAll (); }

void doAction (int -kood) {

// Modifikaatorid if (getCodeByButton (kood, 0) == 2) {// Serial.println ("--- modifikaatorid ----"); if (getCodeByButton (kood, 1)> 0) {Keyboard.press (altKey); // Serial.println ("------- alt ---------"); } else Keyboard.release (altKey); if (getCodeByButton (kood, 2)> 0) {Keyboard.press (ctrlKey); // Serial.println ("-------- ctrl ----------"); } else Keyboard.release (ctrlKey); if (getCodeByButton (kood, 3)> 0) {Keyboard.press (''); } else Keyboard.release (''); if (getCodeByButton (kood, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ shift ------"); } else Keyboard.release (shiftKey); } muud {

// ülesandeid täita

lüliti (kood) {juhtum 30: // --- | Pintsli klaviatuur.press (shiftKey); Keyboard.print ('b'); completePress (kood); murda; juhtum 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (kood); murda; juhtum 3000: // --- | Ämbriklaviatuur.press (shiftKey); Keyboard.print ('g'); completePress (kood); murda; juhtum 30000: // --- | Lasso klaviatuur.press (shiftKey); Keyboard.print ('l'); completePress (kood); murda; juhtum 320: //-| o Undo Keyboard.press (ctrlKey); Keyboard.print ('z'); completePress (kood); murda; juhtum 3020: //-| -o Redo klaviatuur.press (ctrlKey); Keyboard.print ('y'); completePress (kood); murda; juhtum 30020: // | --o Ajaloo klaviatuur.press (shiftKey); Keyboard.print ('y'); completePress (kood); murda; juhtum 230: //-o | Salvesta Keyboard.press (ctrlKey); Keyboard.print ('s'); completePress (kood); murda; juhtum 3200: //- | o- Kiire PNG-klaviatuur.press (shiftKey); Keyboard.press (ctrlKey); Keyboard.print ('\' '); completePress (kood); murda; juhtum 22230: // ooo | Fn1 Keyboard.press (Fn1Key); completePress (kood); murda; juhtum 22320: // oo | o Fn2 klaviatuur.press (Fn2Key); completePress (kood); murda; juhtum 23220: // 0 | 00 Fn3 klaviatuur.press (Fn3Key); completePress (kood); murda; juhtum 32220: // | ooo Fn4 Klaviatuur.press (Fn4Key); completePress (kood); murda; }}} int f = 0; // ------------------ PÕHISILM ------------------------ void loop () {

int buttonCode = 0;

for (int i = 0; i <BUTTON_NUM; ++ i) {nupud = buttonStateUpdate (nupud ); buttonCode+= getButtonStateCode (nupud ); }

if (buttonCode! = 0) {

Serial.print ("nupu kood:"); Serial.println (buttonCode); }

doAction (buttonCode);

// pange oma korduvkäivitamiseks siia oma põhikood: // for (int i = nupud [0]; i <sizeof (nupud)/sizeof (nupud [0])+nupud [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

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

Keyboard.releaseAll ();

viivitus (DELAY);

}

Loogika kohta pole palju öelda, kuna see sarnaneb minu viimase kontrolleriga, millel on kaks märkimisväärset erinevust:

  1. Nupud on ehitatud oma olekumasinatega
  2. Olekud liidetakse kokku, et saada kood, mis määrab toimingu

Põhimõte sarnaneb bittide nihutamisega, kuid kuna nuppudel on mitu olekut ja neid ei saa lihtsalt binaarfailiga esitada, korrutatakse need selle asemel kümne võimsusega. Seejärel liidan kõik nuppude olekud üheks numbriks ja edastan selle lülitile doAction (), kuhu panen kõik otseteede koodid.

Nagu näete, ei kaardistanud ma kõiki võimalikke kombinatsioone. Lisasin vaid mõned oma lemmikklahvid, jätan teie enda teha, et täita ülejäänud, kuidas teile kõige paremini tundub;)

3. samm: kest

Korpus
Korpus
Korpus
Korpus
Korpus
Korpus

Korpuse jaoks kasutasin 3D -printerit. Nagu näete, on kujundusel mõningaid vigu ja ma pidin MacGyverile selle lihtsalt sulgema. Nii et ma ei postita veel mudelifaili.

Nupud on kuumalt liimitud "pinkidele", nii et need hoiavad korgid paigal. Pehmed nupud on selles eriti head, seega hankige kindlasti mõni neist, kui kavatsete teha minu omaga sarnase ümbrise.

Samuti soovitan lisada korpusele veidi kaalu, kuna see on väga kerge. Täiendavad grammid muudavad selle hoidmise loomulikumaks.

Jootke kõik, nagu näidatud, ja ühendage USB -kaabel ning kõik peaks oma kohale mahtuma (mõne liimi abil)!

4. samm: tulemus ja võimalikud parandused

Tulemus ja võimalikud parandused
Tulemus ja võimalikud parandused
Tulemus ja võimalikud parandused
Tulemus ja võimalikud parandused
Tulemus ja võimalikud parandused
Tulemus ja võimalikud parandused

Siin see on! Käsikontroller, mille abil saate ühe käega pääseda juurde kõigile oma olulistele otseteedele!

Selle kasutamiseks on vaja lihasmälu, kuid see on tõesti mitmekülgne!

Loomulikult pole see täiuslik ja praegu mõtlen mõnele võimalusele, kuidas seda parandada. Lisaks korpuse täiustamisele ja otseteede lisamisele arvan, et mul oleks huvitav toetada mitut rakendust erinevate otseteedega. Mõtlen juhtimisskeemide vahel vahetamiseks nupukombinatsioonile, näiteks 4 nupu üheaegsele vajutamisele, et lülituda Photoshopi otseteeki vahel Maya jaoks kohandatud kohandatud teeki vahel.

Lihtsalt mõned ideed.

Täname lugemise eest, järgmise korrani!

Soovitan: