Arduino jako USB HID

25

Czy możliwe jest zbudowanie urządzenia HID (takiego jak klawiatura) przy użyciu Arduino Uno?

Na razie mam wejścia na Arduino, które dają wyjścia na linii szeregowej. Jak mogę przekształcić moje obecne oprogramowanie w coś, co może zachowywać się jak klawiatura HID?

  • Czy mam napisać nowy sterownik urządzenia z oknem?
  • Czy mam utworzyć warstwę oprogramowania, która mogłaby pobierać moje dane szeregowe i pozwolić Windowsowi odczytać je jako dane wejściowe HID?
  • Czy istnieje lepszy sposób na osiągnięcie tego, jeśli jest to w ogóle możliwe?
Anomalia
źródło
1
Mogę się mylić, ale tak naprawdę nie chodzi o Arduino. Chodzi o opracowanie sterowników urządzeń po stronie systemu Windows.
asheeshr
1
Pierwsza odpowiedź w google: mitchtech.net/arduino-usb-hid-keyboard ... ale nie określiłeś, które Arduino. W Leonardo jest on wbudowany, a odpowiedni sterownik już istnieje (patrz arduino.cc/en/Reference/MouseKeyboard ).
FredP
Używam Uno, ale przyjrzę się temu, co opublikowałeś, ponieważ ostatnim razem rozważaliśmy aktualizację DFU, ale trochę boimy się cegiełek, ponieważ komponenty nie są tak łatwo dostępne i tanie w mojej okolicy, jak w większości miejsca.
Anomalia
3
@AsheeshR Ten problem jest już dostępny w meta: meta.arduino.stackexchange.com/q/102/46
Ricardo
1
Cóż, jest to zdecydowanie możliwe, ponieważ Arduino Uno ma układ sterownika Atmega16u2 jako USB, użytkownik może użyć flashowania DFU lub ICSP, aby wypchnąć na urządzenie oprogramowanie układowe zbliżone do Leonarda, co sprawi, że Arduino zachowa się jak klawiatura HID. Nie wymaga programowania systemu Windows, nie ma potrzeby budowania sterownika, ponieważ urządzenia USB / HID są domyślnie rozpoznawane. tj. pytanie to należy ponownie otworzyć.
zmo

Odpowiedzi:

14

Czy możliwe jest zbudowanie urządzenia HID (takiego jak klawiatura) przy użyciu Arduino Uno?

Tak to jest! I jest to świetny tutorial jak to zrobić nad tutaj

Na razie mam wejścia na Arduino, które dają wyjścia na linii szeregowej. Jak mogę przekształcić moje obecne oprogramowanie w coś, co może zachowywać się jak klawiatura HID?

Jak pokazuje samouczek, musisz przekształcić kod oprogramowania układowego, więc zamiast drukować zdarzenia, tak naprawdę je wywołujesz. Co musisz zrobić, to dodać do kodu:

void triggerKey(uint8_t mod, uint8_t chr) {
    uint8_t buf[8] = {mod, chr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    // press key
    Serial.write(buf, 8);
    // emulate key press delay
    delay(10);
    buf[1] = 0x00;
    // release key
    Serial.write(buf, 8);
}

To, co tu robisz, to wysyłanie z głównych zdarzeń mikrokontrolera Arduino przez linię szeregową do mniejszego mikrokontrolera, który obsługuje komunikację USB. Ten mikrokontroler weźmie te „bufory” klawiszy i przeniesie je w miarę naciskania klawiszy USB HID na USB.

Uważaj, że kluczowy znak (tutaj chrw kodzie) to tak naprawdę kod klucza wysyłany przez USB, który jest interpretowany przez sterownik USB HID, który następnie przekształca go w prawdziwy znak przy użyciu bieżącego układu skonfigurowanego dla klawiatury.

Ta modpostać jest jednym z klawiszy modyfikujących, które masz na klawiaturze (Shift, Control, Alt ...), 0x00ponieważ nie jest modyfikatorem.

  • Czy mam napisać nowy sterownik urządzenia z oknem?

Nie, nie potrzebujesz! Dzięki aktualizacji DFU Twój arduino będzie widoczny w systemie Windows jako klawiatura USB.

  • Czy mam utworzyć warstwę oprogramowania, która mogłaby pobierać moje dane szeregowe i pozwolić Windowsowi odczytać je jako dane wejściowe HID?

Nie musisz tego robić, a to z wielu powodów bardzo zły pomysł:

  • Twoje rozwiązanie nie byłoby przenośne, dlatego musisz zhakować coś dla każdej platformy, z której możesz skorzystać,
  • twoje rozwiązanie oznaczałoby dużo nowego kodu; im więcej kodu napiszesz, tym więcej błędów może się pojawić w twoim systemie,
  • Twoje rozwiązanie byłoby naprawdę hackerskie, ponieważ zachowywałoby się jak sterownik urządzenia (tj. ziemia jądra ) pobierająca dane wejściowe z programu użytkownika (tj. ziemia użytkownika ) i prawdopodobnie nie działa, może być piekłem do debugowania i podatne na problemy związane z bezpieczeństwem. .. Jeśli to w ogóle możliwe!

Używam Uno, ale przyjrzę się temu, co opublikowałeś, ponieważ ostatnim razem, gdy rozważaliśmy aktualizację DFU, ale trochę boimy się cegiełek

W końcu masz obawy, w komentarzu, o zburzeniu twojego arduino. Uwierzcie mi i autorowi artykułu, że nie da się arduino zbudować flashowania oprogramowania układowego:

UWAGA: Nie ma możliwości „zamurowania” urządzenia przy użyciu tej metody. Oprogramowanie rozruchowe Arduino można zawsze zaktualizować przy użyciu protokołu DFU!

W przypadku, gdy coś naprawdę źle się dzieje, a w AVR (atmega8u2) pojawia się uszkodzenie bootloadera, nadal możesz go przeflashować za pomocą innego arduino lub programatora atmel za pomocą 6 pinów obok wtyczki USB.

Na koniec wiedz, że jedynym sposobem na zmontowanie AVR, a więc także Arduino, jest granie bezpiecznikami i resetowanie bezpieczników programujących. I nawet wtedy możesz użyć HVSP, aby zapisać swoje urządzenie, choć często mniejszym problemem jest po prostu wzięcie nowego układu.

zmo
źródło
1
Dzięki za wszystkie przydatne informacje, udało nam się to osiągnąć.
Anomalia
Cóż, właściwym sposobem na zmontowanie AVR jest przetężenie / przepięcie. Potem będzie opiekany ...
user2973
Ale nie nazywa się to „cegłaniem”, ale smażeniem lub opiekaniem. Przełóż 15 amperów przez MCU, i założę się, że zobaczysz, jak przeskakuje przez pokój ;-)
zmo
Jak zwolnić określony klucz? Chcę emulować klawisz HOLD, a następnie zwolnić. A także w łączu postać idzie do tablicy [2], podczas gdy tutaj idzie do [1]. Czemu?
5argon
cóż, jak pokazano w moim przykładzie, robisz to w dwóch krokach, najpierw naciskasz klawisz, potem jest opóźnienie, a potem go zwalniasz. Cóż, wtedy powinieneś nauczyć się, jak działa implementacja klawiatury sprzętowej, jest to trochę naturalne, a każda wartość tablicy ma znaczenie. Proszę mi wybaczyć, że nie mam linku do udostępniania bankomatu, ale za każdym razem, gdy znajdziecie coś, co przeszukuje sieć, proszę dodać nowy komentarz ☺
zmo
6

Stworzyłem projekt, który całkowicie zastępuje Arduino Bootloader. Możesz przesyłać szkice i używać go jako HID. Zobacz Project HID na Github: https://github.com/NicoHood/HID


źródło
4
Witamy w Arduino SE! Czy możesz dodać coś o tym, jak korzystać z biblioteki? Dzięki!
Anonimowy pingwin
2
Przeczytaj plik readme i spróbuj przykładów? Wszystko tam jest, nie trzeba tutaj wszystkiego oszukiwać. Wszystko na Githubie jest aktualne :)
Przepraszam stary, wygląda na fajną bibliotekę, ale brakuje ci dokumentacji. O ile mi wiadomo, nie ma prawdziwych instrukcji instalacji, a całe tematy na twojej wiki mówią po prostu „DO ZROBIENIA” (w szczególności temat gamepad jest zupełnie pusty). : - /
BrainSlugs83
1
W rzeczywistości istnieje potrzeba przedstawienia tutaj podstawowego opisu: odpowiedzi muszą być znaczące nawet bez zewnętrznego linku, który mógłby umrzeć. A ten nie jest.
Chris Stratton