Indholdsfortegnelse:
- Trin 1: Planlægning
- Trin 2: Prototype + kode
- Trin 3: Kabinettet
- Trin 4: Resultat og mulige forbedringer
Video: Håndholdt genvejskontroller (til Photoshop + mere) [Arduino]: 4 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:28
Sidste gang lavede jeg en lille kontrolplade til brug i Photoshop. Det gjorde underværker, og jeg bruger det stadig! Men det er også temmelig begrænset, med kun fem knapper og de nyttige størrelses- og opacitetskiver. Jeg fandt stadig ud af at jeg nåede meget efter tastaturet …
Så jeg begyndte at arbejde på den næste iteration af kontrolpladen, en med langt flere knapper og funktionalitet. En betjeningspude til at styre dem alle.
Dette er ikke den kontrolpude. MEN på en måde kan det være bedre.
Hvad hvis du kunne have masser af genveje, men i en super tæt og let pakke kan du holde med din frie hånd, mens du tegner uafbrudt? … ok, nok med infomercial.
Denne controller er programmeret på en måde, så den med bare 4 knapper kan kortlægges til op til 32 mulige genveje! Den ekstra femte knap er der for at tillade mig at bruge ændringstaster i enhver kombination, hvilket er nyttigt for mange programmer (har du nogensinde prøvet Alt-RMB-kombinationsboksen i PS? Hvis du ikke har gjort det, skal du gøre det. Det er en livredder). Jeg forklarer systemet senere.
For at lave alt dette skal du bruge:
- 1 mikrokontroller (jeg brugte en Adafruit ItsyBitsy 32u4, men enhver skal gøre det, så længe den har atmega32u4 -chippen)
- 1 mikro-USB-adapter (data, ikke kun strøm)
- 5 trykknapper (jeg brugte bløde, som disse)
- 10k Ohm modstande (1 pr. Knap)
- Tråde, brødbræt, loddemateriale osv.
- Noget at lave et kabinet med (3D -printer osv.)
Dette er et mellemliggende niveau Arduino-projekt, og jeg foreslår, at du ser på min tidligere tutorial for bedre at forstå, hvad der foregår, da meget af dette er en gentagelse af de ting, jeg forklarede der.
Ok, lad os komme i gang!
Trin 1: Planlægning
Dette er en grundlæggende skematisk tegning af controlleren. Kredsløbet er virkelig simpelt, når du sammenligner det med mit tidligere projekt! Men vi vil være i stand til at gøre meget mere med de få knapper, den har, med kraften i kombinerede tryk!
Ideen bag kontrolordningen er, at hver knap enten kan være fri, trykkes og slippes eller trykkes og holdes nede. Ved at trykke og slippe er det, der faktisk aktiverer genvejen, mens du holder knapperne nede, giver os adgang til forskellige genveje. Så hvis du bare trykker på knap A, aktiverer du genvej A, men hvis du holder B nede, når du trykker på A, får du en anden genvej. Du kan holde op til 3 knapper på én gang, mens du trykker på, så når du anvender nogle grundlæggende kombinatorik, vil du se, hvor mange kombinationer der er mulige med dette system!
Den ekstra femte knap føltes som en naturlig tilføjelse i betragtning af formen på den håndholdte, jeg kom på. Jeg besluttede mig for at bruge den til at få adgang til ændringsnøgler i Photoshop. Den måde, det fungerer på, er lidt anderledes end de andre knapper: Når tommelfingerknappen holdes inde, bruges der kun modifikatorer. Disse aktiveres, når de holdes inde, og der kan trykkes på flere. Så hvis knap A er Skift, og knap B er Ctrl, når du holder A og B nede, vil det være som at trykke på både Skift og Ctrl, men kun så længe tommelfingerknappen holdes nede!
Skallen er designet til at være både ergonomisk og ambidextrous. Jeg var meget omhyggelig med at få den til at sidde tæt, så det ikke er for kedeligt at bruge lillefingeren, og det burde også fungere for dem med hænder større end mine.
Trin 2: Prototype + kode
Det er god praksis at teste knapperne på et brødbræt. Det er ret enkelt, bare tilslut knapperne og modstandene som vist. Du kan teste den med koden her (alternativ til pastebin link):
#omfatte
// brug vthisv -indstilling til MacOS:
// char ctrlKey = KEY_LEFT_GUI;
// brug vthisv til Windows og Linux:
char ctrlKey = KEY_LEFT_CTRL; char shiftKey = KEY_LEFT_SHIFT; char altKey = KEY_LEFT_ALT;
// Funktionstaster her
char Fn1Key = KEY_F2; char Fn2Key = KEY_F3; char Fn3Key = KEY_F4; char Fn4Key = KEY_F5;
const int pins = {9, 10, 11, 12, 13}; // array af alle knapnåle
//Følsomhed
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;
// Frys rammer
const int DELAY = 0;
enum Stater {befriet, presset, holdt, frigivet};
struktur -knap {
int pin; Stater oplyser; int timeHeld; }; // tommelfinger, indeks, midten, ring, lille;
knapknapper [BUTTON_NUM] = {};
knap initButton (int p) {
knap b; pinMode (p, INPUT); b.pin = p; b.stat = stater:: frigivet; b.timeHeld = 0; returnere b; }
ugyldig opsætning () {
// sæt din opsætningskode her for at køre en gang: Serial.begin (9600); Keyboard.begin ();
mens (! Seriel) {};
// Knapper til (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("indstillingsknap"); Serial.print (i); Serial.print ("ved pin:"); Serial.println (pins ); //knapper .pin = 1; knapper = initButton (pins ); Serial.println (knapper .pin); }
}
bool readButton (int pin) {
// tjek og debounce knapper hvis (digitalRead (pin) == HIGH) {forsinkelse (10); hvis (digitalRead (pin) == HIGH) {return true; }} returner falsk; }
int pintobin (int pin) {
hvis (pin == pins [0]) returnerer 1; hvis (pin == pins [1]) returnerer 10; hvis (pin == pins [2]) returnerer 100; hvis (pin == pins [3]) returnerer 1000; hvis (pin == pins [4]) returnerer 10000; } knap buttonStateUpdate (knap b) {
bool press = readButton (b.pin);
switch (b.state) {case States:: freed: b.timeHeld = 0; hvis (tryk) b.state = States:: presset; pause; etui trykket: b.timeHeld+= 1; hvis (tryk) {if (b.timeHeld> (THRESH_1/(1+DELAY))) {b.state = States:: holdt; }} andet {// if (b.timeHeld
int getButtonStateCode (knap b)
{return b.state*pintobin (b.pin); }
int getCodeByButton (int -kode, int -indeks) {
int r1, r2, r3, r4, r5; int opStep = BUTTON_NUM - (1+indeks);
// første operation
hvis (opStep == 0) returkode/10000; r1 = kode%10000;
hvis (opStep == 1)
retur r1/1000; r2 = r1%1000; hvis (opStep == 2) returnerer r2/100; r3 = r2%100; hvis (opStep == 3) returnerer r3/10; r4 = r3%10; hvis (opStep == 4) returnerer r4/1; r5 = r4%1; }
void completePress (int pin) {
// Serial.print ("input"); // Serial.println (pin); forsinkelse (THRESH_3); Keyboard.releaseAll (); }
void doAction (int code) {
// Modifikatorer hvis (getCodeByButton (kode, 0) == 2) {// Serial.println ("--- modifikatorer ----"); hvis (getCodeByButton (kode, 1)> 0) {Keyboard.press (altKey); // Serial.println ("------- alt ---------"); } ellers Keyboard.release (altKey); hvis (getCodeByButton (kode, 2)> 0) {Keyboard.press (ctrlKey); // Serial.println ("-------- ctrl ----------"); } ellers Keyboard.release (ctrlKey); hvis (getCodeByButton (kode, 3)> 0) {Keyboard.press (''); } ellers Keyboard.release (''); hvis (getCodeByButton (kode, 4)> 0) {Keyboard.press (shiftKey); // Serial.println ("------ skift ------"); } ellers Keyboard.release (shiftKey); } andet {
// udføre opgaver
switch (kode) {case 30: // --- | Brush Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (kode); pause; sag 300: // --- | Viskelæder Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (kode); pause; sag 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (kode); pause; sag 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (kode); pause; sag 320: //-| o Fortryd tastatur. tryk (ctrlKey); Keyboard.print ('z'); completePress (kode); pause; sag 3020: //-| -o Redo Keyboard.press (ctrlKey); Keyboard.print ('y'); completePress (kode); pause; case 30020: // | --o History Keyboard.press (shiftKey); Keyboard.print ('y'); completePress (kode); pause; sag 230: //-o | Gem tastatur. Tryk (ctrlKey); Keyboard.print ('s'); completePress (kode); pause; case 3200: //- | o- Quick-p.webp
int buttonCode = 0;
for (int i = 0; i <BUTTON_NUM; ++ i) {knapper = buttonStateUpdate (knapper ); buttonCode+= getButtonStateCode (knapper ); }
hvis (buttonCode! = 0) {
Serial.print ("knapkode:"); Serial.println (buttonCode); }
doAction (buttonCode);
// sæt din hovedkode her for at køre gentagne gange: // for (int i = knapper [0]; i <sizeof (knapper)/sizeof (knapper [0])+knapper [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}
hvis (getCodeByButton (buttonCode, 0)! = 2)
Keyboard.releaseAll ();
forsinkelse (DELAY);
}
Der er ikke meget at sige om logikken, da den ligner min sidste controller, med to bemærkelsesværdige forskelle:
- Knapperne er strukturer med deres egne statsmaskiner
- Staterne summeres sammen for at lave en kode, der bestemmer handlingen
Princippet ligner bit-shifting, men fordi knapperne har flere tilstande og ikke bare kan repræsenteres med en binær, multipliceres de med power i stedet for ti. Jeg lægger derefter alle knaptilstande sammen til et enkelt tal og sender det videre til doAction () switch -sætningen, hvor jeg sætter alle genvejskoder.
Som du kan se, kortlagde jeg ikke alle mulige kombinationer. Jeg har kun tilføjet et par af mine yndlingsgenveje, jeg lader det være op til dig at udfylde resten, hvordan du bedst synes;)
Trin 3: Kabinettet
Jeg brugte en 3D -printer til kabinettet. Som du kan se, har designet nogle fejl, og jeg var nødt til at MacGyver en måde at bare lukke det. Så jeg sender ikke modelfilen endnu.
Knapperne varmlimes på "bænke", så de holder hætterne på plads. De bløde trykknapper er især gode til det, så sørg for at få nogle af dem, hvis du planlægger at lave en sag, der ligner min.
Jeg foreslår også, at du tilføjer lidt vægt inde i kassen, da den er meget let. De ekstra gram får det til at føles mere naturligt.
Lod alt som vist, og tilslut usb -kablet, og alt skal passe på plads (ved hjælp af lidt lim)!
Trin 4: Resultat og mulige forbedringer
Der har du det! En håndholdt controller, du kan bruge til at få adgang til alle dine vigtige genveje med bare en hånd!
Det kræver lidt muskelhukommelse at bruge, men det er virkelig alsidigt!
Selvfølgelig er det ikke perfekt, og lige nu tænker jeg på nogle måder at forbedre det på. Bortset fra at forbedre kabinettet og tilføje genveje, tror jeg, at jeg ville være interessant at understøtte flere applikationer med forskellige genveje. Jeg tænker på at have en knapkombination til at skifte mellem kontrolordninger, som at trykke på 4 knapper på samme tid for at skifte mellem et Photoshop-genvejsbibliotek til en skræddersyet til Maya.
Bare nogle ideer.
Tak fordi du læste, indtil næste gang!
Anbefalede:
CovBot - en WhatsApp -baseret chatbot til COVID 19 Info og mere: 7 trin
CovBot - en WhatsApp -baseret chatbot til COVID 19 Info og mere: CoVbot er en enkel og intuitiv Whatsapp -baseret chatbot. Botens hovedtræk er: Det kan give dig den seneste status for COVID-19 i det valgte land på en enkel og intuitiv måde.Derudover kan bot foreslå sjove aktiviteter at lave AT H
Dyrkning af mere salat på mindre plads eller Dyrkning af salat i rummet, (mere eller mindre) .: 10 trin
Dyrkning af mere salat på mindre plads eller … Dyrkning af salat i rummet, (mere eller mindre) .: Dette er en professionel indsendelse til Growing Beyond Earth, Maker Contest, indsendt via Instructables. Jeg kunne ikke være mere begejstret for at designe til produktion af rumafgrøder og sende min første Instructable. Til at begynde med bad konkurrencen os om at
Playful Pressure Sensitive Pads (til digitale legepladser - og mere): 11 trin (med billeder)
Playful Pressure Sensitive Pads (til digitale legepladser - og mere): Dette er en instruktion, der viser dig, hvordan du laver en trykfølsom pude - som kan bruges til at oprette digitalt legetøj eller spil. Den kan bruges som en kraftfølsom modstand i stor skala, og selvom den er legende, kan den bruges til mere seriøse projekter
Stort LED "ring" lys til timelapse, portrætter og mere : 11 trin (med billeder)
Stort LED "ring" -lys til timelapse, portrætter og mere …: Jeg optager en masse timelapse -videoer, der strækker sig over et par dage, men hader det ujævne lys, som klampelys giver - især om natten. Et stort ringlys er for dyrt - så jeg besluttede at lave noget selv på en enkelt aften med ting, jeg havde ved hånden
Forstærker til guitarforstærker til fulde eller halve stakke med separate hoveder og mere .: 5 trin
Guitar Amp Tilt Stand til fulde eller halve stakke med separate hoveder og mere .: Jeg ved, jeg er skør, men jeg er okay med det. Jeg byggede dette for at teste nogle teorier. Dåren i den lokale musikbutik ville ikke lade mig placere sine dyrebare nye Marshall -stakke på dette og løb mig væk. Jeg kan ikke rigtig bebrejde ham for at være så lille i sindet