Skocz do zawartości

Klawiatura Numeryczna USB z Arduino Host


Pomocna odpowiedź

(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

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
  • 2 tygodnie później...

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);
}

 

7 godzin temu, qro9qs napisał:

w jaki sposób zapisać, że klawiatura działa przez PCF8574, a nie bezpośrednio z Arduino?

Użyć właściwej biblioteki - ja używam Keypad_I2C, ale jest kilka innych.

 

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).

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...