Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Kolik posuvných registrů je spojeno? */
- #define POCET_SHIFT_REGISTRU 6
- // ╔══╦╦══╗
- /* Kolik vstupů má každý shift registr? */ // Paralel load -> ║ ╚╝ ║ <- VCC
- #define POCET_VSTUPU POCET_SHIFT_REGISTRU * 8 // Clock -> ║ 7 ║ <- Clock enable
- // switch 4 -> ║ 4 ║ <- switch 5
- /* Kolik microsekund má trvat puls pro zachycení stavů tlačítek? */ // switch 3 -> ║ H ║ <- switch 6
- #define DELKA_PULSU_USEC 5 // switch 2 -> ║ C ║ <- switch 7
- // switch 1 -> ║ 1 ║ <- switch 8
- /* Doporučená prodleva mezi čtením posuvných registrů.*/ // Nothing -> ║ 6 ║ <- From next
- #define PRODLEVA_CTENI 1 // GROUND -> ║ 5 ║ <- Q7
- // ╚══════╝
- /* Celkový pošer tlačítek připojených k Arduino */
- #define CELKEM_VSTUPU 48
- //═════════════════════════════════════════════════════════════════════════════════════════//
- int ploadPin = 8; // Připojení k Parallel load pinu posuvného registru (1)
- int clockEnablePin = 9; // Připojení k Clock Enable pinu posuvného registru (15)
- int dataPin = 11; // Připojení k Q7 pinu posuvného registru (9)
- int clockPin = 12; // Připojení k Clock pinu posuvného registru (2)
- char posledniStisknutaKlavesa;
- int klavesaJeStisknuta;
- int pozmeneno[POCET_VSTUPU]= {};
- int tlacitkoOLD[POCET_VSTUPU] = {};
- int tlacitko[POCET_VSTUPU] = {};
- int ZakladniVstupy[] = {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
- /* Knifovny a proměnné potřebné pro knihovnu zpoždění */
- #include <Arduino.h> //Přibal knihovnu Arduina
- #include "avdweb_VirtualDelay.h" //github.com/avandalen/VirtualDelay
- VirtualDelay singleDelay; //Deklarace proměnné potřebné pro délku stisknutí tlačítka
- VirtualDelay twoDelay;
- /* Proměnné pro otočný přepínač Poměrného tahu */
- char klavesaPT[] = {"_abcdefghijkl"};
- int pomernyTahVstupy[4];
- int aktualniStavPT;
- int staryStavPT = 1;
- int zapisovatelnyStavPT;
- int staryZapisovatelnyStavPT;
- #include <Keyboard.h>
- char klavesa[] = {"0123456789024abcdefghijklmnopqrstuwxyzabcdefghijklmnopqrstuwxyz"};
- int Ctrl[] = {0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
- int Shift[] = {1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
- //═════════════════════════════════════════════════════════════════════════════════════════//
- void cteniPosuvnychRegistru() {
- int bitVal; //Deklarace proměnné určující stav vstupu
- digitalWrite(clockEnablePin, HIGH); //
- digitalWrite(ploadPin, LOW); //
- delayMicroseconds(DELKA_PULSU_USEC); //
- digitalWrite(ploadPin, HIGH); //
- digitalWrite(clockEnablePin, LOW); //
- for(int i=0; i<POCET_VSTUPU; i++){ //Cyklus čtení stavu tlačítka a jeho převodu do pole "Tlačítko"
- bitVal = digitalRead(dataPin); //BitValue je rovno stavu dataPinu
- tlacitko[i] = bitVal; //Bit v polu je roven tomuto stavu
- digitalWrite(clockPin, HIGH); //
- delayMicroseconds(DELKA_PULSU_USEC); //
- digitalWrite(clockPin, LOW); //
- }
- }
- //═════════════════════════════════════════════════════════════════════════════════════════//
- void kontrolaZmen() {
- boolean dosloKeZmene = false; //Deklarace proměnné došlo ke změně
- cteniPosuvnychRegistru(); //Spusť funkci ČteníPosuvnýchRegistrů
- for(int i=0; i<POCET_VSTUPU; i++) { //Zkoušej všechna tlačítka
- if(tlacitko[i] != tlacitkoOLD[i]){ dosloKeZmene = true; } //Pokud se nějteré z tlačítek nerovná jeho starému stavu, došloKeZmeně =1
- } //
- if(dosloKeZmene == true){ //Pokud došlo na některém z tlačítek ke změně
- for(int i=0; i<POCET_VSTUPU; i++) { Serial.print(tlacitko[i]); } //Vytiskni stav všech tlačítek připojených k arduinu
- Serial.print("\r\n"); //Vytiskni na Serial nový řádek
- dosloKeZmene = false; //Vracení promenné DošloKeZmeně do základního stavu
- } //
- for(int i=0; i<POCET_VSTUPU; i++){ //
- if(tlacitko[i] >> tlacitkoOLD[i]){ pozmeneno[i] = 1; } //Pokud je tlačítko nově stisknuto, do pole prozměněno se zapíše 1
- tlacitkoOLD[i] = tlacitko[i]; //Nahrazení starých hodnot novými
- }
- }
- //═════════════════════════════════════════════════════════════════════════════════════════//
- void stiskKlaves() {
- for(int j=4; j<CELKEM_VSTUPU; j++){
- if(klavesaJeStisknuta == 0){ //Pokud není stisknuta žádná klávesa
- if(pozmeneno[j] == 1){ //a pokud rovněž došlo ke změně na jednom z tlačítek
- pozmeneno[j] = 0; //Je jisté že funkce proběhne, takže zakážeme její opakování
- Serial.print("Stisknuta klavesa "); //Vypiš po Serial že je stisknuta klávesa
- Serial.print(j);
- Serial.print(" - ");
- Serial.println(klavesa[(j-4)]);
- if (Ctrl[(j-4)] == 1 && Shift[(j-4)] == 0) {Keyboard.press(KEY_LEFT_CTRL); }
- else if(Ctrl[(j-4)] == 0 && Shift[(j-4)] == 1) {Keyboard.press(KEY_LEFT_SHIFT); }
- else if(Ctrl[(j-4)] == 1 && Shift[(j-4)] == 1) {Keyboard.press(KEY_LEFT_CTRL);
- Keyboard.press(KEY_LEFT_SHIFT); }
- Keyboard.press(klavesa[(j-4)]);
- klavesaJeStisknuta = 1; //Klávesa byla stisknuta, takže zamezíme zároveň stisku další klávesy
- posledniStisknutaKlavesa = klavesa[(j-4)];
- singleDelay.start(200); //Započni stisk s délkou "x" milisekund
- tlacitkoOLD[j] = tlacitko[j];
- delay(1);
- } } }
- if(singleDelay.elapsed()){ //Pokud už prodleva mezi stiskem a uvolněním proběhla
- if(klavesaJeStisknuta == 1){ //A je stisknutá nějaká klávesa
- Serial.println("Pusteno"); //Napiš na Serial, že došlo k jejímu uvolnění
- Keyboard.release(posledniStisknutaKlavesa);
- Keyboard.releaseAll();
- klavesaJeStisknuta = 0; //Je možno stisknout další klávesu
- delay(1);
- } }
- }
- //═════════════════════════════════════════════════════════════════════════════════════════//
- void pomernyTah() { //Funkce pro čtení ovladače poměrného tahu
- for(int i=0; i<4; i++){ pomernyTahVstupy[i] = tlacitko[i]; } //PomernyTahVstupy je roven stavu napětí na pinu
- for(int i=0; i<4; i++){ bitWrite(aktualniStavPT, i, pomernyTahVstupy[i]); } //Jednotlivé bity jsou rovny poli hodnot PomernyTahVstupy
- if(aktualniStavPT != staryStavPT){twoDelay.start(120);} //Pokud došlo ke změně napětí, začni počítat zpoždění
- if(aktualniStavPT != staryStavPT && twoDelay.elapsed()){ //Pokud došlo ke změně napětí a zároveň skončila doba zpoždění
- staryStavPT = aktualniStavPT; //Nahraď starý stav novým
- zapisovatelnyStavPT = aktualniStavPT; } //ZapisovatelnyStavPT je roven aktuálnímu
- for(int i=1; i<13; i++) { //Počítej od 1 do 13
- if(zapisovatelnyStavPT == i && staryZapisovatelnyStavPT != zapisovatelnyStavPT && klavesaJeStisknuta == 0) {
- Serial.print("Stisknuta klavesa PT "); //Stiskni klávesu
- Serial.println(klavesaPT[i]);
- Keyboard.press(klavesaPT[i]);
- posledniStisknutaKlavesa = klavesaPT[i];
- klavesaJeStisknuta=1;
- singleDelay.start(350);
- staryZapisovatelnyStavPT = zapisovatelnyStavPT; //Nahrazení StaréhoZapisovatelnéhoStavu novým
- } }
- if(singleDelay.elapsed()){ //Pokud už prodleva mezi stiskem a uvolněním proběhla
- if(klavesaJeStisknuta == 1){ //A je stisknutá nějaká klávesa
- Serial.println("Pusteno"); //Napiš na Serial, že došlo k jejímu uvolnění
- Keyboard.release(posledniStisknutaKlavesa);
- Keyboard.releaseAll();
- klavesaJeStisknuta =0; //Je možno stisknout další klávesu
- } }
- }
- //═════════════════════════════════════════════════════════════════════════════════════════//
- void setup() {
- Keyboard.begin();
- Serial.begin(19200); //Začni sériovou komunikaci ve zvolené rychlosti
- pinMode(ploadPin, OUTPUT); //Nahrávací (shiftregister 1 na 8 pin Arduina)
- pinMode(clockEnablePin, OUTPUT); //Sepnutí časovače (shiftregister 15 na 9 pin Arduina)
- pinMode(clockPin, OUTPUT); //Časovač (shiftregister 2 to na 12 pin Arduina)
- pinMode(dataPin, INPUT); //Data z 74HC165 (shiftregister 9 to 11 pin Arduina)
- digitalWrite(clockPin, LOW); //Ujisti se, že clock pin je LOW
- digitalWrite(ploadPin, HIGH); //Nastav nahrávací pin na HIGH
- delay(1000);
- kontrolaZmen();
- for(int i=4; i<CELKEM_VSTUPU; i++){
- if(tlacitko[i] >> ZakladniVstupy[i]){ pozmeneno[i] = 1; }
- tlacitkoOLD[i] = tlacitko[i];
- }
- delay(50);
- pomernyTah();
- delay(50);
- stiskKlaves();
- delay(50);
- }
- //═════════════════════════════════════════════════════════════════════════════════════════//
- void loop() {
- kontrolaZmen(); //Zkontroluj, zda na nějakém tlačítku nedošlo ke změně
- pomernyTah(); //A co ovladač poměrného tahu?
- stiskKlaves(); //Vyzkoušej možnost provést funkci stiskKlaves
- delay(PRODLEVA_CTENI); //Doporučená prodleva
- }
- //═════════════════════════════════════════════════════════════════════════════════════════//
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement