Skocz do zawartości

Klawiatura Numeryczna USB z Arduino Host


qro9qs

Pomocna odpowiedź

1 godzinę temu, macizet napisał:

A CH340? Zawsze można użyć takiego konwertera z Serial na USB i odwrotnie.

Jak by ta klawiatura była hostem i urządzeniem CDC to jasne. Ale niestety jest device-em i HID, więc CH340 się nie przyda.

  • Pomogłeś! 1
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)
Dnia 1.02.2020 o 14:59, ethanak napisał:

A po co tam apostrofy? Ma być


case 0x5f: cośtam();

Wygrałem misia?

Wygrałeś. Teraz pracuje jak należy. Dziękuje serdecznie!

Poniżej ostateczny kod:

#include <hidboot.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

class KbdRptParser : public KeyboardReportParser
{
    void PrintKey(uint8_t mod, uint8_t key);

  protected:
    void OnControlKeysChanged(uint8_t before, uint8_t after);
    void OnKeyDown	(uint8_t mod, uint8_t key);
    void OnKeyUp	(uint8_t mod, uint8_t key);
    void OnKeyPressed(uint8_t key);
};

void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
  MODIFIERKEYS mod;
  *((uint8_t*)&mod) = m;
  Serial.print((mod.bmLeftCtrl   == 1) ? "C" : " ");
  Serial.print((mod.bmLeftShift  == 1) ? "S" : " ");
  Serial.print((mod.bmLeftAlt    == 1) ? "A" : " ");
  Serial.print((mod.bmLeftGUI    == 1) ? "G" : " ");

  Serial.print(" >");
  PrintHex<uint8_t>(key, 0x80);
  Serial.print("< ");

  Serial.print((mod.bmRightCtrl   == 1) ? "C" : " ");
  Serial.print((mod.bmRightShift  == 1) ? "S" : " ");
  Serial.print((mod.bmRightAlt    == 1) ? "A" : " ");
  Serial.println((mod.bmRightGUI    == 1) ? "G" : " ");
};

void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
  Serial.print("DN ");
  PrintKey(mod, key);
  uint8_t c = OemToAscii(mod, key);

  if (c)
    OnKeyPressed(c);
}

void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after) {

  MODIFIERKEYS beforeMod;
  *((uint8_t*)&beforeMod) = before;

  MODIFIERKEYS afterMod;
  *((uint8_t*)&afterMod) = after;
}

void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key)
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  Serial.print("UP ");
  PrintKey(mod, key);
  switch(key){
    case 0x53: digitalWrite(2, HIGH);digitalWrite(3,LOW); break;
    case 0x5F: digitalWrite(3, HIGH);digitalWrite(2,LOW); break;
  }
}

void KbdRptParser::OnKeyPressed(uint8_t key)
{
};

USB     Usb;
HIDBoot<USB_HID_PROTOCOL_KEYBOARD>    HidKeyboard(&Usb);
KbdRptParser Prs;

void setup()
{
  Serial.begin( 115200 );
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif

  if (Usb.Init() == -1)
    Serial.println("OSC did not start.");
  HidKeyboard.SetReportParser(0, &Prs);
}

void loop(){
   Usb.Task();
  }

 

Przy okazji jeszcze jedno pytanie. Gdy np. PIN10 jest rozwarty klawiatura działa i wykonują się kolejne polecenia. Gdy PIN10 zostanie zwarty do masy klawiatura ma nie być aktywna. Jednocześnie wszystkie wybrane wcześniej polecenia zostają nie ruszone. 
Przy klawiaturze  membranowej zastosowałem zwykły if przed getchar. W jaki sposób zastosować to w omawianym w temacie kodzie?

Edytowano przez qro9qs
Link do komentarza
Share on other sites

Dla wszystkich zainteresowanych temat rozwiązany. Warunek należy zawrzeć w void loop()

Dziękuję za pomoc!

 


void loop(){
  if(expander1.digitalRead(1) == HIGH){
    Usb.Task();
  }
}

 

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

Aby nie tworzyć kolejnego tematu zapytam tutaj:

Expander PCF8574 i klawiatura membranowa 4x4

Kod do klawiatury już gotowy. Expander zadeklarowany, łączy się itd.

Pojedyncze piny zapisujemy przy pomocy kodu jak poniżej, jednak w jaki sposób zapisać, że klawiatura działa przez PCF8574, a nie bezpośrednio z Arduino?

expander.digitalWrite(1, HIGH);

 

#include <PCF8574.h>
#include <Wire.h>    

PCF8574 expander;

const byte ROWS = 4; // ile wierszy
const byte COLS = 4; //ile kolumn
 
byte rowPins[ROWS] = {1, 2, 3, 4}; //piny wierszy
byte colPins[COLS] = {5, 6, 7, 8}; //piny kolum
 
char hexaKeys[ROWS][COLS] = { 
  {'1','2','3','A'}, 
  {'4','5','6','B'}, 
  {'7','8','9','C'}, 
  {'*','0','#','D'} 
};

void setup() {
  Serial.begin (9600);
  expander.begin(0x3A);
}

void loop() {
  char customKey = customKeypad.getKey();

 if (customKey){
  Serial.println(customKey);
}

 

Link do komentarza
Share on other sites

Nie można. Keypad wymaga dostępu do fizycznych pinów mikrokontrolera, a tu ich nie ma.

Oczywiście, można na podstawie kodu obu bibliotek stworzyć trzecią - ale przecież ktoś już to dawno zrobił (link w poprzednim poście).

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.