Skocz do zawartości

System do szybszego wpisywania komend w minecrafcie (na konsolach)


Pomocna odpowiedź

Miałem nie raz problem z graniem na konsoli z kolegą lub siostrą i chciałem wpisać komendę(jeśli nie wiesz komendy wpisuje się do czatu w formie tekstowej i wtedy minecraft coś robi) ale na to siostra: "ja też chcę grać! zamykaj tą klawiaturę i daj mi grać! nie chcę czekać!".

pomysł 1: korzystam z zewnętrznej klawiatury (konsole mają wbudowaną na joysticka trochę jak smart tv) ale i tak za długo wpisuję. więc to nie to

pomysł 2: spędzam kilka(chyba naście) godzin na projekcie z 2 arduin żeby móc na spokojnie wpisać komendę a potem to urządzenie wpisuje w tempie sonica 10 znaków/sekundę

i żeby było jasne 2 arduina to nie wszystko co potrzeba. to lista co użyłem w tym projekcie: arduino duearduino leonardo konwerter stanów logicznych, wyświetlacz 20 na 4 z konwerterem i2c, gniazdo usb(do zasilenia due, nie wymagane) i  płytka stykowa i kabelki

arduina muszą spełniać pewne wymagania żeby projekt działał:

arduino nr1 (w moim przypadku leonardo): wystarczy wsparcie biblioteki "keyboard"(czyli leonardo,micro etc.)

arduino nr2(due): musi być due bo tylko due wspiera usb-host

schemat:

klawiaturazpoczekalniaschemat.thumb.png.ac2b70466aab5ffcd471b8777da3fc31.png

(nie jestem za dobry w schematy)

kod dla due:

// Require keyboard control library
#include <KeyboardController.h>

bool dueSendToPC = false;
// Initialize USB Controller
USBHost usb;

// Attach keyboard controller to USB
KeyboardController keyboard(usb);

// This function intercepts key press
void keyPressed() {
  Serial1.print('p');
  if(dueSendToPC){
  Serial.print("Pressed:  ");
  }
  printKey();
}

// This function intercepts key release
void keyReleased() {
  Serial1.print('r');
  if(dueSendToPC){
  Serial.print("Released: ");    
  }
  printKey();
}

void printKey() {
  // getOemKey() returns the OEM-code associated with the key
  String tosend = "";
  if(String(int(keyboard.getOemKey())).length() < 2){
    tosend += ' ';
  }
  tosend += String(int(keyboard.getOemKey()));
  if(dueSendToPC){
  Serial.print(" key:");
  Serial.print(keyboard.getOemKey());    
  }
  //idk 0-3(wlacznie - wlacznie)
  //litery 4 - 29(wlacznie - wlacznie)(nr wg ang alf)
  //cyfry 30 - 39(wlacznie - wlacznie)(nr wg kol od l do p)
  //[enter] 40
  //[esc] 41
  //[backspace] 42
  //[tab] 43
  //[space] 44
  //-/_ 45
  //=/+ 46
  //[/{ 47
  //]/} 48
  //\/| 49
  //idk 50
  //;/: 51
  //'/" 52
  //`/~ 53
  //,/< 54
  //./> 55
  ////? 56
  //[caps lock] 57
  //fny 58-69(wlacznie - wlacznie)(nr wg kol od l do p)
  //idk 70-75(wlaczne - wlacznie)
  //[delete] 76
  //idk 77 - 78(wlacznie - wlacznie)
  //strzalki 79-82(wlacznie - wlacznie)(p l d g)

  // getModifiers() returns a bits field with the modifiers-keys
  int mod = keyboard.getModifiers();
  if(String(mod).length() < 2){
    tosend += "  ";
  }else if(String(mod).length() < 3){
    tosend += ' ';
  }
  tosend += String(mod);
  if(dueSendToPC){
  Serial.print(" mod:");
  Serial.print(mod);
  Serial.print(" => ");    
  }

  if (mod & LeftCtrl) {
    if(dueSendToPC){
      Serial.print("L-Ctrl ");    
    }
  }
  if (mod & LeftShift) {
    if(dueSendToPC){
      Serial.print("L-Shift ");    
    }
  }
  if (mod & Alt) {
    if(dueSendToPC){
      Serial.print("Alt ");    
    }
  }
  if (mod & LeftCmd) {
    if(dueSendToPC){
      Serial.print("L-Cmd ");    
    }
  }
  if (mod & RightCtrl) {
    if(dueSendToPC){
      Serial.print("R-Ctrl ");
    }
  }
  if (mod & RightShift) {
    if(dueSendToPC){
      Serial.print("R-Shift ");
    }
  }
  if (mod & AltGr) {
    if(dueSendToPC){
      Serial.print("AltGr ");
    }
  }
  if (mod & RightCmd) {
    if(dueSendToPC){
      Serial.print("R-Cmd ");
    }
  }
  uint8_t oem = keyboard.getOemKey();
  // getKey() returns the ASCII translation of OEM key
  // combined with modifiers.
  uint8_t key = keyboard.getKey();
  if((oem > 3 && oem < 40) || (oem > 43 && oem < 50) || (oem > 50 && oem <57)){
    tosend += 'c';
    tosend += char(key);
  }else if(oem > 57 && oem < 64){
    tosend += "fd";
  }else if(oem > 63 && oem < 70){
    tosend += "fp";
  }else if(oem == 42){
    tosend += "fb";
  }
  if(dueSendToPC){
    Serial.write(key);
  }
  const String toprint = tosend;
  Serial1.print(toprint);
  Serial1.println();
  if(dueSendToPC){
  Serial.println();
  }
}

void setup() {
  Serial1.begin(9600);
  Serial1.println("Program started");
  if(dueSendToPC){
    Serial.begin(9600);
  Serial.println("Program started");
  }
  delay(200);
}

void loop() {
  // Process USB tasks
  usb.Task();
}

i dla leonardo:

#include <Keyboard.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

#include <SoftwareSerial.h>
SoftwareSerial pcdatareciver(10, 11);

bool serialSend = false;
bool keyboardSend = true;
String toprint = "";

void setup() {
  // put your setup code here, to run once:
  lcd.init();
  lcd.backlight();
  lcd.cursor();
  if(serialSend){
    Serial.begin(9600);
  }
  if(keyboardSend){
    Keyboard.begin();
  }
  pcdatareciver.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(pcdatareciver.available()){
    String recived = pcdatareciver.readStringUntil('\n');
    if(7 < recived.length() && recived.charAt(0) == 'p'){
      if(serialSend){
        Serial.print(recived);
      }
      if(recived.charAt(6) == 'c'){
        toprint += recived.charAt(7);
      }else if (recived.charAt(6) == 'f') {
        if(recived.charAt(7) == 'd'){
          toprint = "";
        }else if(recived.charAt(7) == 'b'){
          String temptoprint = "";
          for(int i = 0; i < toprint.length() - 1; i++){
            temptoprint += toprint.charAt(i);
          }
          toprint = temptoprint;
        }else if(recived.charAt(7) == 'p'){
          if(keyboardSend){
            for(int i = 0; i < toprint.length(); i++){
              Keyboard.write(toprint.charAt(i));
              delay(100);
            }
          }
          if(serialSend){
            Serial.println(toprint);
          }
        }
      }
      if(serialSend){
        Serial.print('\t');
        Serial.println(toprint);
      }
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(toprint);
    }
  }
}

int getoem(String reciveddd){
  if(reciveddd.charAt(1) == ' '){
    return int(reciveddd.charAt(2));
  }else {
    return int(reciveddd.charAt(1)+reciveddd.charAt(2));
  }
}
int gedmod(String reciveddd){
  if(reciveddd.charAt(4) == ' '){
    return int(reciveddd.charAt(5));
  }else if(reciveddd.charAt(3) == ' '){
    return int(reciveddd.charAt(4)+reciveddd.charAt(5));
  }else {
    return int(reciveddd.charAt(3)+reciveddd.charAt(4)+reciveddd.charAt(5));
  }
}

tak wygląda po złożeniu:

IMG_20250306_151012758.thumb.jpg.42867a90a3d05255a69366c097bc809f.jpgIMG_20250306_153759761.thumb.jpg.630062219c8ef6d0a9434cc181607085.jpg

działanie:

program akceptuje znaki:  abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ `~1!2@3#4$5%6^7&8*9(0)-_=+[{]}\|;:'",<.>/?

(tak spacja też tam jest :) )

backspace robi to co backspace(ale w tekście na ekraniku)

klawisze f1-f6 usuwają wszystko z ekranika

klawisze f7-f12 piszą nie usuwając z ekranika

klawiaturę podłączamy w port usb arduina due ten dalej od gniazda okrącłego na baterię(jak na schemacie) a komputer podłączamy do pordu usb leonard'a

zdjęcia z działania:

IMG_20250306_152200825.thumb.jpg.4fab8e50eddf341bc989569ba9137c76.jpgIMG_20250306_152221847.thumb.jpg.94b3905e149c2bec1ee9019f25303f31.jpgIMG_20250306_152227453_HDR.thumb.jpg.f271cb0dcb3a99163ead0b2366a820e5.jpgIMG_20250306_152232144_HDR.thumb.jpg.2293ff4c53faf90c92853a7e45a4aca1.jpg

+ filmik w zipie

VID_20250306_152245563 no sound small.zip

  • Lubię! 2
Link do komentarza
Share on other sites

Hm... zawsze mi się wydawało że Leonardo doskonale emuluje klawiaturę bez dodatkowych wynalazków 🙂

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

(edytowany)

Nie mogę usunąć due bo due łączy się z klawiatura komputerowa na usb. micro jest zajete innym projektem. rpi mam tylko w wydaniu 4b 8gbram

Edytowano przez marcin_zgo
Link do komentarza
Share on other sites

(edytowany)

Przecież due robi to co równie dobrze zrobi leonardo... a nie widzę żeby robił coś więcej.

Pisałem o rpi pico, czyli mikrokontrolerem za 20 pln. Tu masz mój projekt klawiatury na pico: 

 

Edytowano przez ethanak
Link do komentarza
Share on other sites

(edytowany)

@ethanak okej ale ja używam klawiatury 78 klawiszowej(normalnej do Windowsa) na USB i leonardo nie może odczytać USB (tylko pisać)

to tylko pamięć tymczasowa

Edytowano przez marcin_zgo
Link do komentarza
Share on other sites

A dobra, tego nie doczytałem...

Ale inna sprawa - dalej można pominąć due. Windowsowa klawiatura powinna zadziałać w trybie ps2, a z tym leonardo chyba nie powinien mieć problemu.

Wiem, czepiam się, ale ja zawsze wolę zastosować pojedynczą płytkę zamiast dwóch (jeśli się da).

A w ogóle projekt fajny 🙂

Link do komentarza
Share on other sites

(edytowany)

jak leonardo ma czytać wduszane klawisze na zewnętrznej klawiaturze USB???

nie rozumiem jak ty to chcesz zrobić

i tak tez wole jedna płytkę zamiast dwoch

Edytowano przez marcin_zgo
Link do komentarza
Share on other sites

56 minut temu, marcin_zgo napisał:

jak leonardo ma czytać wduszane klawisze na zewnętrznej klawiaturze USB???

Bo klawiatura USB powinna umieć działać w trybie PS/2. A do czytania PS/2 przez GPIO są odpowiednie biblioteki. Jeśli się uda (nie jestem na 100% pewien) to zamiast due wystarczy zwykłe gniazdo USB (w rzeczywistości robiące za PS/2)

Link do komentarza
Share on other sites

(edytowany)

jak znajdziesz to przerobie

chętnie skorzystam

nie znam się na standardach usb

Edytowano przez marcin_zgo
Link do komentarza
Share on other sites

7 godzin temu, marcin_zgo napisał:

jak znajdziesz to przerobie

 

A czy ja wyglądam na interfejs do googla???

https://docs.arduino.cc/libraries/ps2keyadvanced/ - biblioteka

Schemat połączeń to już sobie znajdziesz (przejściówka do klawiatury usb-ps2)

Tylko uwaga: nie każda klawiatura potrafi działać w tym trybie! Sprawdź sobie na jakimś przykładowym programie.

7 godzin temu, marcin_zgo napisał:

nie znam się na standardach usb

To właśnie nie jest usb.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.