Мазмуну:
- 1 -кадам: Пландоо
- 2 -кадам: Прототип + Код
- 3 -кадам: Корпус
- 4 -кадам: Жыйынтык жана мүмкүн болгон жакшыртуулар
Video: Handheld Shortcut Controller (Photoshop + More үчүн) [Arduino]: 4 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:41
Акыркы жолу мен Photoshopто колдонуу үчүн кичинекей башкаруу тактасын түздүм. Бул кереметтерди жараткан, мен дагы деле колдонуп жатам! Бирок бул дагы чектелген, болгону беш баскыч жана пайдалуу өлчөмү жана тунук эмес терүүлөрү. Мен дагы эле клавиатурага көп жетип жүргөнүмдү байкадым …
Ошентип, мен дагы бир жолу баскычты жана функцияны камтыган башкаруу тактасынын үстүндө иштей баштадым. Баарын башкара турган бир башкаруу панели.
Бул башкаруу панели эмес. БИРОК бир жагынан жакшы болмок.
Эгерде сизде көптөгөн жарлыктар бар болсо, бирок супер ыңгайлуу жана жеңил пакетте сиз үзгүлтүксүз сүрөт тартып жатканда бош колуңуз менен кармап турсаңызчы? … макул, информация менен жетиштүү.
Бул контролер 4 эле баскыч менен 32 мүмкүн болгон жарлыкка чейин картага түшүрүлгөндөй программаланган! Кошумча 5-баскыч мага көптөгөн программалар үчүн пайдалуу болгон өзгөрткүч баскычтарды колдонууга уруксат берүү үчүн бар (сиз качандыр бир убакта Alt-RMB комбинациясын PSде сынап көрдүңүз беле? Эгер андай болбосоңуз, сураныч. Бул куткаруучу). Кийинчерээк системаны түшүндүрөм.
Мунун баарын жасоо үчүн сизге керек болот:
- 1 Микроконтроллер (Мен Adafruit ItsyBitsy 32u4 колдондум, бирок анын атмега32у4 чипи бар болгондо жасаш керек)
- 1 микро USB адаптери (маалыматтар, кубат үчүн гана эмес)
- 5 баскычтар (мен ушул сыяктуу жумшактарды колдондум)
- 10k Ohm каршылыгы (1 баскычка)
- Зымдар, нан, ширетүүчү материал ж.
- Корпус жасоо үчүн бир нерсе (3D принтер ж. Б.)
Бул орто деңгээлдеги Arduino долбоору, мен эмне болуп жатканын жакшыраак түшүнүү үчүн мурунку окуу куралымды кароону сунуштайм, анткени мунун көбү мен түшүндүргөн нерселердин кайталануусу.
Макул, баштайлы!
1 -кадам: Пландоо
Бул мен контроллердин негизги схемасы. Эгер мурунку проектиме салыштырсаңыз чынжыры чындыгында жөнөкөй! Бирок биз бир нече баскычтар менен, курама пресстердин күчү менен дагы көп нерселерди жасай алабыз!
Башкаруу схемасынын артындагы идея - бул ар бир баскычты бекер, басуу жана бошотуу, же басып кармап туруу. Басуу жана чыгаруу - бул жарлыкты активдештирүүчү нерсе, ал эми баскычтарды басып туруу бизге ар кандай жарлыктарга мүмкүнчүлүк берет. Ошентип, эгер сиз жөн гана А кнопкасын бассаңыз, анда А кыска жолун иштетесиз, бирок А басканда В кармап турсаңыз, башка жарлык пайда болот. Басып жатканда бир эле учурда 3 баскычка чейин кармап тура аласыз, андыктан кээ бир негизги комбинаториканы колдонгондо, бул система менен канча айкалышуу мүмкүн экенин көрөсүз!
Кошумча бешинчи баскыч табигый кошумча катары сезилди, мен ойлоп тапкан колдун формасын эске алганда. Мен аны фотошопто өзгөрткүч баскычтарга жетүү үчүн колдонууну чечтим. Анын иштөө ыкмасы башка баскычтардан бир аз айырмаланат: бармак баскычы качан кармалса, өзгөрткүчтөр гана колдонулат. Булар кармалып турганда активдешет жана бир нече басууга болот. Демек, эгер А баскычы Shift, ал эми B баскычы Ctrl болсо, анда А жана В баскычтарын басып турсаңыз, Shift жана Ctrl экөөнү тең баскандай болосуз, бирок бармак баскычы басылып турса гана!
Кабык эргономикалык жана амбидекст болуу үчүн иштелип чыккан. Мен кичинекей манжамды колдонуу өтө чарчабайт жана аны колум меникинен чоңураак болгондор үчүн иштеши үчүн, аны тыкан кылып орнотууга абдан кам көрдүм.
2 -кадам: Прототип + Код
Нан тактасындагы баскычтарды текшерүү жакшы практика. Бул абдан жөнөкөй, көрсөтүлгөндөй баскычтарды жана резисторлорду туташтырыңыз. Сиз муну код менен бул жерден сынап көрө аласыз (pastebin link alternative):
#кошуу
// MacOS үчүн vthisv опциясын колдонуңуз:
// char ctrlKey = KEY_LEFT_GUI;
// Windows жана Linux үчүн vthisv опциясын колдонуңуз:
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 DELAY = 0;
enum мамлекеттер {бошотулган, басылган, өткөрүлгөн, бошотулган};
структура баскычы {
int pin; Штаттар штат; int timeHeld; }; // бармак, индекс, орто, шакек, кичине;
баскыч баскычтары [BUTTON_NUM] = {};
initButton баскычы (int p) {
баскыч b; pinMode (p, INPUT); b.pin = p; б.мамлекет = Мамлекеттер:: боштондукка чыккан; b.timeHeld = 0; кайтуу b; }
жараксыз орнотуу () {
// орнотуу кодуңузду бул жерге коюңуз, бир жолу иштетүү үчүн: Serial.begin (9600); Keyboard.begin ();
while (! Serial) {};
// үчүн баскычтар (int i = 0; i <(BUTTON_NUM); ++ i) {Serial.print ("баскычты коюу"); Serial.print (i); Serial.print ("төөнөгүчтө:"); Serial.println (казыктар ); //buttons .pin = 1; баскычтар = initButton (пиндер ); Serial.println (баскычтар .pin); }
}
bool readButton (int pin) {
// текшерүү жана чыгаруу баскычтары if (digitalRead (pin) == HIGH) {delay (10); if (digitalRead (pin) == HIGH) {return true; }} 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 == pins [3]) 1000 кайтаруу; if (pin == pins [4]) 10000 кайтаруу; } button buttonStateUpdate (баскычы b) {
bool press = readButton (b.pin);
switch (b.state) {case States:: боштондукка: b.timeHeld = 0; if (press) b.state = States:: pressed; тыныгуу; case pressed: b.timeHeld+= 1; if (press) {if (b.timeHeld> (THRESH_1/(1+DELAY)))) {b.state = Штаттар:: өткөрүлгөн; }} башка {// if (b.timeHeld
int getButtonStateCode (b баскычы)
{кайтаруу б.мамлекет*пинтобин (б.пин); }
int getCodeByButton (int коду, int индекси) {
int r1, r2, r3, r4, r5; int opStep = BUTTON_NUM - (1+индекс);
// биринчи операция
if (opStep == 0) return code/10000; r1 = код%10000;
эгер (opStep == 1)
кайтаруу r1/1000; r2 = r1%1000; if (opStep == 2) r2/100 кайтаруу; r3 = r2%100; if (opStep == 3) r3/10 кайтаруу; r4 = r3%10; if (opStep == 4) r4/1 кайтаруу; r5 = r4%1; }
void completePress (int pin) {
// Serial.print ("киргизүү"); // Serial.println (пин); кечигүү (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 ("------ жылыш ------"); } else Keyboard.release (shiftKey); } башка {
// милдеттерди аткаруу
switch (код) {case 30: // --- | Brush Keyboard.press (shiftKey); Keyboard.print ('b'); completePress (код); тыныгуу; case 300: // --- | Eraser Keyboard.press (shiftKey); Keyboard.print ('e'); completePress (код); тыныгуу; case 3000: // --- | Челек Keyboard.press (shiftKey); Keyboard.print ('g'); completePress (код); тыныгуу; case 30000: // --- | Lasso Keyboard.press (shiftKey); Keyboard.print ('l'); completePress (код); тыныгуу; case 320: //-| o Undo Keyboard.press (ctrlKey); Keyboard.print ('z'); completePress (код); тыныгуу; case 3020: //-| -o Keyo.press кайталоо (ctrlKey); Keyboard.print ('y'); completePress (код); тыныгуу; case 30020: // | --o History Keyboard.press (shiftKey); Keyboard.print ('y'); completePress (код); тыныгуу; Case 230: //-o | Keyboard.pressти сактоо (ctrlKey); Keyboard.print ('s); completePress (код); тыныгуу; case 3200: //- | o- Quick-p.webp
int buttonCode = 0;
үчүн (int i = 0; i <BUTTON_NUM; ++ i) {баскычтар = buttonStateUpdate (баскычтар ); buttonCode+= getButtonStateCode (баскычтар ); }
if (buttonCode! = 0) {
Serial.print ("баскычтын коду:"); Serial.println (buttonCode); }
doAction (buttonCode);
// кайра иштетүү үчүн негизги кодуңузду бул жерге коюңуз: // for (int i = түймөлөр [0]; i <sizeof (түймөлөр)/sizeof (түймөлөр [0])+баскычтар [0]; ++ i) {/ / // if (readButton (i)) {// doAction (i); //} //}
if (getCodeByButton (buttonCode, 0)! = 2)
Keyboard.releaseAll ();
кечигүү (DELAY);
}
Логика жөнүндө айтууга көп нерсе жок, анткени ал менин акыркы контролерумдукуна окшош, эки көрүнүктүү айырмасы бар:
- Баскычтар өздөрүнүн мамлекеттик машиналары менен курулган
- Штаттар чогулуп, аракеттерди аныктоочу кодду түзөт
Принцип бит которууга окшош, бирок баскычтар бир нече абалга ээ жана жөн гана бинардык түрдө бериле албагандыктан, анын ордуна ондун ыйгарым укуктарына көбөйтүлөт. Мен андан кийин бардык баскычтардын абалын бир санга кошуп, аны doAction () switch операторуна өткөрүп берем, ал жерде мен бардык жарлыктар кодун коем.
Көрүнүп тургандай, мен мүмкүн болгон бардык комбинацияны картага түшүргөн жокмун. Мен сүйүктүү кыска жолдорумдун бир нечесин гана кошуп койдум, калганын өзүңүзгө ылайыктуу түрдө толтурууну сизге калтырам;)
3 -кадам: Корпус
Корпуска 3D принтер колдондум. Көрүнүп тургандай, дизайнда кээ бир кемчиликтер бар жана мен аны жабуу үчүн MacGyverге аргасыз болдум. Ошентип, мен азырынча модель файлын жарыялабайм.
Кнопкалар "скамейкаларга" ысык желимделген, ошондуктан алар капкактарды ордунда кармашат. Жумшак баскычтар бул жагынан өзгөчө жакшы, андыктан, эгер меникине окшош ишти жасоону пландап жатсаңыз, алардын айрымдарын алууну унутпаңыз.
Ошондой эле, мен корпустун ичине бир аз салмак кошууну сунуштайм, анткени ал абдан жеңил. Кошумча граммдар аны табигый сезүүгө жардам берет.
Көрсөтүлгөндөй баарын ширеткиле жана USB кабелин туташтыргыла, ошондо баары ордуна келиши керек (желимдин жардамы менен)!
4 -кадам: Жыйынтык жана мүмкүн болгон жакшыртуулар
Мына сага! Бардык маанилүү жарлыктарыңызга бир колуңуз менен жетүү үчүн колдонула турган контролер!
Колдонуу үчүн бир аз булчуң-эс керек, бирок бул чындыгында ар тараптуу!
Албетте, бул идеалдуу эмес, мен азыр аны жакшыртуунун кээ бир жолдорун ойлонуп жатам. Корпусту жакшыртуудан жана жарлыктарды кошуудан тышкары, мен ар кандай жарлыктар менен бир нече тиркемелерди колдоо кызыктуу болмок деп ойлойм. Мен башкаруу схемаларынын ортосунда которуштуруу үчүн баскычтардын айкалышына ээ болууну ойлонуп жатам, мисалы, бир эле учурда 4 баскычты басуу, Photoshopтун кыска китепканасын Майя үчүн жасалган бир тигүүчүгө которуу үчүн.
Кээ бир гана ойлор.
Окуганыңыз үчүн рахмат, кийинки убакка чейин!
Сунушталууда:
Arduino (AutoCAD) ShortCut баскычтобу: 3 кадам
Arduino (AutoCAD) ShortCut клавиатурасы: Баарыңарга салам, көп сааттарды карап чыккандан кийин, көп нерселерди ойлоп тапкандан кийин, акыры бир нерсе куруп алдым. Ошондуктан, менин биринчи көрсөтмөмө даярдангыла! Мен көп убактымды профессионалдуу түрдө көңүл ачуу үчүн, ародировка үчүн өткөрөм
Crawl Space Monitor (aka: More Frozen Pipes !!): 12 кадам (Сүрөттөр менен)
Crawl Space Monitor (aka: More Frozen Pipes !!): Менин үйүмө суу кудуктан жылытылбаган сойлоп боштук аркылуу келет. Бардык ашкана жана ванна сантехникасы ушул мейкиндик аркылуу өтөт. (Жабык суу түтүктөрү бул үйдө 70-жылдардын орто ченинде ойлонулган нерсе болчу!) Мен жылуулук лампаларын колдонуп келем
PCB Handheld Arduino менен (Зымсыз баруу мүмкүнчүлүгү менен!): 3 кадам
PCB Handheld with Arduino (Wireless to Go Option!): Update 28.1.2019Азыр мен бул портфелдин кийинки версиясынын үстүндө иштеп жатам. Долбоорду менин YouTube каналымдан же Twitterден ээрчип алсаңыз болот. Эскертүү! Мен PCB макетинде ката таптым. Сол жана өйдө баскычтар аналогдук гана казыктарга туташтырылган. Тактадым
IM NAMES NO-MORE: 10 кадам
IM FAMES NO-KOORE: Мен өзүмдүн ысымымды жек көрөм жана мен билгендердин баары ушунчалык ооруп калдым, андан кантип кутулууну айтам, аларды бул жакка жана башка окурмандарга ырахат үчүн жөнөтөм
SHUTDOWN SHORTCUT: 3 кадам
SHUTDOWN SHORTCUT: Бул менин биринчи көрсөтмөм. Мен сизге компьютериңизди өчүрүү үчүн кыскартууларды кантип түзүүнү көрсөтөм. Компьютериңизди өчүрүп -күйгүзүү, чыгуу, уктоо жана кулпулоо үчүн жарлыктарды жасай аласыз