Skocz do zawartości
qro9qs

Klawiatura Numeryczna USB z Arduino Host

Pomocna odpowiedź

Tak próbowałem, również nie wypluwa po zadeklarowaniu case jako case '0x5F': digitalWrite(3, HIGH);

Udostępnij ten post


Link to post
Share on other sites

A po co tam apostrofy? Ma być

case 0x5f: cośtam();

Wygrałem misia?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites
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

Udostępnij ten post


Link to post
Share on other sites

aaaaa, ok

Udostępnij ten post


Link to post
Share on other sites
(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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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);
}

 

Udostępnij ten post


Link to post
Share on other sites
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.

 

Udostępnij ten post


Link to post
Share on other sites

Rozumiem. A nie można ze zwykłej biblioteki Keypad.h oraz PCF8574.h wbić się do tego? 

Udostępnij ten post


Link to post
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).

Udostępnij ten post


Link to post
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!

Gość
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...