広告
*USB-パラレル+シリアル変換 [#sde127a3] FT245系(FT245AMやFT245RLなど)は[[Future Technology Devices International Ltd:http://www.ftdichip.com/]](FTDI)のUSB−シリアル(RS232C)+パラレル(8bit、D2XXと呼ばれている)変換チップ。~ [[秋月電子通商:http://akizukidenshi.com/]]などで入手可能。組み立て済みのモジュールを売っているので使い易い。 シリアルはFT232系と同じなので、[[FT232のページ>FT232]]を参考にしてほしい。~ ここではパラレル変換の方を述べる。 *準備 [#w1102826] まずは、D2XX(パラレル出力)用のライブラリを取ってくる。~ どうもファイルシステムとして機能するため特にドライバは必要としならしい。カーネルの再構築も必要ない。 ライブラリには2種類ある。~ ひとつは[[FTDI:http://www.ftdichip.com/]]が配布している公式版。もうひとつは、オープンソースのライブラリで、「[[libftdi:http://www.intra2net.com/de/produkte/opensource/ftdi/]]」というもの。~ [[libftdi:http://www.intra2net.com/de/produkte/opensource/ftdi/]]はRPMが用意されていてDebianの公式パッケージにもなっているので公式版の方がインストールの手間が多い。~ ひとつは[[FTDI:http://www.ftdichip.com/]]が配布している公式版。もうひとつは、オープンソースのライブラリで、「[[libFTDI]]」というもの。~ [[libFTDI]]はRPMが用意されていてDebianの公式パッケージにもなっているので公式版の方がインストールの手間が多い。~ どっちがいいかとなると、Windows用のプログラムも作る気があるなら公式版を使ったほうが関数の互換性があっていいかも。~ やりやすいのはlibftdiだと思う。新しいカーネルにも対応が早そう。~ 詳しくは[[ドキュメント:http://www.intra2net.com/de/produkte/opensource/ftdi/documentation/]]を参照のこと やりやすいのは[[libFTDI]]だと思うし新しいカーネルにも対応が早そうなので[[libFTDI]]を推奨する~ 「[[libftdi:http://www.intra2net.com/de/produkte/opensource/ftdi/]]」は上述したようにパッケージを使えば簡単にインストールできるのでインストール方法は特に述べず、まず、公式版のD2XXライブラリのインストールについて述べる 「[[libFTDI]]」に関しては[[libFTDIのページ>libFTDI]]で述べるのでここでは公式版のD2XXライブラリについて述べる *公式版D2XXライブラリのインストール [#a55c1d83] カーネルバージョン2.4用らしいけど、2.6でも動く。 -[[D2XX用ファイル置き場:http://www.ftdichip.com/Drivers/D2XX.htm]]からLinux用D2XXライブラリをダウンロードする。~ -適当な場所に展開(解凍) -インストールは http://www.ftdichip.com/Drivers/D2XX/Linux/README.dat を参考。以下簡単な流れ -ライブラリを移動 cp libftd2xx.so.0.4.13 /usr/local/lib/ -シンボリックリンクを作成 cd /usr/local/lib/ ln -s libftd2xx.so.0.4.13 libftd2xx.so ディストリビューションによっては「libftd2xx.so.0」。Debianではこうだった。 -/usr/libにも一応シンボリックリンクを作成 cd /usr/lib ln -s /usr/local/lib/libftd2xx.so.0.4.13 libftd2xx.so または ln -s /usr/local/lib/libftd2xx.so.0.4.13 libftd2xx.so.0 -ファイルシステムとしてマウントされるように「/etc/fstab」に none /proc/bus/usb usbfs defaults,mode=0666 0 0 と記述(2.6からusbdevfsではなくusbfs)すでにマウントされているかも -mount -a としてマウント。~ というのが、[[README.dat:http://www.ftdichip.com/Drivers/D2XX/Linux/README.dat]]の内容だが、すでにfstabやmtabに「/proc/bus/usb」をマウントするように記述されている場合は mount: none already mounted or /proc/bus/usb busy mount: according to mtab, procbususb is already mounted on /proc/bus/usb というエラーが出るので、上の2ステップ(fstabへの記述)は不要。 *接続してみる。 [#lc3f8bfd] つないだ後、 # dmesg を実行すると usb 7-3.1: new full speed USB device using ehci_hcd and address 5 usb 7-3.1: configuration #1 chosen from 1 choice ftdi_sio 7-3.1:1.0: FTDI USB Serial Device converter detected drivers/usb/serial/ftdi_sio.c: Detected FT232BM usb 7-3.1: FTDI USB Serial Device converter now attached to ttyUSB0 ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0ftdi_sio 7-3.1:1.0: device disconnected usb 7-3: reset high speed USB device using ehci_hcd and address 3 usb 7-3.1: new full speed USB device using ehci_hcd and address 6 usb 7-3.1: configuration #1 chosen from 1 choice ftdi_sio 7-3.1:1.0: FTDI USB Serial Device converter detected drivers/usb/serial/ftdi_sio.c: Detected FT232BM usb 7-3.1: FTDI USB Serial Device converter now attached to ttyUSB0 と表示される。これはシリアル変換部分なので表示は[[FT232]]系と同じ。 # lsusb では Bus 007 Device 013: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC という表示だった。 ftdi_sioというシリアル変換用のモジュールが動いているとエラーになるみたいだが、僕が使っている分にはこのモジュールが動いていても問題なさそうだった。~ もしエラーが出るようなら # lsmod で動いているモジュールを表示して、ftdi_sioがあるようなら rmmod ftdi_sio とやって止める。 *プログラム作成 [#cb04c0bd] 両方のライブラリともサンプルプログラム(C言語で記述されている)が添付されているので、それをコンパイルして使ってみる。~ ただし''rootでないとデバイスにアクセスできない場合がある''ので注意。 コンパイルは、公式版の場合はサンプルプログラムのMakefileを見ればいい。~ libftdiの場合は gcc -o hoge hoge.c -lftdi とやる。 **libftdiのbitbang.cの簡単な解説 [#j815c05f] libftdiのサンプルとして添付されている「bitbang.c」について。~ 「bitbang」は「bitを叩く」という意味なのか、つまりはパラレルポートのbit毎のON-OFFをするモード。 一番簡単に使えるモードだろう。~ このプログラムは、全1bitをON、OFFしたあと、1BitだけをOFFにして1bitずつシフトしていく。~ プログラムを見てもわかるように、PC側でON-OFFをしているためPCの処理の影響を受ける。~ なので、必ずしも思ったタイミングで動くわけではなく数msぐらいの誤差があるみたいだ。 #include <stdio.h> #include <unistd.h> //sleep, usleep用 #include <ftdi.h> //FTDIチップ用 int main(int argc, char **argv) { struct ftdi_context ftdic; //ftdi_contextの宣言 int f,i; char buf[1]; //入力用バッファ ftdi_init(&ftdic); //FTDIチップの初期化 f = ftdi_usb_open(&ftdic, 0x0403, 0x6001); //FTDIチップをオープン if(f < 0 && f != -5) { //エラーとトラップ。-5はftdi_sioが動いていた時のエラー fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic)) exit(-1); } printf("ftdi open succeeded: %d\n",f); printf("enabling bitbang mode\n"); ftdi_enable_bitbang(&ftdic, 0xFF); //すべてのビットをbitbangに設定 sleep(3); buf[0] = 0x0; printf("turning everything on\n"); f = ftdi_write_data(&ftdic, buf, 1); //00を書き込み。つまりすべてOFF if(f < 0) { fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(&ftdic)); } sleep(3); buf[0] = 0xFF; printf("turning everything off\n"); f = ftdi_write_data(&ftdic, buf, 1); //00を書き込み。つまりすべてON if(f < 0) { fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(&ftdic)); } sleep(3); for(i = 0; i < 32; i++) { buf[0] = 0 | (0xFF ^ 1 << (i % 8)); if( i > 0 && (i % 8) == 0) { printf("\n"); } printf("%02hhx ",buf[0]); fflush(stdout); f = ftdi_write_data(&ftdic, buf, 1); if(f < 0) { fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(&ftdic)) } sleep(1); } printf("\n"); printf("disabling bitbang mode\n"); ftdi_disable_bitbang(&ftdic); //bitbangモードを終了 ftdi_usb_close(&ftdic); //デバイスを閉じる ftdi_deinit(&ftdic); } *LEDを光らせてみる [#eed2f1b0] それぞれのbitで直接LEDを駆動できるので、1kΩぐらいの抵抗を介して、LEDを接続するとLEDをON-OFFできる。~ ただ、USBに接続した時点(初期)状態で全bitに5Vが出ている。でも、出力電流が少ないのかLEDはほとんど光らない。 ただ、USBに接続した時点(初期)状態で全bitに5Vが出ている。でも、出力電流が少ないのかLEDはほとんど光らない。~ 使う場合はプルダウンする必要があるだろう。 #ref(FT245_LED.jpg) 広告 |