Skocz do zawartości

Klawiatura skrótów z Arduino, która ułatwia codzienną pracę


Pomocna odpowiedź

html_mig_img
Czy pamiętacie niedawny artykuł o własnej klawiaturze rozwiązującej problem nieporęcznych skrótów klawiszowych w programie Eagle? Dzięki niej do jednego przycisku można było przypisać nawet bardzo długą sekwencję kliknięć.W tym artykule przedstawiam moją klawiaturę, która ułatwia pracę z różnymi programami komputerowymi!

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Witam

Tak się składa że mam identyczną klawiaturkę 🙂, którą zamierzam przerobić pod skróty AutoCada. Czy możesz udostępnić plik źródłowy z Fusion360?

Podaj wartość rezystorów...a ideałem byłby schemat całości połączeń 🙂

Link do komentarza
Share on other sites

Cześć,
załączam plik .STL z dostawką do klawiatury. Co do rezystorów użyłem 4.7k żeby ograniczyć prąd płynący podczas zwarcia styków (rezystancja przy wciśnięciu przycisku wynosi około 80 Ω). Schemat jest dość prosty i sprowadza się do połączenia linii, które wymieniłem na początku kodu, do odpowiadających im pinów i wpięcie rezystorów przy pinach wejściowych.

klawiatura v7.zip

Link do komentarza
Share on other sites

Witam serdecznie.

Bardzo by mi się przydała taka klawiaturka. Zakupiłem taką samą na allegro. Przylutowałem przewody do 12 pinów na płytce, jednak nie wiem co dalej. Z poradnika nie dowiedziałem się gdzie przylutować do płytki od klawiatury przewód, by zadziałała np dioda. Czy mogę prosić o kontakt w celu pomocy? Pozdrawiam. Ogólnie to świetny poradnik, ale no, przydał by się schemat połączeń dla osób takich jak ja, czyli takich co się nie znają za dobrze.

P.S. Mam arduino nano

Link do komentarza
Share on other sites

tarzinio, witam na forum 🙂 Niestety ten projekt tworzyliśmy dla siebie, artykuł powstał przy okazji i nie sądziliśmy, że ktoś będzie chciał odtworzyć opisywaną klawiaturę 1:1. Na ten moment nie mamy żadnych więcej informacji niż te, które znajduje się w tekście. Wtedy połączenia opisywaliśmy z pamięci, nigdzie już ich teraz nie mamy. Jestem jednak przekonany, że po kilkunastu minutach z miernikiem w ręku uda Ci się odszyfrować połączenia wewnątrz tej klawiatury 🙂

Link do komentarza
Share on other sites

Witam.

Z tym sobie już poradziłem, ale już na samym początku kompilacji kody, wyskakują mi błędy :

/opt/arduino-builder/arduino-builder -compile -core-api-version 10611 -build-path /tmp/497104129/build -hardware opt/arduino-builder/hardware -hardware ./opt/cores -tools opt/arduino-builder/tools -tools ./opt/tools -built-in-libraries opt/libraries/latest -libraries /tmp/497104129/pinned -libraries /tmp/497104129/custom -fqbn arduino:avr:uno -build-cache /tmp -logger humantags -verbose=false /tmp/497104129/klawiatura_skrutow

Using library keyboard_1_0_2 at version 1.0.2 in folder: /home/ubuntu/opt/libraries/latest/keyboard_1_0_2

Using library HID at version 1.0 in folder: /home/ubuntu/opt/cores/arduino/avr/libraries/HID

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino: In function 'void onPress(int)':

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:92:7: error: 'Keyboard' was not declared in this scope

Keyboard.write(KEY_ESC);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:92:22: error: 'KEY_ESC' was not declared in this scope

Keyboard.write(KEY_ESC);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:95:22: error: 'KEY_PAGE_UP' was not declared in this scope

Keyboard.write(KEY_PAGE_UP);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:98:22: error: 'KEY_PAGE_DOWN' was not declared in this scope

Keyboard.write(KEY_PAGE_DOWN);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:101:22: error: 'KEY_LEFT_CTRL' was not declared in this scope

Keyboard.press(KEY_LEFT_CTRL);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:108:22: error: 'KEY_F10' was not declared in this scope

Keyboard.write(KEY_F10);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:111:22: error: 'KEY_F5' was not declared in this scope

Keyboard.write(KEY_F5);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:114:22: error: 'KEY_LEFT_SHIFT' was not declared in this scope

Keyboard.press(KEY_LEFT_SHIFT);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:115:22: error: 'KEY_LEFT_ALT' was not declared in this scope

Keyboard.press(KEY_LEFT_ALT);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:128:22: error: 'KEY_F8' was not declared in this scope

Keyboard.write(KEY_F8);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:141:22: error: 'KEY_F9' was not declared in this scope

Keyboard.write(KEY_F9);

^

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino: In function 'void setup()':

/tmp/497104129/klawiatura_skrutow/klawiatura_skrutow.ino:224:3: error: 'Keyboard' was not declared in this scope

Keyboard.begin();

^

exit status 1

Mój kod wygląda następująco ( Tym razem używam Arduino UNO ):

#include "Keyboard.h"

// led
#define LED_PIN A2

// liczby
#define MATRIX_SIZE 6

// stany
#define KEY_RELESED 0
#define KEY_PRESSED 1

// klawisze
#define KEY_NONE 'x'
#define KEY_ENTER 'e'
#define KEY_NUM 'n'
#define KEY_BACK 'B'
#define KEY_0 '0'
#define KEY_1 '1'
#define KEY_2 '2'
#define KEY_3 '3'
#define KEY_4 '4'
#define KEY_5 '5'
#define KEY_6 '6'
#define KEY_7 '7'
#define KEY_8 '8'
#define KEY_9 '9'
#define KEY_DOT '.'
#define KEY_PLUS '+'
#define KEY_MINUS '-'
#define KEY_MUL '*'
#define KEY_DIV '/'

// wyjscia - wiersze
#define OUT_LINE_1 12
#define OUT_LINE_2 11
#define OUT_LINE_6 8
#define OUT_LINE_A 7
#define OUT_LINE_B 6
#define OUT_LINE_C 5
const int OUTPUTS[] = {OUT_LINE_1, OUT_LINE_2, OUT_LINE_6, OUT_LINE_A, OUT_LINE_B, OUT_LINE_C};

// wejscia - kolumny
#define IN_LINE_3 13
#define IN_LINE_4 10
#define IN_LINE_5 9
#define IN_LINE_D 4
#define IN_LINE_E 3
#define IN_LINE_F 2
const int INPUTS[] = {IN_LINE_3, IN_LINE_4, IN_LINE_5, IN_LINE_D, IN_LINE_E, IN_LINE_F};

// macierze reprezentujące fizyczne symbole i stan zatrzasku
char symbols[MATRIX_SIZE * MATRIX_SIZE];
int states[MATRIX_SIZE * MATRIX_SIZE];
int index = 0;

// funkcja wewnatrz której definiujemy fizyczne połączenia klawiszy i ich symbole
void mapKeys(){
 setSymbol(OUT_LINE_1, IN_LINE_3, KEY_9);
 setSymbol(OUT_LINE_1, IN_LINE_4, KEY_3);
 setSymbol(OUT_LINE_1, IN_LINE_5, KEY_MUL);
 setSymbol(OUT_LINE_1, IN_LINE_D, KEY_6);
 setSymbol(OUT_LINE_1, IN_LINE_E, KEY_DOT);
 setSymbol(OUT_LINE_1, IN_LINE_F, KEY_MINUS);

 setSymbol(OUT_LINE_2, IN_LINE_3, KEY_7);
 setSymbol(OUT_LINE_2, IN_LINE_4, KEY_1);
 setSymbol(OUT_LINE_2, IN_LINE_D, KEY_4);

 setSymbol(OUT_LINE_6, IN_LINE_5, KEY_NUM);

 setSymbol(OUT_LINE_A, IN_LINE_3, KEY_PLUS);
 setSymbol(OUT_LINE_A, IN_LINE_4, KEY_ENTER);

 setSymbol(OUT_LINE_B, IN_LINE_3, KEY_8);
 setSymbol(OUT_LINE_B, IN_LINE_4, KEY_2);
 setSymbol(OUT_LINE_B, IN_LINE_5, KEY_DIV);
 setSymbol(OUT_LINE_B, IN_LINE_D, KEY_5);
 setSymbol(OUT_LINE_B, IN_LINE_E, KEY_0);

 setSymbol(OUT_LINE_C, IN_LINE_D, KEY_BACK);
}

// funckja w której wyzwalane są zdarzenia od kliknięć fizycznych przycisków
void onPress(int index){
 //załącz diodę umieszczoną na przodzie klawiatury
 digitalWrite(LED_PIN, HIGH);
 // pobierz symbol spod konkretnego indeksu
 switch(symbols[index]){
   //wierz 1
   case KEY_NUM:
     Keyboard.write(KEY_ESC);
     break;
   case KEY_DIV:
     Keyboard.write(KEY_PAGE_UP);
     break;
   case KEY_MUL:
     Keyboard.write(KEY_PAGE_DOWN);
     break;
   case KEY_MINUS:
     Keyboard.press(KEY_LEFT_CTRL);
     Keyboard.write(' ');
     Keyboard.releaseAll();
     break;

   //wiersz 2
   case KEY_7:
     Keyboard.write(KEY_F10);
     break;
   case KEY_8:
     Keyboard.write(KEY_F5);
     break;
   case KEY_9:
     Keyboard.press(KEY_LEFT_SHIFT);
     Keyboard.press(KEY_LEFT_ALT);
     Keyboard.write('q');
     Keyboard.releaseAll();
     break;
   case KEY_PLUS:
     Keyboard.press(KEY_LEFT_SHIFT);
     Keyboard.press(KEY_LEFT_ALT);
     Keyboard.write('o');
     Keyboard.releaseAll();
     break;

   //wiersz 3
   case KEY_4:
     Keyboard.write(KEY_F8);
     break;
   case KEY_5:
     Keyboard.press(KEY_LEFT_CTRL);
     Keyboard.write(KEY_PAGE_UP);
     Keyboard.releaseAll();
     break;
   case KEY_6:
     Keyboard.press(KEY_LEFT_SHIFT);
     Keyboard.write(KEY_PAGE_UP);
     Keyboard.releaseAll();
     break;
   case KEY_BACK:
     Keyboard.write(KEY_F9);
     break;

   //wiersz 4,5
   case KEY_1:
     Keyboard.press(KEY_LEFT_CTRL);
     Keyboard.write('q');
     Keyboard.releaseAll();
     break;
   case KEY_2:
     Keyboard.press(KEY_LEFT_CTRL);
     Keyboard.write(KEY_PAGE_DOWN);
     Keyboard.releaseAll();
     break;
   case KEY_3:
     Keyboard.press(KEY_LEFT_SHIFT);
     Keyboard.write(KEY_PAGE_DOWN);
     Keyboard.releaseAll();
     break;
   case KEY_0:
     Keyboard.print(":)");
     break;
   case KEY_DOT:
     Keyboard.press(KEY_LEFT_CTRL);
     Keyboard.write('u');
     Keyboard.releaseAll();
     break;
   case KEY_ENTER:
     Keyboard.write(KEY_ENTER);
     break;
 }

 delay(200);
 digitalWrite(LED_PIN, LOW);
}

// funckja wiążąca symbol z numerami (indeksami w tablicach)
// linii wejścia i wyjścia
void setSymbol(int lineOutput, int lineInput, char symbol){
 // zmienne odpowiedajace indeksom w tablicy dla fizycznych linii
 // wpisanych przez użytkownika.
 int iRow, iColumn;

 // odszukaj indeks wiersza czyli lini wyjsc w macierzy
 for(iRow = 0; iRow < MATRIX_SIZE; ++iRow){
   if(OUTPUTS[iRow] == lineOutput)
     break;
 }

 // odszukaj indeks kolumny czyli lini wejsc w maciery
 for(iColumn = 0; iColumn < MATRIX_SIZE; ++iColumn){
   if(INPUTS[iColumn] == lineInput)
     break;
 }

 // zapisz symbol w komorce macierzy 1-wymiarowej
 // przy pomocy 2 współrzędnych
 symbols[iRow * MATRIX_SIZE + iColumn] = symbol;
}

// wstępne ustawienia peryferiów i mapowanie przycisków
void setup() {
 //LED
 pinMode(LED_PIN, OUTPUT);
 digitalWrite(LED_PIN, LOW);

 for(int i = 0; i < MATRIX_SIZE; ++i){
   pinMode(OUTPUTS[i], OUTPUT);
   digitalWrite(OUTPUTS[i], HIGH);

   //WEJSCIA 
   pinMode(INPUTS[i], INPUT);
   digitalWrite(INPUTS[i], HIGH);
 }

 // domyślnie nie ma żadnych połączeń w klawiaturze
 for(int i = 0; i < MATRIX_SIZE * MATRIX_SIZE; ++i){
   symbols[i] = KEY_NONE;
   states[i] = KEY_RELESED;
 }

 // użyj połączeń zdefiniownaych przez użytkownika
 mapKeys();
 Keyboard.begin();
}

// główna pętla w której sprawdzane są kliknięcia
void loop() {
 for(int iOutput = 0; iOutput < MATRIX_SIZE; ++iOutput){
   // aktywuj sprawdzanie wiersza o indeksie iOutput
   digitalWrite(OUTPUTS[iOutput], LOW);
   for(int iInput = 0; iInput < MATRIX_SIZE; ++iInput){
     // oblicz numer indeksu w macierzy wszystkich przycisków
     index = iOutput * MATRIX_SIZE + iInput;

     // jeżeli obecny stan jest LOW (przycisk wciśnięty)
     if((digitalRead(INPUTS[iInput]) == LOW)){
       if(states[index] == KEY_RELESED){
         // to wywołaj kliknięcie
         onPress(index);
       }
       // ustaw flagę żeby zadziałał zatrzask
       states[index] = KEY_PRESSED;
     } else if(states[index] == KEY_PRESSED)
       // zresetuj zatrzask w momencie puszczenia przycisku
       states[index] = KEY_RELESED;
   }
   // opuść linię aby przejść do następnej
   digitalWrite(OUTPUTS[iOutput], HIGH);
 }
}

Dodam, że pracuje na IDE w wersji online.

Ktoś wie jak sobie z tym poradzić?

Link do komentarza
Share on other sites

Owszem - użyć właściwej wersji Arduino (sprzętu, nie IDE).

Ten program może działać wyłącznie na Arduino Leonardo i Micro (z uwzględnieniem Pro Micro) - chyba że jest jeszcze jakieś o którym nie wiem. Uno, Nano, Mini i cała reszta po prostu nie obsługują USB HID i w związku z tym wszelkie próby kompilacji tego programu będą przypominać próby zatankowania wodoru do Opla Astry.

Po prostu - Astra nie jeździ na wodorze, Uno nie emuluje klawiatury.

Link do komentarza
Share on other sites

Witajcie, 

Co może być nie tak z podpięciem biblioteki Keyboard.h , przykład dołączony do zainstalowanej biblioteki:

image.thumb.png.8db3df9e84f42c2c56f4f2a7d9cf0226.png

 

sprawdziłem Wire - działa :

image.thumb.png.5d276aeb07ed6917294b532bad771b1c.png

Przeinstalowałem więc środowisko, wywaliłem wszystkie zainstalowane wcześniej biblioteki, nic nie pomaga 😞

Co jeszcze powinienem sprawdzić? Biblioteka pochodzi z :

https://github.com/arduino-libraries/Keyboard

 

EDIT:  Chyba już wiem o co kaman, zdaje się że Keyboard.h działa tylko dla  ATmega32u4 lub Micro:

z Arduino.cc:

"The keyboard functions enable 32u4 or SAMD micro based boards to send keystrokes to an attached computer through their micro’s native USB port."

znaczy się moje Uno mogę schować do kieszeni, szkoda 😞 

 

 

Edytowano przez __ROBI__
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.