目次:(2010年6月14日更新)
PIC18F2455/2550/4455/4550で1つのファミリとなっています。この中で、ピン数の少ない28ピンのPIC18F2455やPIC18F2550が使いやすいでしょう。ここでは、これら2つのうち、プログラムメモリーの大きい方のPIC18F2550を使うことにします。なお、ピン数が40ピンと多いPIC18F4455やPIC18F4550は、入出力ピンが多く必要になったとき、その使用を考えましょう。
PIC18F2455/2550/4455/4550ファミリは、USB Ver. 2.0 に準拠しており、Full spead (12Mb/sec)でデータを転送できます。また型名のFからわかるように、プログラムを書き込むメモリはフラッシュメモリになっています。最大10万回書き換え可能です。フラッシュメモリは電気的に書き換え可能なので、大変扱いやすくなっています。これまでにUSBに準拠しているPICはLow speedのPIC16C745/765-JWだけでしたが、プログラムを書き換えるためには、まず紫外線で以前に書き込んだプログラムを消去し、その後新たなプログラムを書き込むという手順を踏まなければならず大変面倒でした。
PIC16F84A-20/P(あるいはPIC18F1320-I/P)を卒業したら、ぜひPIC18F2550を使って見ましょう。
初めてPIC18F2550でUSB通信を行おうとする方は、HIDクラスから始める方が賢明でしょうが、以下の”PIC18F2550と制御コンピュータとの関係”にざっと目を通してください。
右図のようにPIC18F2550と制御用コンピュータとをUSBで接続してデータをやりとりする場合を考えます。
PIC18F2550はマイクロコンピュータですから、それを働かすソフトウェア(ファームウェア)が必要です。
一方、制御コンピュータには次のような3つのソフトウェアが必要となります。我々が制御コンピュータを操作する場合、直接接するのは、アプリケーション・ソフトウェアです。 ところが、WindowsOS下では、基本的にアプリケーション・ソフトウェアから直接USBを制御することはできないようになっています。アプリケーション・ソフトウェアはデバイス・ドライバーと呼ばれるソフトウェアを通してUSBを制御するような仕組みになっています(実際はもっと複雑ですが)。基本的には、アプリケーション・ソフトウェアとデバイスドライバーだけで良いのですが、デバイス・ドライバーは、そのままでは使い勝手が良くありません。そこで、デバイス・ドライバーの関数を、アプリケーション・ソフトウェアから見て、より使い勝手が良い上位関数として取りまとめるようなソフトウェアがあると便利です。このソフトウェアをダイナミック・リンク・ライブラリ(Dynamic Link Library:DLL)化したものが右図でドライバー用DLLと書いたものです。
ダイナミック・リンク・ライブラリとはOSがWindowsになった時に出てきた概念で、このライブラリはアプリケーション・ソフトウェアを機動したときに初めてアプリケーション・ソフトウェアに組み込まれる、すなわち動的にリンクされるするので、そのような名前で呼ばれています。OSがMS-DOSのときにお世話になったライブラリをスタティック・リンク・ライブラリと呼んで区別されています。
結局、合計以下の4つのソフトウェアが必要となります。2550_MpicUSB.zipをダウンロードして解凍してください。
●アプリケーション・ソフトウェアは[Visual C++(Ver. 6)用]と[Visual C++/CLI(2005)用]を用意しました。前者は.NETを使用しないもの、後者は.NETを使用するものです。.
●ドライバー用DLLのBorland_C用のソースファイルは、MICROCHIP社が公開しているMicrochip Application Libraries v2009-11-18 Installer.zipを解凍して得られるMicrochip Solutions\USB Tools\MCHPUSB Custom Driver\Mpusbapi\Dll\Borland_C\Sourceフォルダーの中にあります。これを利用して[Visual C++(Ver. 6)用]のドライバー用DLLのソースファイルを2550_MpicUSB\mpusbapiフォルダーの中に作りました。このフォルダー(あるいは、その下の\Releaseフォルダー)の中に(1)mpusbapi.dll、(2)mpusbapi.h、(3)mpusbapi.libの3つのファイルが見つかると思います。上項目のアプリケーション・ソフトウェアをコンパイル(機械語に変換)する時に必要なので、2550_MpicUSB\V6フォルダーや2550_MpicUSB\VS2005フォルダーにも入れてあります。ただし、後者のフォルダーにはmpusbapi.libが入っていません。DLLが明示的に呼び出されるため、必要がないのです。
(1)番目のファイルはDLL本体で、(2)番目のものはDLL内の関数を参照するためのヘッダーファイルで、(3)番めのものは、アプリケーション・ソフトウェアをコンパイルする時に、DLL内の関数の情報を与えるものです。
DLLはアプリケーション・ソフトウェアを走らせるたときに初めてリンクされるので、コンパイル時に、アプリケーション・ソフトウェアはDLL内の関数に関する情報を持っておらず、どこからか手に入れないといけません。その情報を与えるのが、(3)番目のファイルの様なインポート・ライブラリです。
●デバイスドライバーは、おなじくMICROCHIP社が公開しているもので、上で述べたMicrochip Application Libraries v2009-11-18 Installer.zipを解凍したときに得られるMicrochip Solutions\USB Device - MCHPUSB - Generic Driver Demo\Driver and infフォルダーの中にあるmchpusb.sysです。このデバイスドライバーはUSB1.10にも対応するよう改善されました。
なお、Microsoft社もwinusb.sysなるデバイスドライバーを用意しています。これを使用したい方は、2550_MpicUSB.zipの代わりに2550_WinUSB.zipをダウンロードして解凍してください。DLLはwinusb.dllです。ただし、winusb.sys や winusb.dll は、USBドライバーをインストールすると自動的にインストールされますので、インストール前には、どこにもありませんので、注意してください。
●ファームウェアは、上で述べたMicrochip Application Libraries v2009-11-18 Installer.zipを解凍したときに得られるMicrochip Solutions\USB Device - MCHPUSB - Generic Driver Demo\Generic Driver Demo - Firmware\USB Device - MCHPUSB - Generic Driver - C18 - PICDEM FSUSB.mcwを参考に、必要な所だけを切り出して、少し加工したものです。どの様な変更を加えたかを知りたければ、2550_MpicUSBフォルダーの中のMpicUSB.docをお読みください。
なお、ファームウェアについての詳しい情報は、 PICDEM FS USB DEMONSTRATION BOARD USER'S GUIDEの、特に第4章をご覧ください。MCHPFSUSB Firmware User‘s Guideも参考になるかも知れません(詳しくは読んでいないので判断できません)。
以下にEAGLEというソフトウェア(試用版)で作成した回路図を示します。
初めは、動作確認ができれば良いので、できるだけ単純な回路にすべきとの観点から、特別な周辺回路はなにもありません。
実際の回路は、以下のように穴あき基板上で組んでいます(コンデンサーC2は半田面にあります)。なお、ここでは20MHzの水晶発振器を用いてますが、セラミック発振子(コンデンサー内蔵:商品名セラロック)で十分です。セラロックは3本足で、両端の2つの足はPIC18F2550の9と10番ピンにそれぞれ配線し、残りの真ん中の足はGNDに落として使います。
PICにファームウェアをコンパイルするために MPLAB8_40.zipと MPLAB-C18-Lite-v3_34.exe(サインインが必要) をダウンロードして、インストールしてください。
なお、 MPLABのマニュアルは MPLAB IDE User's Guide です。 また、MPLAB-C18のユーザーズガイドは MPLAB C18 C Compiler User's Guide (Japanese) で、MPLAB-C18のライブラリ説明書は MPLAB C18 Libraries Documentationです。
a) 2550_MpicUSB\MpicUSBフォルダー内のMpicUSB.mcwをダブルクリックすると、MPLABが立ち上がります。
b) メニューバーからProgect -> Build Options... -> Prjectを選択すると、右図の画面が現れます。パスを適宜、書き換えてください。
c) メニューバーからProject -> Build Allを選択し、コンパイルを行います。
PICにファームウェアを書き込むため、普通の方々はICD2を購入することになると思います。回路づくりに自信がある方々は"ICD2-Clone" に興味がわくかも知れませんが、著作権侵害になるやに思います。
d) ICD2と作成したテスト回路を接続し、Programmer -> Select Programmer ->MPLIB ICD2を、そしてProgrammer -> ConnectでICD2を、最後にProgrammer -> Prgramを選択してファームウェアを書き込みます。
テスト回路と制御用コンピュータをUSBケーブルで接続し、テスト回路の電源を入れます。
a) 右の様なウィンドウが現れた後、すぐにその下の画面 が現れて新しいハードウェアの検索ウィザードが開始されます。
b) 新しいハードウェアの検索ウィザードの開始画面が現れるので、”一覧または特定の場所からインストールする”にチェックを入れて、”次へ”ボタンをクリックします。
c) 検索とインストールのオプションを選んでくださいという画面が現れるので、”次の場所で最適のドライブを検索する”にチェックを入れ、さらに”次の場所を含める”にもチェックを入れます。
d) ”参照”ボタンを押して、mchpusb.inf(2550_WinUSB.zipをダウンロードした方はMCHPWinUSBDevice_v2.inf)のあるフォルダー(Driver and INF)を指定した後に、”次へ”ボタンをクリックします。
e) インストールに成功すると、新しいハードウェアの検索ウィザードの完了画面が現れるので、”完了”ボタンをクリックして終了します。
以上の操作でUSBドライバーmchpusb.sys [2550_WinUSB.zipをダウンロードした方はwinusb.sys] が制御用コンピュータにインストールされます(組み込まれます)。
テスト回路と制御用コンピュータをUSBケーブルで接続し、テスト回路の電源を入れます。
その後、2550_2009\2550_MpicUSB\VC6\Releaseフォルダー内のTestUSB.exe[Visual C++(Ver. 6)用]、あるいは2550_2009\2550_MpicUSB\VS2005\Release内のMCHPUSB PnP Demo.exe[Visual C++/CLI(2005)用]をダブルクリックすると[mpusbapi.dllをTestUSB.exeやMCHPUSB PnP Demo.exeと同じフォルダ等、サーチパス上の適当な所に置いてください]、上図のようなダイアログ(対話)が現れます。 例えば上の段に123と入れて、送信ボタンをクリックすると、下の段に223と現れれば、正常に動作しています。送信された文字列のうち、第1番目の文字だけが変わったもの(アスキーコードで1足されたもの)が、現れるはずです。
ファームウェア関連のuser.cの次の箇所を見れば、上のことが理解できるでしょう。
void ProcessIO(void)
{
if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
if(!USBHandleBusy(USBGenericOutHandle))
{
if(!USBHandleBusy(USBGenericInHandle))
{
strcpy(INPacket._byte,OUTPacket._byte);
INPacket._byte[0]+=1;
USBGenericInHandle = USBGenWrite(USBGEN_EP_NUM,(BYTE*)&INPacket,USBGEN_EP_SIZE);
}
USBGenericOutHandle = USBGenRead(USBGEN_EP_NUM,(BYTE*)&OUTPacket,USBGEN_EP_SIZE);
}//end if
}//end ProcessIO
ファームウェアに関して、USB動作を除外して考えた場合、我々が行うプログラミングは、おおざっぱに言えば、user.cのなかの、 ProcessIO(PICにどの様な動作をさせるかのプログラミング)とUserInit(PICの初期化のためのプログラミング)の2カ所です。
一方、アプリケーションソフトウェアを開発する場合、2550_2009\2550_MpicUSB\VC6フォルダーにあるFormDlg.cppや2550_2009\2550_MpicUSB\VS2005フォルダーにあるForm1.hを見て行くと、その使用方法が理解できると思います。
ホストコンピュータから"s数字"なる命令が送られると数字の数だけパルス(1秒周期) をRA0(PIC18F2550の2番ピン)から出力するためのファームウェアがuser.cです。2550_MpicUSB\MpicUSBフォルダー内のuser.cをこれと入れ替えるだけです。
同じ回路を用いたPIC18F2550の応用例として、これまでのデバイス・ドライバーと異なるものを紹介します。
USBにおいて、同じデバイス・ドライバーで動作するデバイス(device)をデバイス クラス(devices class)と言います。例えば、マウス、キーボード、ジョイスティックなどのデバイスは、ボタンなどの数なとは違いますが、同一のデバイス・ドライバーで動作するので、Human Interface Devices(HID)クラスと呼ばれています。HIDクラスのデバイス・ドライバーは、すでにWindowsのOSで用意してあり、デバイスを制御用コンピュータに接続する時に、自動的に組み込まれますので、手軽に利用できます。なお、このクラスの規格については、http://www.usb.org/developers/hidpageにて「Device Class Definition for Human Interface Devices(HID)Version 1.11」、「HID Usage Tables Version 1.12」をダウンロードして、ご覧ください。
ここでは、先にファームウェア(2550_MpicUSB\MpicUSBフォルダー)、USBドライバー(mchpusb.sysあるいはwinusb.sys)、ドライバー用DLL(mchpusb.dllあるいはwinusb.dll)、アプリケーション・ソフトウェア(2550_MpicUSB\V6フォルダー[Visual C++(Ver. 6)用]、あるいは2550_MpicUSB\VS2005フォルダー[Visual C++/CLI(2005)用])を用いて実現してきたことを、HIDクラスで実現します。 必要なファームウェア(MpicUSBフォルダー)とアプリケーション・ソフトウェア(VC6フォルダー[Visual C++(Ver. 6)用]、あるいはVS2005フォルダー[Visual C++/CLI(2005)用])とを2550_Hid.zipとしてアップロードします。USBドライバー、ドライバー用DLLは、すでにWindowsOSに含まれているので、必要ありません。ファームウェアをPIC18F2550に書き込んだ後に、アプリケーション・ソフトウェアを実行して現れるダイアログボックスにて、例えば上の段に123と入れて、送信ボタンをクリックすると、下の段に223と現れます。アプリケーション・ソフトウェアの中のPICkit2Dlg.cppを見ると、データのやりとり方法がすぐ理解できると思います。
(注)HIDを扱う場合、手始めとして、マウスの模倣(emulation)動作、具体的にはマウスカーソルが円を描く動作をPIC18F2550にさせるファームウェア2550_Mouse.zipから始めると良いと考えます。解凍したあと、Mouse.docをお読みください。USBドライバー、ドライバー用DLL、アプリケーション・ソフトウェアは、すでにWindowsOSに含まれているので必要ありません。ファームウェアをPIC18F2550に書き込むだけです。
さて、これまでPIC18F2550とホストコンピュータ間でデータをやりとりする方法を、2通り紹介してきました。どちらが良いのでしょうか。汎用性やデータ転送速度の問題です。汎用性、速度が要求される場合は、最初に紹介した[ファームウェア(MpicUSBフォルダー)、USBドライバー(mchpusb.sysあるいはwinusb)、ドライバー用DLL(mpusbapi.dllあるいはwinusb.dll)、アプリケーション・ソフトウェア(V6フォルダー[Visual C++(Ver. 6)用]、あるいはVS2005フォルダー[Visual C++/CLI(2005)用])を用いて実現して来た]方法で、要求されない場合は、HIDを用いる方法が良いでしょう。HIDを用いる方法では、WindowsOSが自動的にドライバーのインストール作業をしてくれます。服に例えれば、前者がオーダーメードで、後者がイージーオーダーという感じがします。
PIC18F2550に関して、グローバル電子株式会社には大変お世話になりました。ここに感謝いたします。
マイクロチップ社が開設しているUSBフォーラムへ、ytsという名前で参加し、情報を提供していました。過去のものですので参考程度にしてください。いくつかのものは、上で述べたMicrochip Application Libraries v2009-11-18 Installer.zipの中で解決しているものがありますので、まずそれらを参考にした方が良いと思います。なお#の後の数値はPost番号で、その後のファイル名で示されているファイルはポストしたプログラムです。
HIDクラス
1.USB KeyboardをHIDクラスで模倣
#29 keyboard.zip #30 user1.c
2.HIDクラスでのデータ入出力法と、液晶表示器(LCD)の使用方法
#4 hidlcd.zip
3.HIDクラスを使用して、1つのPICでキーボードとマウスを同時に実現するプログラム
#11 mouse_keyboard.zip
4.HIDクラスでのデータ入出力とキーボード模倣を、1つのPICで同時に実現するプログラム
#3 fhidkey.zip
5.ジョイスティクの模倣
#11 example2.zip #23 joyneuf.zip
6.Mouse.zipを書き換えて、割り込みを割り込み時にチェックするようにしたもの
#3 int_driven_mouse.zip
7.上記2項目で、割り込みを割り込み時にチェックするようにしたもの
#1 Example.zip
General purpose device (GPD)クラス
1.GPDクラスの使用時に必要なDLL;Microsoft VC++用
#4 mpicusb.zipと同じもの
2.GPDクラスにおける割り込み操作時に発生する問題点の暫定的解決法
#3 Int.zip
3.割り込みを割り込み時にチェックしたもの
#1 INT_MPICUSB.zip
Communication Device Class (CDC)
1.割り込みを割り込み時にチェックしたもの
#1 Example1.zip