広告
*FTDIのチップでデジタルI/O [#yb35b9b9] [[FT232]]や[[FT245]]はシリアル通信だけでなく、デジタルI/O(パラレル)デバイスとして使うことができる。~ 「bitbang」と読んでいる。~ 「bitbang」と呼ばれている。~ C言語系で書く場合は[[libFTDI]]を参照。~ ここではPythonに関して記述。 **準備 [#zc2bfb10] PythonでFTDIのチップを取り扱うモジュールはいくつかあるが、ここでは[[libFTDI]]のpythonバインドを使う。~ DebianとUbuntuの場合は「python-ftdi」というパッケージをインストールする。 **プログラム例 [#vced4c40] パーミッションに注意。rootでないと動かない場合があります。 パーミッションに注意。rootでないと動かない場合があります。~ 下はPythonでの簡単な例。全ピンのON-OFFをしてから、個々のピンのON-OFFをしている。また、対応するピンは以下の通り |ポート|ピン名(FT232RL)|pin| |bit0|TXD|1| |bit1|RXD|5| |bit2|RTS|3| |bit3|CTS|11| |bit4|DTR|2| |bit5|DSR|9| |bit6|DCD|10| |bit7|RI|6| #!/usr/bin/python # coding: UTF-8 import ftdi import time #for Wait def main(): ftdic = ftdi.ftdi_context() #ftdi_contextの宣言 ftdi.ftdi_init(ftdic) #FTDIチップの初期化 f = ftdi.ftdi_usb_open(ftdic, 0x0403, 0x6001) #FTDIチップをオープン 0x0403, 0x6001はlsusbなどで調べる。おそらく同じ #print f if(f < 0 and f != -5): #エラートラップ。-5はftdi_sioが動いていた時のエラー print"unable to open ftdi device:", f, ":", ftdi.ftdi_get_error_string(ftdic) exit() print "ftdi open succeeded:",f print "enabling bitbang mode" ftdi.ftdi_enable_bitbang(ftdic, 0xFF) #すべてのビットをbitbangに設定 ftdic = ftdi.ftdi_context() #ftdi_contextの宣言 ftdi.ftdi_init(ftdic) #FTDIチップの初期化 f = ftdi.ftdi_usb_open(ftdic, 0x0403, 0x6001) #FTDIチップをオープン 0x0403, 0x6001はlsusbなどで調べる。おそらく同じ #print f if(f < 0 and f != -5): #エラートラップ。-5はftdi_sioが動いていた時のエラー print"unable to open ftdi device:", f, ":", ftdi.ftdi_get_error_string(ftdic) exit() print "ftdi open succeeded:",f print "enabling bitbang mode" ftdi.ftdi_enable_bitbang(ftdic, 0xFF) #すべてのビットをbitbangに設定 buf = chr(0x0) print "turning everything off" f = ftdi.ftdi_write_data(ftdic, buf, 1) #00を書き込み。つまりすべてOFF buf = chr(0x0) print "turning everything off" f = ftdi.ftdi_write_data(ftdic, buf, 1) #00を書き込み。つまりすべてOFF if(f < 0): #エラートラップ。 print "Write failed for ",hex(ord(buf)), " ", f, " : " , ftdi.ftdi_get_error_string(ftdic) exit() time.sleep(1) #Wait 1sec buf = chr(0xFF) print "turning everything on" f = ftdi.ftdi_write_data(ftdic, buf, 1) #00を書き込み。つまりすべてON if(f < 0): #エラートラップ。 print "Write failed for ",hex(ord(buf)), " ", f, " : " , ftdi.ftdi_get_error_string(ftdic) exit() time.sleep(1) #Wait 1sec buf = chr(0x0) print "turning everything off" f = ftdi.ftdi_write_data(ftdic, buf, 1) #00を書き込み。つまりすべてOFF if(f < 0): #エラーとトラップ。 print "Write failed for ",hex(ord(buf)), " ", f, " : " , ftdi.ftdi_get_error_string(ftdic) exit() time.sleep(5) #Wait 1sec print "PORT check" for i in range(8): buf = chr(2**i) print "bit = ",i,": hex = ",hex(2**i) f = ftdi.ftdi_write_data(ftdic, buf, 1) #書き込み。 if(f < 0): #エラートラップ。 print "Write failed for ",hex(ord(buf)), " ", f, " : " , ftdi.ftdi_get_error_string(ftdic) exit() time.sleep(2) print "disabling bitbang mode" ftdi.ftdi_disable_bitbang(ftdic) #bitbangモードを終了 ftdi.ftdi_usb_close(ftdic) #デバイスを閉じる ftdi.ftdi_deinit(ftdic); # if __name__ == "__main__": main() 広告 |