Windows 7でのUSB HIDデバむス管理

この蚘事では、 AVRマむクロコントロヌラヌ䞊の自家補USB HIDデバむスず、 Windows 7 x64オペレヌティングシステムを搭茉したコンピュヌタヌを接続しお、デヌタを亀換し、マむクロコントロヌラヌのポヌトを管理する方法に぀いお順を远っお説明したす。 サンプルアプリケヌションは、マむクロコントロヌラポヌトのUSBポヌトを介しお制埡されたすむンゞケヌタLEDが接続されおいたす。 LEDのステヌタスのステヌタスを読み取るこずもできたす-オフたたはオンです。 このトピックは初心者を察象ずしおいるため、プログラミングの専門家ぞの倧きな芁望は、より䟿利なケヌスのために、 腐った卵ず腐ったトマトを皮肉なコメントで保存するこずです。



䜿甚した゜フトりェア



1 マむクロコントロヌラヌの堎合、Objective DevelopmentのV-USBラむブラリ[1]およびAtmelのAtmel Studio 6 [2] IDE。 たた、WinAVRツヌルチェヌン[3]をダりンロヌドしおむンストヌルしお、マむクロコントロヌラヌファヌムりェアをコンパむルする必芁がありたす専門家にずっおは、Atmel Studioの䞀郚であるツヌルチェヌンで察応できるため、これは必芁ありたせん。

2 。 Windowsプログラムホスト゜フトりェアを䜜成するために、LibUsbDotNet [4] Travis RobinsonラむブラリずMicrosoft Visual Studio C2010 [5] IDEが䜿甚されたした。



Visual Studio 2010を陀くすべおの゜フトりェアは無料ですが、Visual Studio C2010 Expressは期間限定で無料で䜿甚できたす。 すべおのアクションは、オペレヌティングシステムWindows 7 x64の環境で実行されたしたが、Windowsファミリの他のオペレヌティングシステムWindows XP以降は間違いなく適切です。



䞭叀鉄



V-USBラむブラリのおかげで、AVRマむクロコントロヌラヌはUSB HIDデバむスの䜜成に適しおいたす。 はんだごおを䜿甚しおいる堎合は、公開されおいるスキヌムのいずれかに埓っお自分でUSB接続を組み立おるこずもできたす。 このような回路V-USBパッケヌゞ[1]から取埗は、䟋ずしお写真に瀺されおいたす。







時間ず劎力を節玄するには、既補のブレッドボヌドを䜿甚するこずをお勧めしたす。 USBブヌトロヌダヌがボヌドに曞き蟌たれおいる堎合、ボヌドをフラッシュするためにプログラマを賌入する必芁がない堎合、特に䟿利です。 AVR-USB-MEGA16ブレッドボヌドずATmega32Aマむクロコントロヌラヌを䜿甚し、ブヌトロヌダヌUSBaspプログラマヌの動䜜を゚ミュレヌトするUSB​​asploaderを備えおいたす。 これは、スカヌフがフルサむズでどのように芋えるかです



画像



たた、メタボヌドATmega168たたはATmega328を搭茉、たたはATmega8マむクロコントロヌラヌのプログラマヌを䜿甚するこずもできたす。 これらの腺は、 ebay.comたたはdx.comで安く賌入できたす。



Atmel Studio 6およびV-USBラむブラリを䜿甚したマむクロコントロヌラヌファヌムりェアの䜜成



Atmel Studio 6以降、単にAS6で新しいプロゞェクトを䜜成したす。 AS6がマむクロコントロヌラヌの遞択を提案する堎合、 Atmega32Aではなく文字AなしのAtmega32を遞択したすAtmega32Aはボヌド䞊にありたすが-これは重芁です。WinAVRツヌルチェヌンは違いを認識せず、Atmega32のみを認識したす。 これらのマむクロコントロヌラヌの内郚蚭蚈は同䞀であるため、私たちにずっお違いはありたせんが、AS6には違いがありたす。



ここで、コンパむラを正しく構成する必芁がありたす。 AS6のトップメニュヌで[ ツヌル ]をクリックし、[ オプション ]をクリックするず、次のりィンドりが衚瀺されたす。



画像



リストの巊偎で、 ツヌルチェヌンを遞択したす 。 フレヌバヌのリストが右偎に衚瀺されたす。 この蚀葉で、Atmelは䜿甚するツヌルツヌルチェヌンの可胜なオプションを゚ンコヌドしたした。



.      Native,     (Default).  Native -   GCC      ,         .    Atmel,       AS6.    ,       ,       V-USB (   USB HID     USB)    .  ,         WinAVR,      .
      
      





WinAVRツヌルチェヌンをフレヌバヌリストに远加するには、[ フレヌバヌの远加 ]ボタンをクリックしたす。次のりィンドりが衚瀺されたす。



画像



このりィンドりの䞀番䞊の行に、WinAVRコンパむラヌの名前任意を入力し、䞀番䞋の行に、ツヌルチェヌンコンパむラヌがむンストヌルされおいる絶察パス\ binフォルダヌを入力し、[ 远加 ] をクリックしたす。 スクリヌンショットに瀺すように、远加されたコンパむラがFlavorsリストに衚瀺されたす。







新しく远加したWinAVRコンパむラをマりスで遞択し、[ デフォルトずしお蚭定 ]ボタンデフォルトのツヌルバヌにするをクリックし、[OK]をクリックしたす。 この手順の埌、AS6はWinAVRコンパむラを䜿甚したす。



プロゞェクトのプロパティを蚭定したす。このため、゜リュヌション゚クスプロヌラヌのカヌ゜ルを䜿甚しお巊クリックでプロゞェクト名を遞択し、 Alt + F7 メニュヌプロゞェクト->プロパティを抌すず、蚭定のりィンドりが衚瀺されたす。



画像



次の蚭定を行いたす。



さらに、非垞に重芁な点-䞋の図に瀺すように、りィンドりの巊偎のリストで、[ 詳现蚭定]セクションを遞択したす。



画像



[ ツヌルチェヌンフレヌバヌ]ドロップダりンリストで、远加されたWinAVRコンパむラを遞択し、AS6がプロゞェクトのコンパむル時に䜿甚するようにしたす。 これでAS6のセットアップが完了したした。



次に、プロゞェクト[6]の゜ヌスコヌドファむルを䜜成したプロゞェクトに远加したす-ファヌムりェア\ VUSBフォルダヌ、VUSB.c、usbdrv.c、usbdrvasm.Sおよびoddebug.cファむルを参照しおください。 ASS6プロゞェクトは、V-USBラむブラリの1぀の䟋に基づいおいたす。hid-custom-rqは、もずもずコマンドラむンからmakeナヌティリティを䜿甚しおコンパむルされたした。 V-USBラむブラリに基づいお、他の倚くのコヌド䟋を芋぀けるこずができたす-䞻にUSB HIDデバむスマりス、キヌボヌド、入力および出力デバむスがありたすが、USB CDCデバむス仮想COMポヌトもありたす。 自分でプロゞェクトを䜜成するのが面倒な堎合は、AS6でVUSB.atslnプロゞェクトファむルを開くだけで、必芁な蚭定がすべお行われ、必芁なファむルがすべお远加されたす。



別のブレッドボヌドを䜿甚する堎合は、 usbconfig.hファむルを正しく構成する必芁がありたす。 これはV-USBラむブラリの構成ファむルであり、倚くの蚭定ずパラメヌタヌVID、PID、マむクロコントロヌラヌレッグ、蚘述子の倀、およびその他の蚭定を蚭定したす。 すべおの蚭定の詳现な説明は、このファむルのコメントに蚘茉されおいたす。 䞻な泚意点は、USD D +およびD-信号マクロ定矩USB_CFG_IOPORTNAME、USB_CFG_DMINUS_BIT、USB_CFG_DPLUS_BITに䜿甚されるマむクロコントロヌラヌピンの目的です。これらのレッグには特別な芁件が課されたす。 アヌカむブ[6]の蚭定ファむルusbconfig.hは、AVR-USB-MEGA16ブレッドボヌドの脚のレむアりト甚であり、動䜜が保蚌されおいたす。 プログラムはLEDで点滅したす。LEDはブレッドボヌド䞊にあり、ポヌトBの0レッグに接続されおいたす。



コンピュヌタヌプログラムホスト゜フトりェアの䜜成



プログラムは、マむクロコントロヌラヌを制埡するUSB​​接続を介しおパケットを送信する必芁がありたす。



 .             V-USB.         makefile   MinGW,    LibUSB.         Visual Studio   LibUsbDotNet.     LibUsbDotNet    ,          ,    .    -     ,      LibUSB  .  ,   ,   -       LibUSB,        USB   Windows.     .
      
      





Microsoft Visual C2010 Expressを起動し、Windowsフォヌムに基づいお新しいプロゞェクトを䜜成したす。 次に、 LibUsbDotNet.dllラむブラリをプロゞェクトに接続する必芁がありたす。 ゜リュヌション゚クスプロヌラヌで、プロゞェクト名を右クリックし、[リンクの远加]を遞択したす。



画像



別のりィンドりが衚瀺されたす



画像



ここでは、LinUsbDotNet.dllラむブラリがあるディスク䞊のパスを芋぀ける必芁がありたすデフォルトではC\ Program Files \ LibUsbDotNetフォルダヌをむンストヌルしたすが、プロゞェクトの䜜業ディレクトリにDLLファむルのコピヌを䜜成するこずをお勧めしたす。行のメむンプログラムモゞュヌルファむルForm1.csぞ



 using LibUsbDotNet; using LibUsbDotNet.Info; using LibUsbDotNet.Main;
      
      





フォヌムのビゞュアル゚ディタヌに移動しお、次のようにしたす3぀のボタンボタンず3぀のラベルテキストラベルを远加したす。



ホト゜フトりェアのメむンフォヌムの倖芳



フォヌムロヌドむベントハンドラヌを䜜成したす。 プログラムの起動時にLibUsbDotNetクラスのむンスタンスが初期化され、それを通じおUSBデバむスず亀換されるようにする必芁がありたす。 亀換を開始する前に、耇数のUSB HIDデバむスをコンピュヌタヌに接続でき、各デバむスに個別に連絡できる必芁があるため、特にデバむスぞのアクセスを開く必芁がありたす。 USBデバむスを識別するために、すべおのUSBデバむスが持぀特別な識別子が䜿甚されたす。これらはVIDずPIDです。



 .              -       USB   VID  PID,     .     USB-,   ,   VID/PID,    ,           .
      
      





VIDはメヌカヌIDベンダヌID、PIDはデバむスID補品IDです。 USBデバむスのVID0x 16C0 、PID0x 05DF 、これらの倀は、AS6マむクロコントロヌラヌプロゞェクトの構成ファむルusbconfig.h このファむルに぀いおは既に説明したしたで瀺されおいたす。 ホスト゜フトりェアがUSBデバむスにアクセスするには、 usbconfig.hファむルに瀺されおいるように、同じパラメヌタヌVID0x16c0、PID0x05dfでMyUsbFinderオブゞェクトを初期化する必芁がありたす。 これを行うには、Form1クラスのグロヌバル倉数定矩領域に次のコヌドを远加したす。



  public static UsbDevice MyUsbDevice; public static UsbDeviceFinder MyUsbFinder = new UsbDeviceFinder(0x16c0, 0x05df);
      
      





どのUSBデバむスを䜿甚するかを決定したら、それに接続できたす。これは、プログラムを起動するフォヌムりィンドりを開くずきに䟿利です。 これを行うには、プログラムのメむンフォヌムを遞択し、プロパティ゚ディタヌで、ロヌドむベントハンドラヌForm1_Loadを䜜成したす。 ハンドラヌの本文に、次のコヌドを入力したす。



 private void Form1_Load(object sender, EventArgs e) { MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder); if (MyUsbDevice != null) { label2.Text = "  !"; } else label2.Text = "   !"; }
      
      





ボタンbutton1「オン」にクリックむベントハンドラヌを䜜成したす。これには、ビゞュアル゚ディタヌでボタンをダブルクリックし、むベントハンドラヌの本䜓にコヌドを远加したす。



 private void button1_Click(object sender, EventArgs e) { //  ,       AVR-USB-MEGA16. UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_Out), 1, (short)1, 0, 0); int countIn; byte[] data = new byte[1]; MyUsbDevice.ControlTransfer(ref packet, data, 0, out countIn); }
      
      





「オフ」ボタンハンドラヌには、コヌドを远加したす。



 private void button3_Click(object sender, EventArgs e) { //  ,       AVR-USB-MEGA16. UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_Out), 1, (short)0, 0, 0); int countIn; byte[] data = new byte[1]; MyUsbDevice.ControlTransfer(ref packet, data, 0, out countIn); }
      
      





読み取りボタンを凊理するためのコヌド



 private void button2_Click(object sender, EventArgs e) { //     AVR-USB-MEGA16 -  . UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_In), 2, (short)0, (short)0, (short)0); int countIn; byte[] data = new byte[1]; if (MyUsbDevice.ControlTransfer(ref packet, data, 1, out countIn) && (countIn == 1)) { label3.Text = "  " + data[0].ToString(); } }
      
      





フォヌムを閉じるためのむベントハンドラプログラムの終了は、LEDが点灯しおいる堎合は消灯したす。



 private void Form1_FormClosed(object sender, FormClosedEventArgs e) { UsbSetupPacket packet = new UsbSetupPacket((byte)(UsbCtrlFlags.RequestType_Vendor | UsbCtrlFlags.Recipient_Device | UsbCtrlFlags.Direction_Out), 1, (short)0, 0, 0); int countIn; byte[] data = new byte[1]; MyUsbDevice.ControlTransfer(ref packet, data, 0, out countIn); }
      
      





マむクロコントロヌラヌファヌムりェアでUSBパケットをデコヌドする方法



マむクロコントロヌラヌ偎でのデヌタの受信ず凊理は、 usbFunctionSetup関数で実行されたすファヌムりェアAS6プロゞェクトのメむンモゞュヌルVUSB.cにありたす。 関数は次のずおりです。



 usbMsgLen_t usbFunctionSetup(uchar data[8]) { usbRequest_t *rq = (void *)data; if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_VENDOR){ DBG1(0x50, &rq->bRequest, 1); /*  :    */ if(rq->bRequest == CUSTOM_RQ_SET_STATUS){ if(rq->wValue.bytes[0] & 1){ /*  LED */ LED_PORT_OUTPUT |= _BV(LED_BIT); }else{ /*  LED */ LED_PORT_OUTPUT &= ~_BV(LED_BIT); } }else if(rq->bRequest == CUSTOM_RQ_GET_STATUS){ static uchar dataBuffer[1]; /*       usbFunctionSetup */ dataBuffer[0] = ((LED_PORT_OUTPUT & _BV(LED_BIT)) != 0); usbMsgPtr = dataBuffer; /*  ,    */ return 1; /*    1  */ } }else{ /*   USBRQ_HID_GET_REPORT  USBRQ_HID_SET_REPORT  , *     .        , *        . */ } return 0; /* default   :      */ }
      
      





USB HIDデバむスは最もシンプルで、゚ンドポむント0デフォルトのコントロヌル゚ンドポむントを通過するコントロヌル転送にのみ応答したす。 芁求のタむプフィヌルドbRequestによっお、デヌタ送信の方向がデコヌドされたす。 CUSTOM_RQ_SET_STATUSの堎合、これはマむクロコントロヌラヌ向けのデヌタです。 デヌタはデコヌドされ、マむクロコントロヌラヌはそこに眮かれたコマンドを実行したす。 この堎合、LEDのステヌタスは、最初に受信したデヌタバむトで゚ンコヌドされたす。䞋䜍ビットに1がある堎合、LEDがオンになり、れロの堎合、消灯したす。 CRequestOM_RQ_GET_STATUSがbRequestフィヌルドで受け入れられた堎合、バッファはLEDの珟圚のステヌタスで満たされ、バッファデヌタがホストに返送されたす。 すべおが非垞に単玔であり、必芁に応じお、コヌドの動䜜をニヌズに合わせお簡単に倉曎できたす。



仕組みのビデオ







質問に察するコメントず建蚭的なコメントでお答えできおうれしいです。



参照資料



1 V-USB

2 。 Atmelスタゞオ6 。

 。 WinAVR

4 。 LibUsbDotNet CUSBラむブラリ 。

5 。 Visual Studio 2010 Express 。

6 。 マむクロコントロヌラずホスト゜フトりェアの゜ヌスコヌド 。



PS知識の掚進力は、 microsin.netサむトでした。このサむトには、USBプロトコルに関する倚くの情報ず、USBデバむスでのマむクロコントロヌラヌの実際の䜿甚がありたした。 どうもありがずう 応答性ずこのトピックに関する質問の支揎のために、このサむトの開発者に。



将来的には、可胜であれば、ハヌドりェアUSBむンタヌフェむスを備えたマむクロコントロヌラヌで同じこずを行う予定です。



All Articles