Arduino sebagai USB HID

25

Apakah mungkin untuk membangun perangkat HID (seperti keyboard) menggunakan Arduino uno?

Saat ini, saya memiliki input tombol pada Arduino yang memberikan output pada baris serial. Jadi, bagaimana saya bisa mengubah firmware saya saat ini menjadi sesuatu yang dapat berperilaku seperti keyboard HID?

  • Haruskah saya menulis driver perangkat jendela baru?
  • Haruskah saya membuat lapisan perangkat lunak yang dapat mengambil data serial saya dan meminta windows membacanya sebagai input HID?
  • Apakah ada cara yang lebih baik untuk mencapai ini, jika memungkinkan?
Anomali
sumber
1
Saya mungkin salah, tetapi ini bukan tentang Arduino. Ini tentang pengembangan driver perangkat sisi Window.
asheeshr
1
Jawaban pertama di google: mitchtech.net/arduino-usb-hid-keyboard ... tetapi Anda tidak menentukan Arduino yang mana. Pada Leonardo, itu bawaan, dan driver yang sesuai sudah ada (lihat arduino.cc/en/Reference/MouseKeyboard ).
FredP
Saya menggunakan Uno, tetapi saya akan melihat apa yang Anda poskan karena terakhir kali kami mempertimbangkan pembaruan DFU, tetapi kami agak takut membuat masalah karena komponennya tidak tersedia dan murah di daerah saya seperti di sebagian besar tempat
Anomali
3
@AsheeshR Masalah ini ada di meta sekarang: meta.arduino.stackexchange.com/q/102/46
Ricardo
1
Yah, itu pasti mungkin, karena Arduino Uno fitur Atmega16u2 sebagai chip driver USB, pengguna dapat menggunakan baik DFU atau ICSP berkedip untuk mendorong perangkat mendekati firmware leonardo yang akan membuat Arduino berperilaku sebagai keyboard HID. Tidak ada pengembangan windows yang terlibat, tidak ada driver yang dibangun karena perangkat USB / HID diakui per default. yaitu pertanyaan itu harus dibuka kembali.
zmo

Jawaban:

14

Apakah mungkin untuk membangun perangkat HID (seperti keyboard) menggunakan Arduino uno?

ya itu! Dan ada tutorial yang bagus tentang bagaimana melakukannya di sini

Saat ini, saya memiliki input tombol pada Arduino yang memberikan output pada baris serial. Jadi, bagaimana saya bisa mengubah firmware saya saat ini menjadi sesuatu yang dapat berperilaku seperti keyboard HID?

Seperti yang ditunjukkan oleh tutorial, Anda perlu mengubah kode firmware sehingga alih-alih mencetak acara, Anda malah memicu peristiwa. Yang perlu Anda lakukan, adalah menambahkan kode Anda:

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

Apa yang Anda lakukan di sini, adalah mengirim dari peristiwa mikrokontroler Arduino utama Anda melalui saluran serial ke mikrokontroler yang lebih kecil yang menangani komunikasi USB. Mikrokontroler itu akan mengambil "buffer" kunci itu dan mentransfernya saat tombol Keyboard HID USB ditekan melalui USB.

Hati-hati dengan karakter kunci ( chrdalam kode di sini), sebenarnya kode kunci yang dikirim melalui USB yang ditafsirkan oleh driver USB HID Anda, yang kemudian menerjemahkannya menjadi karakter nyata menggunakan tata letak saat ini yang telah Anda siapkan untuk keyboard Anda.

The modkarakter salah satu kunci pengubah Anda miliki di keyboard (shift, kontrol, alt ...), 0x00yang tidak ada modifier.

  • Haruskah saya menulis driver perangkat jendela baru?

Tidak, kamu tidak perlu! Dengan pemutakhiran DFU, arduino Anda akan dianggap sebagai keyboard USB oleh windows.

  • Haruskah saya membuat lapisan perangkat lunak yang dapat mengambil data serial saya dan meminta windows membacanya sebagai input HID?

Anda tidak perlu melakukan itu, dan itu sebenarnya ide yang sangat buruk karena berbagai alasan:

  • solusi Anda tidak akan portabel, dan karenanya Anda perlu meretas sesuatu untuk setiap platform yang Anda gunakan,
  • solusi Anda akan menyiratkan banyak kode baru; semakin banyak kode yang ditulis, semakin banyak bug yang mungkin ada di sistem Anda,
  • solusi Anda akan benar-benar retas, karena akan berperilaku sebagai driver perangkat (yaitu lahan kernel ) mengambil input dari program pengguna (yaitu tanah pengguna ) dan cenderung tidak berfungsi, menjadi neraka untuk di-debug, dan cenderung untuk masalah keamanan. .. Jika itu bahkan mungkin dilakukan!

Saya menggunakan Uno, tetapi saya akan melihat apa yang Anda poskan karena terakhir kali kami mempertimbangkan pembaruan DFU tetapi kami agak takut dengan hal-hal yang membingungkan

Akhirnya, Anda memiliki masalah, dalam komentar, tentang melapisi arduino Anda. Tolong percayalah kepada saya dan penulis artikel bahwa Anda tidak dapat menghapus arduino Anda dengan melakukan flash firmware:

CATATAN: Tidak ada kemungkinan 'bricking' perangkat menggunakan metode ini. Firmware bootloader Arduino selalu dapat diperbarui menggunakan protokol DFU!

Seandainya ada sesuatu yang sangat salah, dan Anda mendapatkan bootloader rusak di AVR kecil (atmega8u2), Anda masih dapat mem-reflash-nya menggunakan arduino lain atau pemrogram atmel menggunakan 6 pin di sebelah colokan USB.

Pada akhirnya, ketahuilah bahwa satu - satunya cara untuk memblokir AVR, demikian juga Arduino, adalah dengan bermain dengan sekering dan mengatur ulang sekering pemrograman. Dan bahkan kemudian, Anda dapat menggunakan HVSP untuk menyimpan perangkat Anda, meskipun seringkali lebih sulit untuk mengambil chip baru.

zmo
sumber
1
Terima kasih atas semua informasi yang bermanfaat, kami akhirnya mencapai ini.
Anomaly
Nah, cara yang tepat untuk memasang AVR adalah dengan tegangan berlebih / berlebih. Maka akan dipanggang ...
user2973
Tapi kemudian, itu tidak disebut bricking, tetapi menggorengnya, atau seperti yang Anda katakan memanggangnya. Letakkan 15amp melalui MCU, dan saya yakin Anda akan melihatnya melompat melalui ruangan ;-)
zmo
Bagaimana cara melepaskan kunci tertentu? Saya ingin meniru kunci TAHAN kemudian lepaskan. Dan juga di tautan, karakter menuju ke array [2] sementara di sini pergi ke [1]. Mengapa?
5argon
baik, seperti yang ditunjukkan dalam contoh saya, Anda melakukannya dalam dua langkah, pertama Anda menekan tombol, lalu ada penundaan, kemudian Anda lepaskan. Nah, maka Anda harus memberi kuliah diri sendiri tentang bagaimana implementasi keyboard hardware bekerja, itu agak tidak alami, dan setiap nilai array memiliki arti. Maafkan saya karena tidak memiliki tautan untuk membagikan atm, tetapi setiap kali Anda menemukan sesuatu mencari di web, silakan kirim komentar baru ☺
zmo
6

Saya membuat proyek yang sepenuhnya menggantikan Arduino Bootloader. Anda dapat mengunggah sketsa dan menggunakannya sebagai HID. Lihat HID Proyek di Github: https://github.com/NicoHood/HID


sumber
4
Selamat Datang di Arduino SE! Bisakah Anda menambahkan sedikit tentang cara menggunakan perpustakaan Anda? Terima kasih!
Penguin Anonim
2
Baca readme dan coba contohnya? Semuanya ada di sana, tidak perlu menipu semuanya di sini. Semua yang ada di Github adalah yang terbaru :)
Maaf kawan, sepertinya perpustakaan keren, tapi dokumentasi Anda kurang gila. Tidak ada instruksi instalasi yang sebenarnya sejauh yang saya tahu, dan seluruh topik di wiki Anda hanya mengatakan "TODO" (khususnya topik gamepad benar-benar kosong seperti ini). : - /
BrainSlugs83
1
Sebenarnya ada kebutuhan untuk menyajikan deskripsi dasar di sini: jawaban diperlukan untuk menjadi bermakna bahkan tanpa tautan eksternal, yang bisa mati. Dan yang ini tidak.
Chris Stratton