Πίνακας περιεχομένων:

Φορητός ελεγκτής συντόμευσης (για Photoshop + Περισσότερα) [Arduino]: 4 βήματα
Φορητός ελεγκτής συντόμευσης (για Photoshop + Περισσότερα) [Arduino]: 4 βήματα

Βίντεο: Φορητός ελεγκτής συντόμευσης (για Photoshop + Περισσότερα) [Arduino]: 4 βήματα

Βίντεο: Φορητός ελεγκτής συντόμευσης (για Photoshop + Περισσότερα) [Arduino]: 4 βήματα
Βίντεο: Windows 7/8/10 - Διόρθωση σφάλματος "Δεν έχετε άδεια πρόσβασης" 2024, Ιούλιος
Anonim
Ελεγκτής χειρός συντόμευσης (για Photoshop + Περισσότερα) [Arduino]
Ελεγκτής χειρός συντόμευσης (για Photoshop + Περισσότερα) [Arduino]

Την τελευταία φορά δημιούργησα ένα μικροσκοπικό μαξιλάρι ελέγχου για χρήση στο Photoshop. Έκανε θαύματα και το χρησιμοποιώ ακόμα! Αλλά είναι επίσης μάλλον περιορισμένο, με μόλις πέντε κουμπιά και τα χρήσιμα καντράν μεγέθους και αδιαφάνειας. Ακόμα βρέθηκα να πιάνω το πληκτρολόγιο πολύ…

Έτσι άρχισα να δουλεύω στην επόμενη επανάληψη του μαξιλαριού ελέγχου, ένα με πολύ περισσότερα κουμπιά και λειτουργικότητα. Ένα μαξιλάρι ελέγχου για να τα κυβερνά όλα.

Αυτό δεν είναι το ταμπλό ελέγχου. ΑΛΛΑ με κάποιο τρόπο μπορεί να είναι καλύτερα.

Τι θα γινόταν αν μπορούσατε να έχετε έναν τόνο συντομεύσεων, αλλά σε ένα εξαιρετικά άνετο και ελαφρύ πακέτο που μπορείτε να κρατήσετε με το ελεύθερο χέρι σας ενώ σχεδιάζετε χωρίς διακοπή; … Εντάξει, αρκετά με το infomercial.

Αυτός ο ελεγκτής είναι προγραμματισμένος με τρόπο που, με μόλις 4 κουμπιά, μπορεί να αντιστοιχιστεί έως και 32 πιθανές συντομεύσεις! Το πρόσθετο 5ο κουμπί είναι εκεί για να μου επιτρέψει να χρησιμοποιήσω πλήκτρα τροποποίησης σε οποιονδήποτε συνδυασμό, κάτι που είναι χρήσιμο για πολλά προγράμματα (δοκιμάσατε ποτέ το συνδυασμό Alt-RMB στο PS; Εάν δεν το έχετε, παρακαλώ κάντε το. Είναι σωτήριο). Θα εξηγήσω το σύστημα αργότερα.

Για να τα φτιάξετε όλα αυτά θα χρειαστείτε:

  • 1 μικροελεγκτής (χρησιμοποίησα ένα Adafruit ItsyBitsy 32u4 αλλά οποιοσδήποτε θα πρέπει να το κάνει αρκεί να έχει το τσιπ atmega32u4)
  • 1 προσαρμογέας micro-USB (δεδομένα, όχι μόνο για τροφοδοσία)
  • 5 κουμπιά (χρησιμοποίησα μαλακά, όπως αυτά)
  • Αντίσταση 10k Ohm (1 ανά κουμπί)
  • Σύρματα, σανίδες, υλικό συγκόλλησης κ.λπ.
  • Κάτι για να φτιάξετε ένα περίβλημα (τρισδιάστατος εκτυπωτής κλπ.)

Αυτό είναι ένα έργο Arduino ενδιάμεσου επιπέδου και προτείνω να κοιτάξετε το προηγούμενο σεμινάριό μου για να καταλάβετε καλύτερα τι συμβαίνει, καθώς αυτό είναι μια επανάληψη των πραγμάτων που εξήγησα εκεί.

Εντάξει, ας ξεκινήσουμε!

Βήμα 1: Προγραμματισμός

Σχεδίαση
Σχεδίαση

Αυτό είναι ένα βασικό σχηματικό σχέδιο που σχεδίασα ο ελεγκτής. Το κύκλωμα είναι πραγματικά απλό όταν το συγκρίνετε με το προηγούμενο έργο μου! Αλλά θα μπορούμε να κάνουμε πολύ περισσότερα με τα λίγα κουμπιά που διαθέτει, με τη δύναμη των συνδυασμένων πιέσεων!

Η ιδέα πίσω από το σχήμα ελέγχου είναι ότι κάθε κουμπί μπορεί είτε να είναι δωρεάν, να πατηθεί και να απελευθερωθεί, είτε να πατηθεί και να κρατηθεί. Το πάτημα και η απελευθέρωση είναι αυτό που θα ενεργοποιήσει στην πραγματικότητα τη συντόμευση, ενώ κρατώντας πατημένα τα κουμπιά θα έχουμε πρόσβαση σε διαφορετικές συντομεύσεις. Έτσι, αν απλώς πατήσετε το κουμπί Α, θα ενεργοποιήσετε τη συντόμευση Α, αλλά αν κρατήσετε πατημένο το Β όταν πατάτε το Α, θα έχετε μια διαφορετική συντόμευση. Μπορείτε να κρατήσετε ταυτόχρονα έως και 3 κουμπιά πατώντας, οπότε όταν εφαρμόσετε κάποιες βασικές συνδυαστικές, θα δείτε πόσοι συνδυασμοί είναι δυνατοί με αυτό το σύστημα!

Το επιπλέον πέμπτο κουμπί έμοιαζε με μια φυσική προσθήκη, δεδομένου του σχήματος του φορητού που βρήκα. Αποφάσισα να το χρησιμοποιήσω για πρόσβαση σε τροποποιητικά κλειδιά στο photoshop. Ο τρόπος λειτουργίας είναι ελαφρώς διαφορετικός από τα άλλα κουμπιά: όποτε κρατάτε πατημένο το κουμπί αντίχειρα, θα χρησιμοποιούνται μόνο τροποποιητές. Αυτά θα ενεργοποιηθούν όταν κρατηθούν και μπορούν να πατηθούν πολλαπλά. Έτσι, εάν το κουμπί Α είναι Shift και το κουμπί Β είναι Ctrl, όταν κρατάτε πατημένα τα Α και Β θα είναι σαν να πατάτε και τα Shift και τα Ctrl, αλλά μόνο για όσο διάστημα κρατάτε πατημένο το κουμπί αντίχειρα!

Το κέλυφος έχει σχεδιαστεί για να είναι εργονομικό και αμφιδέξιο. Φρόντισα πολύ να το εφαρμόσω άνετα, έτσι ώστε το μικρό δάχτυλο να μην είναι πολύ κουραστικό και να λειτουργεί και για όσους έχουν χέρια μεγαλύτερα από το δικό μου.

Βήμα 2: Πρωτότυπο + Κώδικας

Πρωτότυπο + Κωδικός
Πρωτότυπο + Κωδικός

Είναι καλή πρακτική να δοκιμάζετε τα κουμπιά σε ένα breadboard. Είναι πολύ απλό, απλά συνδέστε τα κουμπιά και τις αντιστάσεις όπως φαίνεται. Μπορείτε να το δοκιμάσετε με τον κωδικό εδώ (εναλλακτική λύση σύνδεσης pastebin):

#περιλαμβάνω

// χρησιμοποιήστε την επιλογή 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 pins = {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;

enum States {απελευθέρωση, πίεση, κράτηση, απελευθέρωση}.

κουμπί δομής {

int pin? Πολιτείες κρατών? int timeHeld; }; // αντίχειρας, δείκτης, μεσαίο, δαχτυλίδι, λίγο?

κουμπιά [BUTTON_NUM] = {};

κουμπί initButton (int p) {

κουμπί β? pinMode (p, INPUT); b.pin = p; b.state = States:: απελευθέρωσε? β. timeHeld = 0; επιστροφή β? }

void setup () {

// βάλτε τον κωδικό εγκατάστασης εδώ, για να εκτελεστεί μία φορά: Serial.begin (9600); Keyboard.begin ();

ενώ (! Σειρά) {};

// Κουμπιά για (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("κουμπί ρύθμισης"); Serial.print (i); Serial.print ("στο pin:"); Serial.println (καρφίτσες ); // κουμπιά έχαστο. κουμπιά = initButton (καρφίτσες ); Serial.println (κουμπιά .pin); }

}

bool readButton (int pin) {

// ελέγξτε και καταργήστε τα κουμπιά εάν (digitalRead (pin) == HIGH) {καθυστέρηση (10); if (digitalRead (pin) == HIGH) {return true? }} return false? }

int pintobin (int pin) {

εάν (pin == pins [0]) επιστρέφει 1? εάν (pin == pins [1]) επιστρέφει 10? εάν (pin == pins [2]) επιστρέφει 100? εάν (pin == ακίδες [3]) επιστρέφει 1000? εάν (pin == καρφίτσες [4]) επιστρέφει 10000? } κουμπί κουμπιούStateUpdate (κουμπί β) {

bool press = readButton (b.pin);

switch (b.state) {case States:: freed: b.timeHeld = 0; εάν (πατήστε) b.state = Καταστάσεις:: πατημένο? Διακοπή; θήκη πατημένη: b.timeHeld+= 1; εάν (πατήστε) {if (b.timeHeld> (THRESH_1/(1+DELAY))) {b.state = States:: held; }} else {// if (β.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; if (opStep == 4) επιστρέφει r4/1. r5 = r4%1; }

void completePress (int pin) {

// Serial.print ("είσοδος"); // Serial.println (pin); καθυστέρηση (THRESH_3); Keyboard.releaseAll (); }

void doAction (int code) {

// Τροποποιητές if (getCodeByButton (κωδικός, 0) == 2) {// Serial.println ("--- τροποποιητές ----"); if (getCodeByButton (κωδικός, 1)> 0) {Keyboard.press (altKey); // Serial.println ("------- alt ---------"); } else Keyboard.release (altKey); if (getCodeByButton (κωδικός, 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 ("------ shift ------"); } else Keyboard.release (shiftKey); } αλλο {

// εκτελώ καθήκοντα

διακόπτης (κωδικός) {περίπτωση 30: // --- | Βούρτσα Keyboard.press (shiftKey); Keyboard.print ('b'); ολοκληρωμένο Press (κωδικός). Διακοπή; θήκη 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); ολοκληρωμένο Press (κωδικός). Διακοπή; θήκη 3000: // --- | Bucket Keyboard.press (shiftKey); Keyboard.print ('g'); ολοκληρωμένο Press (κωδικός). Διακοπή; θήκη 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); ολοκληρωμένο Press (κωδικός). Διακοπή; θήκη 320: //-| o Αναίρεση Keyboard.press (ctrlKey); Keyboard.print ('z'); ολοκληρωμένο Press (κωδικός). Διακοπή; θήκη 3020: //-| -o Redo Keyboard.press (ctrlKey); Keyboard.print ('y'); ολοκληρωμένο Press (κωδικός). Διακοπή; θήκη 30020: // | --o Ιστορικό Keyboard.press (shiftKey); Keyboard.print ('y'); ολοκληρωμένο Press (κωδικός). Διακοπή; περίπτωση 230: //-o | Αποθήκευση Keyboard.press (ctrlKey); Keyboard.print ('s'); ολοκληρωμένο Press (κωδικός). Διακοπή; θήκη 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 (buttonCode);

// βάλτε τον κύριο κωδικό σας εδώ, για να εκτελείται επανειλημμένα: // for (int i = buttons [0]; i <sizeof (buttons)/sizeof (buttons [0])+buttons [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}

εάν (getCodeByButton (buttonCode, 0)! = 2)

Keyboard.releaseAll ();

καθυστέρηση (ΚΑΘΥΣΤΕΡΗΣΗ)?

}

Δεν υπάρχουν πολλά να πούμε για τη λογική καθώς είναι παρόμοια με αυτή του τελευταίου μου χειριστηρίου, με δύο αξιοσημείωτες διαφορές:

  1. Τα κουμπιά είναι δομές με τις δικές τους μηχανές κατάστασης
  2. Οι καταστάσεις συνοψίζονται μαζί για να δημιουργήσουν έναν κώδικα που καθορίζει τη δράση

Η αρχή είναι παρόμοια με τη μετατόπιση bit, αλλά επειδή τα κουμπιά έχουν πολλαπλές καταστάσεις και δεν μπορούν απλά να αναπαρασταθούν με ένα δυαδικό, πολλαπλασιάζονται με δυνάμεις του δέκα. Στη συνέχεια, προσθέτω όλες τις καταστάσεις κουμπιών σε έναν μόνο αριθμό και το μεταφέρω στη δήλωση διακόπτη doAction (), όπου βάζω όλους τους κωδικούς συντομεύσεων.

Όπως μπορείτε να δείτε, δεν χαρτογράφησα κάθε πιθανό συνδυασμό. Πρόσθεσα μόνο μερικές από τις αγαπημένες μου συντομεύσεις, αφήνω σε εσάς να συμπληρώσετε τις υπόλοιπες όπως σας ταιριάζει καλύτερα;)

Βήμα 3: Το περίβλημα

Το περίβλημα
Το περίβλημα
Το περίβλημα
Το περίβλημα
Το περίβλημα
Το περίβλημα

Χρησιμοποίησα έναν 3D εκτυπωτή για το περίβλημα. Όπως μπορείτε να δείτε, ο σχεδιασμός έχει κάποια ελαττώματα και χρειάστηκε να κάνω τον MacGyver έναν τρόπο να το κλείσω. Επομένως, δεν θα δημοσιεύσω το αρχείο μοντέλου ακόμα.

Τα κουμπιά είναι κολλημένα πάνω σε "πάγκους" έτσι ώστε να διατηρούν τα καπάκια στη θέση τους. Τα μαλακά κουμπιά είναι ιδιαίτερα καλά σε αυτό, οπότε φροντίστε να πάρετε μερικά από αυτά αν σκοπεύετε να φτιάξετε μια θήκη παρόμοια με τη δική μου.

Επίσης, προτείνω να προσθέσετε λίγο βάρος στο εσωτερικό της θήκης, καθώς είναι πολύ ελαφρύ. Τα επιπλέον γραμμάρια θα κάνουν το κράτημα πιο φυσικό.

Συγκολλήστε τα πάντα όπως φαίνεται και συνδέστε το καλώδιο usb και όλα πρέπει να χωρέσουν στη θέση τους (με τη βοήθεια κάποιας κόλλας)!

Βήμα 4: Αποτέλεσμα και πιθανές βελτιώσεις

Αποτέλεσμα και πιθανές βελτιώσεις
Αποτέλεσμα και πιθανές βελτιώσεις
Αποτέλεσμα και πιθανές βελτιώσεις
Αποτέλεσμα και πιθανές βελτιώσεις
Αποτέλεσμα και πιθανές βελτιώσεις
Αποτέλεσμα και πιθανές βελτιώσεις

Ορίστε το! Ένα χειριστήριο χειρός που μπορείτε να χρησιμοποιήσετε για να έχετε πρόσβαση σε όλες τις σημαντικές συντομεύσεις σας με ένα μόνο χέρι!

Χρειάζεται λίγη μυϊκή μνήμη για χρήση, αλλά είναι πραγματικά ευέλικτο!

Φυσικά δεν είναι τέλειο και αυτή τη στιγμή σκέφτομαι τρόπους βελτίωσης. Εκτός από τη βελτίωση του περιβλήματος και την προσθήκη συντομεύσεων, νομίζω ότι θα ήταν ενδιαφέρον να υποστηρίζω πολλές εφαρμογές με διαφορετικές συντομεύσεις. Σκέφτομαι να έχω έναν συνδυασμό κουμπιών για εναλλαγή μεταξύ σχημάτων ελέγχου, όπως το πάτημα 4 κουμπιών ταυτόχρονα για εναλλαγή μεταξύ μιας βιβλιοθήκης συντομεύσεων Photoshop σε one-tailor made for Maya.

Απλά μερικές ιδέες.

Ευχαριστώ για την ανάγνωση, μέχρι την επόμενη φορά!

Συνιστάται: