最初のUSBデバイスの開発。 小さな前進

むかしむかし、私はある種のデバイスを組み立てるという夢を、複雑ではないものの、コンピューターの制御下で特定のアクションを実行することを夢見ていた。 私は専門職のWeb開発者であり、マイクロコントローラーのプログラミングの経験はありませんが、このトピックは興味深いものです。 はんだ付けのスキルもわずかです(もちろん、別のヘッドフォンや配線をはんだ付けすることもできますが、チップをはんだ付けしようとしませんでした)。 そのため、たとえばマイクロコントローラを備えた既製のブレッドボードに基づいて、単純なものから始める必要があると判断しました。



ポストには何がありますか?


投稿では、コンピューター上のプログラムを使用してボード上のLEDを制御する最初のクラフト、具体的には1つの視覚化バーを備えた一種の音量レベルインジケーターを開発した経験についてお話します。 これはデバイスの外観です:











経験豊富なラジオアマチュアにとっては面白くないかもしれませんが、どこから始めればよいかわからない人もいるでしょう。 この投稿は、特定のツールや必要な材料(はんだペースト、ヘアドライヤーなど)を使用せず、プリント回路基板を描画およびエッチングする必要なく、コンピューターからデバイスを制御するデバイスを初めて組み立てたい人に最初に対処しています。 ここで説明したようなデザインは、人に「クイックスタート」を提供し、それが何であるかを理解し、将来このビジネスを行うかどうかを自分で決定できるようにします。



情報検索



.NETのGUIシェルを使用したHabréの記事、自作USB-HID LEDの管理は、情報の検索に役立ちました。 この投稿では、著者は小さなAVR-USB-TINY45デバッグボードの購入について話しています。 著者のリンクをたどると、既製のデバッグボードがいくつか見つかりました。 前述の投稿の著者が使用したAVR-USB-TINY45は私の実験には十分ではなく、AVR-USB162は私にはあまりにもクールでした(LUFAライブラリは複雑であり、ホストソフトウェアのサンプルは見つかりませんでした)。 ATmega32マイクロコントローラーを搭載したAVR-USB-MEGA16



購入の詳細



AVR-USB-MEGA16デバッグボードを配送とWebmoney経由で送金するためのすべてのパーセンテージを購入すると(ハリコフでYandex-Moneyを補充するのはそれほど簡単ではないことがわかりました)、約26 USDかかりました。 モスクワからハリコフへの配達は少し遅れましたが(ハリコフの近くで荷物が詰まった)、すべてがすぐに到着しました。 microsin.ruに特に感謝します-ボードは確実にパッケージ化され、衝撃から保護されています。



サーキットボードデバッグボードAVR-USB-MEGA16


サーキットボードデバッグボードAVR-USB-MEGA16






ボードの詳細な説明はここにはありません(興味がある人はリンクを参照してください)。 ボードには、マイクロコントローラーとUSBに必要なハーネスがすべて揃っていると言えます。つまり、ボードをUSBに接続すると、ボードから給電され、ATmega32マイクロコントローラーが機能します。 プログラムを作成するだけで(後ほど詳しく説明します)、ボードのブレッドボードフィールド(8x11、穴間ピッチ2.54 mm)にデザインをはんだ付けします。 ボードには22個の空きI / Oポート(2列の穴に配置)があり、LEDを掛けることができます。



また、USBを使用してボード上のマイクロコントローラーをフラッシュする機能も非常に重要でした。 はい、ATmega32には既にUSBブートローダーが搭載されているため、プログラマーは必要ありません。USBのみです(操作方法はHabréで記述されています。リンクを参照)。 プログラミングとデバッグには、ISPおよびJTAGインターフェイスも使用できますが、プログラマもインサーキットデバッガも持っていないため、必要ありませんでした。



問題の声明



このトピックに関する最初の経験で、システムの音量レベルのインジケーターを作成することにしました。 ボードには、複数のLEDを配置し、それらの電源を管理し、コンピューターでサウンドを視覚化するプログラムを作成したかったのです。



組立



まず、購入したデバッグボードのすべてをはんだ付けするのではなく、個別に開発された「モジュール」の「ベース」として使用します。 それはまさに私がやったことです。 まず、表示されたマイクロコントローラーの空きポートに格子をはんだ付けしました。











また、追加の安価なブレッドボード(最初のはんだ付け実験中にはんだごてでネタバレすることを気にしません)が必要でした。これは、必要なものすべてとともに、ラジオ市場で購入しました。











さらに、LEDと抵抗器をそれらにはんだ付けするのは難しいことではありませんでした。 初めてLEDを使用する必要に直面したとき、彼はすべてがどのように機能するかを理解するために多くの情報をシャベルで掘りました。 私はウェブサイトeasyelectronics.ruですべての必要な情報を見つけました。そこでは「どのように、何を」詳細に説明しました。 どうもありがとうございます。



その結果、私は次のようなものを得ました(コネクターと、グリルとボードにはんだ付けされた一般的なマイナスのLEDの簡単な接続図):











古いコンピューターのケーブルを使用して2つのボードを相互に接続することにしました。











だから私はモジュラーシステムを得ました。 ループを再配置するだけで、新しいモジュールをすばやく組み立てて同じマイクロコントローラーで使用できます。



ソフトウェア部



コミュニケーション


ここでは、ボード自体が、残念ながら、そしておそらくは喜びさえするものとして、組み込みのUSBインターフェイスを持たないことに注意する価値があります。そのため、コンピューターとボード間のすべての通信は、GPLの下でライセンスされているObjective Development Softwareによって開発されたV-USBライブラリを使用して実行されます。

このライブラリは、Windowsオペレーティングシステム(2000、2003、XP)にはlibusb-win32ライブラリを、* nixファミリのオペレーティングシステム(Mac OS、Linuxなど)にはlibusbを使用します。



ファームウェア


ファームウェアとしてプロジェクトのこのような重要な部分...私はもう一度、シンプルで効果的なものが欲しかった。

何らかの理由で、情報を検索できたのは当時とても幸運だったので、前述のサイトで、MKのファームウェアとC#(私にとってWindowsで最も使いやすいプログラミング言語)で記述されたラッパークラスという優れたソリューションを見つけました。



ファームウェア自体は、その主なタスクがUSB経由で受信したデータを使用して特定のレジスタのビットを設定するように書かれています。 デスクトッププログラムは他のすべてを実行します。



プログラム


次に行う必要があるのは、上記のC#のラッパーを使用して、必要なビットを必要なレジスタに送信するプログラムを作成することだけです。 特にプログラムに必要なのは、システムの現在の音量レベルを取得し、目的のビットを変更するだけなので、これはもはや作業ではありません。



古いフォルダーを少し検索した後、AudioCoreApi(C#)に基づいて書き込まれた、将来のニーズのために隠されたいくつかの不要な適切な空白が見つかりました。











さて、適切なイベントに必要なチームを配置することは残っています。



ボードのLEDをマイクロコントローラーのポートAのすべてのレッグに接続したため、LEDに従ってMKレッグをそれに応じて「プル」する必要があります。 各LEDの状態は、PORTAバイト(ポートAのフィートμの状態を担当するバイト)の各ビットの状態に対応しています。



プログラムでメインタイマーを見つけ、次のコードを記述します。

byte PortState = 0; for (int i = 1; i <= 8; ++i) { if (leftVolumeLevelPercent > 12 * i) { PortState <<= 1; PortState |= 0x01; } } hundler.PORTA = PortState;
      
      





ここでは、システムの音量レベルに応じて、シフト操作を使用してhundler.PORTAの特定のビットを設定またはリセットします。hundlerはデバイスを操作するオブジェクトであり、PORTAは入力/出力ポートのバイトで、次のように実装されます。



 public byte PORTA { set { usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, RQ_IO_WRITE, value, aPORTA, null, 0, 5000); } get { usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, RQ_IO_READ, 0, aPORTA, buffer, 1, 5000); return buffer[0]; } }
      
      





usb_control_msg()関数は、V-USBライブラリの関数です。



もう1つの重要な点は、ポートAを使用する前に、すべてのレッグを入力ではなく出力に設定する必要があることです(正直に言うと、いくつかの記事でこの瞬間をスキップして、LEDが3分の1になったときに少し混乱しました)次のように:



 hundler.DDRA = 0xFF; //   -  255,        
      
      







まあ、それがすべてです! ここまで読んでくれてありがとう。 コメントでは、「フクロウの描き方」という絵については話されないことを願っています。すべてが明確で、以前に私が思っていたほど複雑ではないようです。 また、私はこれを言いたくありませんでしたが、これはすでに気分ランプへの道の半分です:)



映像









参照資料

  1. .NETのGUIシェルを使用した自家製USB-HID LEDの管理
  2. AVR-USB-MEGA16デバッグボードの説明
  3. Cのファームウェアとクラスラッパー#
  4. C#投稿からのプログラム


追伸:低品質の写真とビデオをおaびします。 残念ながら、グーグル電話以外に手元には何もありませんでした。



All Articles