前の月 / 次の月 / 最新

hiChangeLog / 2009-04

2009-04
SMTWTFS
1234
567891011
12131415161718
19202122232425
2627282930

2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12

2009-04-23 Thu

とにかくUSBでPICを制御する [PIC][USB]

PCから自作電子回路を制御したい場合どうするか。
インターフェースとしてRS232Cが良く使われてきたが、昨今はこれを持たないPCも多いので、USBによる制御を行いたい。
最近、USB制御に関する書籍など情報も増えてきてはいるが、何かとややこしくて取っ掛かりが掴みにくい。
下記は、細かいシキタリはさておきとにかく動かしてみるまでのメモ。WinXP MCE SP3

PIC18F2550を使う。これはコネクタ付きのマイコンボード完成品が入手容易であるため。
ソフトウェア開発にはmikroCを使う。これは、私が慣れているCで開発したいためと、USB周りのライブラリが存在しているため。接続にあたっての初期化など定型処理は既存のものに任せたい。デモ版は2KBまでのhex出力は自由に行えるが、それ以上だと要レジスト。未確認だがデモ版で下記は作製できないかもしれない。

1) mikroCでプロジェクトを新規作成し、PICとしてPIC18F2550を選択し、クロック周波数として20MHzを選択。プロジェクトへのファイル追加は行わない。
2) Library Manager から"USB"にチェック
3) Tool => HID Terminal からディスクリプタを作成する。VIDは適切な値を入れる必要があるが、電気的な動作を定めるものではない。あとは下のラジオボタンでmikroC形式を選択し"Save descriptor"する。この時デフォルトで拡張子".c"がつかないので、あらわに要指定。
4) 3)で作成したUSBdsc.cをプロジェクトに追加する
5) mikroCのExample中の"HID Read Write Test"などにある Definit.h、VARs.h をプロジェクトのディレクトリにコピーする。
6) Project => Edit Projectする。"96MHz PLL Prescaler"を"Divide by 5 (20MHz input)"に、"Full-Speed USB Clock Source Selection"を"Clock src from 96MHz PLL/2"に、"USB Voltage Regulator"を"Enable"にする。
7) 既に自動的に作成された(殆ど)カラのcソースファイルがあるので、下記を記述しビルドし書き込んで終了。

unsigned char buf_read[16], buf_write[16];

void interrupt()
{
  HID_InterruptProc();
}

void main() {
     HID_Enable(&buf_read, &buf_write);
     Delay_ms(1000);
     while (1) {
         if(HID_Read()){
             switch(buf_read[0]){
             case 'a':
                  buf_write[0] = 'z';
                  break;
             default:
                 buf_write[0] = '?';
                 break;
             }
             while(!HID_Write(&buf_write, 1));
        }
    }
    HID_Disable();
}

Tool => HID Terminal から動作を確認できる。'a'を送信したら'z'が返り、それ以外は'?'が返る。

補足1) 上記はHIDクラスのUSBデバイスを実現する(マウス等と同等)。HIDの読み書きは通常OSの機能として可能(Windowsなら、APIのWriteFile/ReadFileで可能)なので、PC側ソフトウェア開発はそれほど難しくない。(参考:PSoCをUSB(HID)デバイスとして接続しデータを受信する)「ハイパーターミナル」的な標準ターミナルがあると便利なのだけれど。
補足2) 上記は自分なりに必要最小限と判断したもので、動作確認もしたが正常だった。でもまだ余計な部分、あるいは足りない部分などあるかもしれない。
補足3) 上記は1文字の通信を行っている。複数文字いっぺんに送るには、ディスクリプタのレポート長を大きくする。(のだろう。理解しきれていない)
補足4) FT232RLもコンパクトにUSB接続(USB<=>RS232C)が可能。

2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2010-03-08 22:21