Tartalomjegyzék:

Kézi parancsikonvezérlő (Photoshop + Egyebekhez) [Arduino]: 4 lépés
Kézi parancsikonvezérlő (Photoshop + Egyebekhez) [Arduino]: 4 lépés

Videó: Kézi parancsikonvezérlő (Photoshop + Egyebekhez) [Arduino]: 4 lépés

Videó: Kézi parancsikonvezérlő (Photoshop + Egyebekhez) [Arduino]: 4 lépés
Videó: Zero to Hero ControlNet Tutorial: Stable Diffusion Web UI Extension | Complete Feature Guide 2024, Július
Anonim
Kézi parancsikonvezérlő (Photoshop + egyebekhez) [Arduino]
Kézi parancsikonvezérlő (Photoshop + egyebekhez) [Arduino]

Múltkor létrehoztam egy apró vezérlőpultot a Photoshopban. Csodát tett, és még mindig használom! De ez is meglehetősen korlátozott, mindössze öt gombbal, valamint a hasznos méretű és átlátszatlanság -tárcsákkal. Még mindig azon kaptam magam, hogy sokat nyúlok a billentyűzethez…

Elkezdtem tehát dolgozni a vezérlőpult következő iterációján, az egyik sokkal több gombbal és funkcióval. Egy vezérlőpult az összes vezérléséhez.

Ez nem az a vezérlőpult. DE bizonyos szempontból jobb lehet.

Mi lenne, ha rengeteg gyorsbillentyűvel rendelkezhetne, de egy szuper kényelmes és könnyű csomagban szabad kezével tarthatja, miközben megszakítás nélkül rajzol? … Rendben, elég az infomercial.

Ez a vezérlő úgy van programozva, hogy mindössze 4 gombbal akár 32 lehetséges parancsikonra is leképezhető! A további ötödik gomb arra szolgál, hogy bármilyen kombinációban használhassam a módosító billentyűket, ami sok program számára hasznos (próbáltad már valaha az Alt-RMB kombinációt PS-ben? Ha még nem, akkor tedd meg. Életmentő). Később elmagyarázom a rendszert.

Mindezek elkészítéséhez szüksége lesz:

  • 1 mikrokontroller (én egy Adafruit ItsyBitsy 32u4 -et használtam, de bármelyiknek meg kell tennie, amíg rendelkezik az atmega32u4 chipkel)
  • 1 mikro-USB adapter (adat, nem csak tápellátás)
  • 5 nyomógomb (lágyakat használtam, mint ezek)
  • 10 k ohmos ellenállások (1 gombonként)
  • Vezetékek, kenyérlap, forrasztóanyag stb.
  • Valami, amivel burkolatot készíthet (3D nyomtató, stb.)

Ez egy középszintű Arduino projekt, és azt javaslom, hogy nézze meg korábbi oktatóanyagomat, hogy jobban megértse, mi folyik itt, mivel ennek nagy része az ott elmagyarázott dolgok megismétlése.

Ok, kezdjük!

1. lépés: Tervezés

Tervezés
Tervezés

Ez egy alaprajz, amit a vezérlőről rajzoltam. Az áramkör nagyon egyszerű, ha összehasonlítja az előző projektemmel! De sokkal többre leszünk képesek azzal a néhány gombbal, amellyel rendelkezik, a kombinált prések erejével!

A vezérlési séma mögött az áll, hogy minden gomb szabadon, lenyomva és felengedve, vagy nyomva tartva. A gomb megnyomása és felengedése aktiválja a parancsikont, míg a gombok lenyomva tartásával hozzáférhetünk a különböző parancsikonokhoz. Tehát ha csak megnyomja az A gombot, akkor aktiválja az A parancsikont, de ha lenyomva tartja a B gombot az A megnyomásakor, akkor más parancsikont kap. Nyomás közben legfeljebb 3 gombot tarthat lenyomva, így ha néhány alapvető kombinációs módszert alkalmaz, látni fogja, hogy hány kombináció lehetséges ezzel a rendszerrel!

Az extra ötödik gomb természetes kiegészítésnek tűnt, tekintettel a kéziszámítógép alakjára, amelyet kitaláltam. Úgy döntöttem, hogy a Photoshop módosító kulcsainak eléréséhez használom. Működési módja kissé eltér a többi gombétól: amikor a hüvelykujj gombot lenyomva tartja, csak módosítókat kell használni. Ezek aktiválódnak, ha lenyomva tartják őket, és több gomb megnyomható. Tehát ha az A gomb Shift, a B gomb pedig a Ctrl, az A és B billentyűk lenyomva tartása olyan lesz, mintha a Shift és a Ctrl billentyűt is megnyomná, de csak addig, amíg a hüvelykujj gombot lenyomva tartja!

A héj ergonomikus és kétoldalú. Nagyon ügyeltem arra, hogy jól illeszkedjen, hogy a kisujj használata ne legyen túl fárasztó, és azoknak is működnie kell, akiknek a keze nagyobb, mint az enyém.

2. lépés: Prototípus + kód

Prototípus + kód
Prototípus + kód

Jó gyakorlat, ha teszteljük a gombokat egy kenyérsütőn. Elég egyszerű, csak csatlakoztassa a gombokat és az ellenállásokat az ábrán látható módon. Itt tesztelheti a kóddal (pastebin link alternatíva):

#befoglalni

// használja a vthisv opciót MacOS esetén:

// char ctrlKey = KEY_LEFT_GUI;

// használja a vthisv opciót Windows és Linux rendszerekhez:

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

// Funkciógombok itt

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

const int pins = {9, 10, 11, 12, 13}; // az összes gombcsap tömbje

//Érzékenység

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;

// A keretek lefagyasztása

const int DELAY = 0;

enum Államok {felszabadítva, nyomva, tartva, szabadon engedve};

szerkezet gomb {

int pin; Államok; int timeHeld; }; // hüvelykujj, mutató, középső, gyűrű, kicsi;

gombok [BUTTON_NUM] = {};

gomb initButton (int p) {

b gomb; pinMode (p, INPUT); b.pin = p; b.állam = Államok:: felszabadult; b. timeHeld = 0; visszatérés b; }

void setup () {

// tegye ide a beállítási kódot, hogy egyszer lefusson: Serial.begin (9600); Keyboard.begin ();

while (! Sorozat) {};

// Gombok a (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("set button"); Sorozatnyomat (i); Serial.print ("pin:"); Soros.println (csapok ); //buttons.pin = 1; gombok = initButton (csapok ); Serial.println (gombok .pin); }

}

bool readButton (int pin) {

// check and debounce gomb if (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {return true; }} return false; }

int pintobin (int pin) {

if (pin == pins [0]) return 1; if (pin == pins [1]) return 10; if (pin == pins [2]) return 100; if (pin == csapok [3]) 1000 -et ad vissza; if (pin == pins [4]) return 10000; } gomb buttonStateUpdate (b gomb) {

bool press = readButton (b.pin);

switch (b.state) {esetállapotok:: felszabadítva: b.timeHeld = 0; if (press) b.state = Államok:: lenyomva; szünet; kis- és nagybetűk megnyomása: b.timeHeld+= 1; if (nyomja meg) {if (b.timeHeld> (THRESH_1/(1+DELAY)))) {b.state = Államok:: tartott; }} else {// if (b.timeHeld

int getButtonStateCode (b gomb)

{return b.állapot*pintobin (b.pin); }

int getCodeByButton (int kód, int index) {

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

// első művelet

if (opStep == 0) visszatérési kód/10000; r1 = kód%10000;

ha (opStep == 1)

visszatérés r1/1000; r2 = r1%1000; if (opStep == 2) return r2/100; r3 = r2%100; if (opStep == 3) return r3/10; r4 = r3%10; if (opStep == 4) return r4/1; r5 = r4%1; }

void completePress (int pin) {

// Serial.print ("input"); // Sorozat.println (pin); késleltetés (THRESH_3); Keyboard.releaseAll (); }

void doAction (int kód) {

// Módosítók if (getCodeByButton (kód, 0) == 2) {// Serial.println ("--- módosítók ----"); if (getCodeByButton (kód, 1)> 0) {Keyboard.press (altKey); // Sorozat.println ("------- alt ---------"); } else Keyboard.release (altKey); if (getCodeByButton (kód, 2)> 0) {Keyboard.press (ctrlKey); // Serial.println ("-------- ctrl ----------"); } else Keyboard.release (ctrlKey); if (getCodeByButton (kód, 3)> 0) {Keyboard.press (''); } else Keyboard.release (''); if (getCodeByButton (kód, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ shift ------"); } else Keyboard.release (shiftKey); } más {

// feladatot ellát

kapcsoló (kód) {30. eset: // --- | Brush Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (kód); szünet; 300. eset: // --- | Radír Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (kód); szünet; 3000. eset: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (kód); szünet; eset 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (kód); szünet; 320. eset: //-| o Billentyűzet visszavonása.press (ctrlKey); Keyboard.print ('z'); completePress (kód); szünet; eset 3020: //-| -o Újra billentyűzet.press (ctrlKey); Keyboard.print ('y'); completePress (kód); szünet; eset 30020: // | --o Történelem billentyűzet.press (shiftKey); Keyboard.print ('y'); completePress (kód); szünet; 230. eset: //-o | Save Keyboard.press (ctrlKey); Keyboard.print ('s'); completePress (kód); szünet; 3200. eset: //- | o- Gyors-p.webp

int buttonCode = 0;

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

if (buttonCode! = 0) {

Serial.print ("gombkód:"); Serial.println (buttonCode); }

doAction (buttonCode);

// tegye ide a fő kódot az ismételt futtatáshoz: // for (int i = gombok [0]; i <sizeof (gombok)/sizeof (gombok [0])+gombok [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

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

Keyboard.releaseAll ();

késleltetés (DELAY);

}

Nincs sok mondanivaló a logikáról, mivel hasonló az utolsó vezérlőmhöz, két figyelemre méltó különbséggel:

  1. A gombok saját állapotú gépekkel készülnek
  2. Az állapotokat összegezve létrejön egy kód, amely meghatározza a műveletet

Az elv hasonló a biteltoláshoz, de mivel a gomboknak több állapota van, és nem lehet őket egyszerűen binárisan ábrázolni, helyette tízes hatványokkal szorozzuk őket. Ezután összeadom az összes gombállapotot egyetlen számba, és átadom a doAction () kapcsoló utasításnak, ahol az összes parancsikon kódját elhelyezem.

Mint látható, nem feltérképeztem minden lehetséges kombinációt. Csak néhány kedvenc hivatkozásomat adtam hozzá, a többieket bízom benne, hogy a többit úgy töltse ki, ahogy a legjobbnak látja;)

3. lépés: A burkolat

A burkolat
A burkolat
A burkolat
A burkolat
A burkolat
A burkolat

A burkolathoz 3D nyomtatót használtam. Amint láthatja, a tervezésnek vannak hibái, és MacGyvernek kellett módot adnom arra, hogy csak bezárjam. Tehát a modellfájlt még nem teszem közzé.

A gombokat melegen ragasztják a "padokra", hogy a kupakokat a helyükön tartsák. A puha nyomógombok különösen jók ebben, ezért mindenképpen szerezzen be néhányat, ha az enyémhez hasonló tokot tervez készíteni.

Azt is javaslom, hogy tegyen egy kis súlyt a tokba, mivel nagyon könnyű. A plusz grammok természetesebbé teszik a tartást.

Forrasztjon mindent az ábrán látható módon, és csatlakoztassa az usb kábelt, és mindennek a helyére kell illeszkednie (valamilyen ragasztó segítségével)!

4. lépés: Eredmény és lehetséges fejlesztések

Eredmény és lehetséges fejlesztések
Eredmény és lehetséges fejlesztések
Eredmény és lehetséges fejlesztések
Eredmény és lehetséges fejlesztések
Eredmény és lehetséges fejlesztések
Eredmény és lehetséges fejlesztések

Tessék, itt van! Kézi vezérlő, amellyel egyetlen fontos kézzel elérheti az összes fontos hivatkozást!

A használatához izommemória szükséges, de valóban sokoldalú!

Természetesen nem tökéletes, és most azon gondolkodom, hogy hogyan lehetne javítani. A burkolat javításán és a parancsikonok hozzáadásán kívül azt gondolom, hogy érdekes lenne több alkalmazást támogatni különböző parancsikonokkal. Arra gondolok, hogy van egy gombkombinációm a vezérlési sémák közötti váltáshoz, például 4 gomb egyidejű megnyomásával válthatsz a Photoshop parancsikon-könyvtára és a Maya számára szabott személyre szabott között.

Csak néhány ötlet.

Köszönöm, hogy elolvastad, legközelebb!

Ajánlott: