USB HIDとしてのArduino


25

Arduino Unoを使用してHIDデバイス(キーボードなど)を構築することは可能ですか?

現時点では、Arduinoにボタン入力があり、シリアルラインに出力があります。では、現在のファームウェアをHIDキーボードのように動作するものに変換するにはどうすればよいですか?

  • 新しいウィンドウデバイスドライバを作成しますか?
  • シリアルデータを取得し、WindowsにHID入力として読み取らせるソフトウェアレイヤーを作成しますか?
  • 可能であれば、これを達成するためのより良い方法はありますか?

1
私は間違っているかもしれませんが、これは本当にArduinoについてではありません。そのウィンドウのサイドデバイスドライバー開発について。
asheeshr

1
グーグルで最初の答え:mitchtech.net/arduino-usb-hid-keyboard ...しかし、あなたはどのArduinoを指定しなかった。Leonardoには組み込みであり、適切なドライバーが既に存在します(arduino.cc/en/Reference/MouseKeyboardを参照)。
FredP

私はUnoを使用していますが、前回DFUの更新を検討したため、投稿した内容を確認しますが、ほとんどの場合と同様に、コンポーネントは私の地域では容易に入手できず、安価ではないため、レンガのようなものが怖いです場所。
アノマリー

3
@AsheeshRこの問題はメタになりました:meta.arduino.stackexchange.com/q/102/46
リカルド

1
Arduino UnoにはUSBドライバーチップとしてAtmega16u2が搭載されているため、ユーザーはDFUまたはICSPフラッシュのいずれかを使用して、ArduinoをHIDキーボードとして動作させるレオナルドに近いファームウェアをデバイスにプッシュできます。関係するWindows開発はなく、USB / HIDデバイスがデフォルトで認識されるため、ビルドするドライバーはありません。すなわち、その質問は再び開かれるべきです。
zmo

回答:


14

Arduino Unoを使用してHIDデバイス(キーボードなど)を構築することは可能ですか?

はい、そうです!そして、それを行う方法についての素晴らしいチュートリアルがここにあります

現時点では、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キーボードキーがUSBを介して押すと転送します。

キーキャラクター(chrここのコード内)は、実際にはUSB経由で送信されるキーコードであり、USB HIDドライバーによって解釈され、キーボード用に設定した現在のレイアウトを使用して実際のキャラクターに変換されます。

このmod文字は、キーボードにある修飾キー(shift、control、alt ...)の1つであり、修飾キーで0x00はありません。

  • 新しいウィンドウデバイスドライバを作成しますか?

いいえ、必要ありません!DFUのアップグレードにより、arduinoはWindowsからUSBキーボードとして認識されます。

  • シリアルデータを取得し、WindowsにHID入力として読み取らせるソフトウェアレイヤーを作成しますか?

あなたもそれをする必要はなく、実際には多くの理由で非常に悪い考えです:

  • ソリューションは移植性がないため、使用するすべてのプラットフォームで何かをハッキングする必要があります。
  • あなたのソリューションは、多くの新しいコードを暗示します。より多くのコードを記述すればするほど、システムにバグが増える可能性があります。
  • あなたの解決策は、デバイスプログラム(つまりカーネル土地)としてユーザープログラム(つまりユーザー土地)から入力を取得するように振る舞い、機能しない可能性が高く、デバッグするために地獄になり、セキュリティの問題を起こしやすいため、本当にハックです。 ..それが可能な場合でも!

私はUnoを使用していますが、前回DFUの更新を検討したので、投稿されたものを見ていきます。

最後に、コメントで、あなたのarduinoをブロックすることに懸念を持っています。私との作者と信じてください記事あなたがいることはできませんレンガあなたのArduinoのファームウェアのフラッシュをやりました:

注:この方法を使用してデバイスを「ブリック」することはできません。Arduinoブートローダーファームウェアは、DFUプロトコルを使用していつでも更新できます!

何かが本当にひどく間違って、小さなAVR(atmega8u2)でブートローダーが破損した場合でも、USBプラグの隣の6ピンを使用して、別のarduinoまたは atmelプログラマーを使用して再フラッシュできます。

最後に、AVR、つまりArduinoをブリックする唯一の方法は、ヒューズで遊んでプログラミングヒューズをリセットすることです。さらに、HVSPを使用してデバイスを保存することも できますが、新しいチップを使用するだけで問題は少なくなります。


1
すべての有用な情報をありがとう、私たちはこれを達成することになりました。
アノマリー14年

さて、AVRをブリックする適切な方法は、過電流/過電圧を使用することです。そして、それはトーストされます...
user2973

しかし、その後、それはブリックと呼ばれていませんが、それを揚げるか、あなたが言うようにトーストします。MCUに15アンペアを入れると、部屋を飛び越えていくのがわかると思います
;

特定のキーをリリースする方法は?キーHOLDをエミュレートしてから離したい。また、リンクでは、文字は配列[2]に移動し、ここでは[1]に移動します。どうして?
5argon

さて、私の例に示すように、2つのステップでそれを行います。最初にキーを押し、次に遅延があり、それからリリースします。それでは、ハードウェアキーボードの実装がどのように機能するかについて、自分で講義する必要があります。これは自然なことではなく、配列の各値には意味があります。
ATM

6

Arduino Bootloaderを完全に置き換えるプロジェクトを作成しました。スケッチをアップロードして、HIDとして使用できます。GithubのProject HIDを参照してください:https : //github.com/NicoHood/HID


4
Arduino SEへようこそ!ライブラリの使用方法について少し追加していただけますか?ありがとう!
匿名のペンギン14

2
READMEを読んで、例を試してみませんか?そのすべて、ここですべてを欺く必要はありません。Githubのすべてが最新です:)

すみません、クールなライブラリのように見えますが、ドキュメントが不足しています。私が知る限り、実際のインストール手順はなく、wikiのトピック全体が「TODO」とだけ言っています(具体的には、ゲームパッドのトピックはこのように完全に空です)。:-/
BrainSlugs83

1
実際には、基本的な説明をここに提示する必要があります。外部リンクがなくても、答えは意味のあるものである必要があります。そして、これはそうではありません。
クリスストラットン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.