qro9qs Napisano Styczeń 27, 2020 Udostępnij Napisano Styczeń 27, 2020 Posiadam aktualnie układ pracujący z klawiaturą membranową 4x4. Działa poprawnie Naszła mnie chęć wymiany jej na klawiaturę numeryczną USB. Czy da się to zrealizować w arduino po tych 4 przewodach? Ktoś ma to już za sobą bądź jest mi w stanie pomóc? Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Styczeń 27, 2020 Udostępnij Styczeń 27, 2020 To zależy jakie Arduino masz. Na przykład Arduino Zero chodzi na SAMD21, które potrafi obsługiwać USB Host, i dla którego są przykłady obsługi klawiatury USB. Z UNO się nie da. 1 Cytuj Link do komentarza Share on other sites More sharing options...
qro9qs Styczeń 27, 2020 Autor tematu Udostępnij Styczeń 27, 2020 Pracuję na Arduino Mega Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Styczeń 27, 2020 Udostępnij Styczeń 27, 2020 (edytowany) ATmega2560 nie ma obsługi USB. Istnieje co prawda coś takiego: https://store.arduino.cc/arduino-usb-host-shield ale sam nigdy nie używałem. Edytowano Styczeń 27, 2020 przez deshipu 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
qro9qs Styczeń 27, 2020 Autor tematu Udostępnij Styczeń 27, 2020 Świetnie, dziękuję. Myślę, że to pomoże. Czy wiesz może, czy piny cyfrowe 2-13 są w dalszym ciągu do użytku (na górze płytki są wyprowadzenia) czy są już one wykorzystywane przez ten układ? Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Styczeń 28, 2020 Udostępnij Styczeń 28, 2020 W zakładce "documentation" masz podlinkowany schemat — sprawdź sobie które piny są podłączone. Cytuj Link do komentarza Share on other sites More sharing options...
Harnas Styczeń 28, 2020 Udostępnij Styczeń 28, 2020 Jeżeli nie potrzebujesz mocno urządzeń peryferyjnych atmegi, czyli real-time, liczników, SPI, może I2C, to polecam przejście na jakieś raspberry pi. Nawet wersję 1, która kosztuje teraz pewnie mniej niż schield USB do Arduino. 1 Cytuj Link do komentarza Share on other sites More sharing options...
qro9qs Styczeń 29, 2020 Autor tematu Udostępnij Styczeń 29, 2020 (edytowany) #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) { Serial.print("UP "); PrintKey(mod, key); } void KbdRptParser::OnKeyPressed(uint8_t key) { Serial.print("ASCII: "); Serial.println((char)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); pinMode(2, OUTPUT); } void loop() { Usb.Task(); digitalWrite(2, LOW); switch(???????????){ case '?????????': digitalWrite(2, HIGH); break; } } Załadowałem taki kod, odczytuje poprzez host USB z klawiatury numerycznej. Przykładowo na zdjęciu odczytane kolejno klawisze ,,Num Lock", ,,7", ,,4", ,,1", ,,0". Chcę odwołać się do tego za pomocą switcha, aby klikając np. przycisk ,,Num Lock" na PIN 2 podawany był stan wysoki. W jaki sposób odnieść się do tego? Co zawrzeć zamiast znaków zapytania w ostatnich liniach kodu? Edytowano Styczeń 29, 2020 przez qro9qs Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Styczeń 30, 2020 Udostępnij Styczeń 30, 2020 @qro9qs możesz np. umieścić tego switcha w funkcji OnKeyUp i wtedy wykorzystujesz zmienną 'key', a w poszczególnych case'ach wpisujesz to co masz na podglądzie w monitorze portu szeregowego 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
qro9qs Styczeń 30, 2020 Autor tematu Udostępnij Styczeń 30, 2020 W ten sposób nie działa, chyba, że coś zapisałem źle? void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key) { pinMode(2, OUTPUT); Serial.print("UP "); PrintKey(mod, key); switch(key){ case '53': digitalWrite(2, HIGH); break; } } Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Styczeń 30, 2020 Udostępnij Styczeń 30, 2020 @qro9qs wpisz 53 jako liczbę, czyli bez apostrofów 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
qro9qs Styczeń 30, 2020 Autor tematu Udostępnij Styczeń 30, 2020 Również nie działa, poza tym kolejny przycisk to 5F a tutaj wyskakuje błąd jeśli niema apostrofów. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Styczeń 30, 2020 Udostępnij Styczeń 30, 2020 Aha... to tak będziemy teraz strzelać. Proponuję 0x53 i 0x5f - wygrałem misia? Cytuj Link do komentarza Share on other sites More sharing options...
qro9qs Styczeń 31, 2020 Autor tematu Udostępnij Styczeń 31, 2020 Niestety żaden z proponowanych pomysłów nie pracuje. Zapytam raz jeszcze....gdzie powinienem umieścić w głownym kodzie switcha oraz w jaki sposób zadeklarować go? Switch po keyu i case z liczbami jak np. '53' lub '5F' nie działa. Switch: pinMode(2, OUTPUT); pinMode(3, OUTPUT); switch(????){ case 'klawisz oznaczony jako 53': digitalWrite(2, HIGH), digitalWrite(3, LOW);break; case 'klawisz oznaczony jako 5F': digitalWrite(2, LOW), digitalWrite(3, HIGH);break; } Główny 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) { Serial.print("UP "); PrintKey(mod, key); } 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(); } Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Luty 1, 2020 Udostępnij Luty 1, 2020 7 godzin temu, qro9qs napisał: Zapytam raz jeszcze....gdzie powinienem umieścić w głownym kodzie switcha oraz w jaki sposób zadeklarować go? Switch po keyu i case z liczbami jak np. '53' lub '5F' nie działa. @qro9qs czy testowałeś zapis zgodny z sugestią @ethanak tzn. z przedrostkiem 0x (bo to są liczby zapisane w systemie szesnastkowym)? Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!