Arduino เป็น USB HID


25

เป็นไปได้ไหมที่จะสร้างอุปกรณ์ HID (เช่นแป้นพิมพ์) โดยใช้ Arduino uno

ในขณะนั้นฉันมีปุ่มอินพุตที่ Arduino ให้เอาท์พุทบนสายอนุกรม ดังนั้นฉันจะแปลงเฟิร์มแวร์ปัจจุบันของฉันเป็นสิ่งที่สามารถทำงานเหมือนแป้นพิมพ์ HID ได้อย่างไร

  • ฉันจะเขียนไดรเวอร์อุปกรณ์หน้าต่างใหม่ได้หรือไม่
  • ฉันจะสร้างเลเยอร์ซอฟต์แวร์ที่สามารถใช้ข้อมูลอนุกรมของฉันและให้ windows อ่านเป็นอินพุต HID ได้หรือไม่
  • มีวิธีใดที่ดีกว่าในการบรรลุเป้าหมายนี้หากเป็นไปได้?

1
ฉันอาจจะผิด แต่นี่ไม่ได้เกี่ยวกับ Arduino จริงๆ มันเกี่ยวกับการพัฒนาโปรแกรมควบคุมอุปกรณ์ด้านข้างของ Window
asheeshr

1
คำตอบแรกใน google: mitchtech.net/arduino-usb-hid-keyboard ... แต่คุณไม่ได้ระบุ Arduino ในเลโอนาร์โดมันมีอยู่แล้วภายในและมีไดรเวอร์ที่เหมาะสมอยู่แล้ว (ดูarduino.cc/en/Reference/MouseKeyboard )
FredP

ฉันใช้ Uno แต่ฉันจะดูสิ่งที่คุณโพสต์เพราะครั้งล่าสุดที่เราพิจารณาการอัปเดต DFU แต่เรากลัวการก่ออิฐเพราะส่วนประกอบไม่พร้อมใช้งานและราคาถูกในพื้นที่ของฉันมากที่สุด สถานที่
ความผิดปกติ

3
@AsheeshR ปัญหานี้อยู่ใน meta ทันที: meta.arduino.stackexchange.com/q/102/46
Ricardo

1
เป็นไปได้อย่างแน่นอนเนื่องจาก Arduino Uno มี Atmega16u2 เป็นชิปไดรเวอร์ USB ผู้ใช้สามารถใช้ DFU หรือ ICSP กระพริบเพื่อผลักอุปกรณ์บนเฟิร์มแวร์ใกล้กับเลโอนาร์โดซึ่งจะทำให้ Arduino ทำงานเป็นคีย์บอร์ด HID ไม่มีการพัฒนา windows ที่เกี่ยวข้องไม่มีไดรเวอร์ที่จะสร้างขึ้นเป็นอุปกรณ์ USB / HID ได้รับการยอมรับตามค่าเริ่มต้น เช่นคำถามนั้นควรเปิดใหม่
zmo

คำตอบ:


14

เป็นไปได้ไหมที่จะสร้างอุปกรณ์ HID (เช่นแป้นพิมพ์) โดยใช้ Arduino uno

ใช่แล้ว! และมีบทช่วยสอนที่ดีเกี่ยวกับวิธีการทำเช่นนั้นที่นี่

ในขณะนั้นฉันมีปุ่มอินพุตที่ Arduino ให้เอาท์พุทบนสายอนุกรม ดังนั้นฉันจะแปลงเฟิร์มแวร์ปัจจุบันของฉันเป็นสิ่งที่สามารถทำงานเหมือนแป้นพิมพ์ HID ได้อย่างไร

ในขณะที่บทช่วยสอนแสดงให้คุณเห็นคุณต้องเปลี่ยนรหัสเฟิร์มแวร์ของคุณดังนั้นแทนที่จะพิมพ์เหตุการณ์ สิ่งที่คุณต้องทำคือเพิ่มรหัสของคุณ:

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

สิ่งที่คุณทำที่นี่คือส่งจากกิจกรรมไมโครคอนโทรลเลอร์ Arduino หลักของคุณผ่านสายอนุกรมไปยังไมโครคอนโทรลเลอร์ขนาดเล็กกว่าที่จัดการการสื่อสาร USB ไมโครคอนโทรลเลอร์นั้นจะใช้คีย์ "บัฟเฟอร์" เหล่านั้นและถ่ายโอนเป็นแป้น USB HID Keyboard กดผ่าน USB

ระวังว่าตัวอักษรสำคัญ ( chrในรหัสที่นี่) เป็นรหัสที่ส่งผ่าน USB ที่ได้รับการตีความโดยไดรเวอร์ USB HID ของคุณซึ่งจะแปลเป็นอักขระจริงโดยใช้เค้าโครงปัจจุบันที่คุณตั้งค่าแป้นพิมพ์ของคุณ

modตัวละครที่เป็นหนึ่งในคีย์ตัวปรับแต่งที่คุณมีในแป้นพิมพ์ (กะ Control, Alt ... ), 0x00เป็นตัวปรับแต่งไม่มี

  • ฉันจะเขียนไดรเวอร์อุปกรณ์หน้าต่างใหม่ได้หรือไม่

ไม่คุณไม่ต้องการ! ด้วยการอัปเกรด DFU หน้าต่างของคุณจะถูกมองว่าเป็นแป้นพิมพ์ USB จากหน้าต่าง arduino

  • ฉันจะสร้างเลเยอร์ซอฟต์แวร์ที่สามารถใช้ข้อมูลอนุกรมของฉันและให้ windows อ่านเป็นอินพุต HID ได้หรือไม่

คุณไม่จำเป็นต้องทำเช่นนั้นและจริง ๆ แล้วมันเป็นความคิดที่แย่มากด้วยเหตุผลหลายประการ:

  • โซลูชันของคุณจะไม่สามารถพกพาได้ดังนั้นคุณต้องแฮ็คบางอย่างสำหรับทุกแพลตฟอร์มที่คุณใช้
  • วิธีการแก้ปัญหาของคุณจะหมายถึงรหัสใหม่จำนวนมาก ยิ่งเขียนโค้ดได้มากเท่าไหร่ก็ยิ่งมีข้อบกพร่องมากขึ้นในระบบของคุณ
  • วิธีการแก้ปัญหาของคุณจะแฮ็คจริงๆเพราะมันจะทำหน้าที่เป็นไดรเวอร์อุปกรณ์ (เช่นเคอร์เนลที่ดิน ) รับข้อมูลจากโปรแกรมผู้ใช้ (เช่นผู้ใช้ที่ดิน ) และมีแนวโน้มที่จะไม่ทำงานเป็นนรกที่จะดีบั๊กและมีแนวโน้มสำหรับปัญหาด้านความปลอดภัย .. ถ้าเป็นไปได้ที่จะทำ!

ฉันใช้ Uno แต่ฉันจะดูสิ่งที่คุณโพสต์เพราะครั้งล่าสุดที่เราพิจารณาการอัปเดต DFU แต่เรากลัวสิ่งที่ก่ออิฐ

ในที่สุดคุณก็มีความกังวลเกี่ยวกับการปิดกั้น aarduino ของคุณ โปรดเชื่อฉันและผู้เขียนของบทความที่คุณไม่สามารถอิฐของคุณ Arduino ทำเฟิร์มแวร์แฟลช:

หมายเหตุ: ไม่มีโอกาสที่ 'การก่ออิฐ' กับอุปกรณ์โดยใช้วิธีนี้ เฟิร์มแวร์ bootloader Arduino สามารถอัปเดตได้ตลอดเวลาโดยใช้โปรโตคอล DFU!

ในกรณีที่มีบางอย่างผิดพลาดมากและคุณได้รับความเสียหายจาก bootloader ใน AVR ตัวเล็ก ๆ (atmega8u2) คุณยังสามารถ reflash โดยใช้ arduino อื่นหรือ โปรแกรมเมอร์ atmelโดยใช้ 6 พินถัดจากปลั๊ก USB

ในท้ายที่สุดรู้ว่าวิธีเดียวที่จะสร้าง AVR แบบ AVR ได้เช่นกันคือการเล่นกับฟิวส์และรีเซ็ตฟิวส์แบบโปรแกรม และถึงตอนนั้นคุณอาจใช้ HVSPเพื่อบันทึกอุปกรณ์ของคุณแม้ว่ามันจะเป็นปัญหาน้อยกว่าที่จะเพียงแค่ใช้ชิปใหม่


1
ขอบคุณสำหรับข้อมูลที่มีประโยชน์ทั้งหมดเราได้รับสิ่งนี้
Anomaly

วิธีที่เหมาะสมในการก่ออิฐ AVR คือด้วยแรงดันกระแสเกิน / เกิน จากนั้นมันจะถูกปิ้งใหม่ ...
2973

แต่มันไม่ได้เรียกว่าการก่ออิฐ แต่เป็นการทอดหรือตามที่คุณพูดว่าปิ้ง ใส่ 15amps ผ่าน MCU และฉันคิดว่าคุณจะเห็นมันกระโดดผ่านห้อง ;-)
zmo

จะปล่อยคีย์เฉพาะได้อย่างไร ฉันต้องการเลียนแบบปุ่ม HOLD แล้วปล่อย และในลิงค์ตัวละครจะไปยังอาร์เรย์ [2] ในขณะที่นี่ไปที่ [1] ทำไม?
5argon

ดีดังที่แสดงในตัวอย่างของฉันคุณทำมันในสองขั้นตอนแรกคุณกดปุ่มแล้วมีความล่าช้าจากนั้นคุณปล่อยมัน ถ้าอย่างนั้นคุณต้องบรรยายด้วยตัวคุณเองเกี่ยวกับการใช้งานคีย์บอร์ดของฮาร์ดแวร์มันไม่ได้เป็นธรรมชาติเลยและคุณค่าแต่ละอย่างของอาร์เรย์มีความหมาย ให้อภัยฉันที่ไม่มีลิงก์เพื่อแชร์ ATM แต่เมื่อใดก็ตามที่คุณพบสิ่งที่ค้นหาบนเว็บโปรดโพสต์
คอมเม้น

6

ฉันสร้างโครงการที่แทนที่ Arduino Bootloader อย่างสมบูรณ์ คุณสามารถอัปโหลดภาพร่างและใช้เป็น HID ดู Project HID บน Github: https://github.com/NicoHood/HID


4
ยินดีต้อนรับสู่ Arduino SE! คุณช่วยเพิ่มเล็กน้อยเกี่ยวกับวิธีการใช้ห้องสมุดของคุณได้ไหม? ขอบคุณ!
เพนกวินที่ไม่เปิดเผยตัว

2
อ่าน readme และลองตัวอย่าง? มันอยู่ที่นั่นทั้งหมดไม่จำเป็นต้องดักจับทุกอย่างที่นี่ ทุกอย่างใน Github เป็นรุ่นล่าสุดแล้ว :)

ขออภัยเพื่อน ๆ ดูเหมือนห้องสมุดดีๆ แต่เอกสารของคุณขาดไปอย่างบ้าคลั่ง ไม่มีคำแนะนำในการติดตั้งจริงเท่าที่ฉันสามารถบอกได้และหัวข้อทั้งหมดในวิกิของคุณก็พูดว่า "TODO" (โดยเฉพาะหัวข้อ gamepad ว่างเปล่าอย่างนี้) : - /
BrainSlugs83

1
อันที่จริงมีความจำเป็นต้องนำเสนอคำอธิบายพื้นฐานที่นี่: คำตอบจะต้องมีความหมายแม้ไม่มีลิงค์ภายนอกซึ่งอาจตาย และอันนี้ก็ไม่ได้
Chris Stratton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.