[1] USB-IOとシリアル変換モジュール USB-IO 【2008/10/11 08:54:00】[返信][編集][削除] [PC] 「簡単!USBで電子制御-たっくんとTRY!HSP言語、USB-O、USB-An」(km2net、小松博史)
という本を使ってUSB-IOの簡単な出力制御からやってみようと思ったのですが、本で紹介されているUSB-IOを使わず、FTDI社製USBシリアル変換モジュールMFT232RL を代用しようと思ったのですが、http://km2net.com/books/download/hsp_kantan_seigyo/
でダウンロードできる制御ソース(たとえば、『usbio\Program\02_USB-IO\output.exe』)で「USB-IOが見つかりません」と表示されてしまいます。USBシリアル変換モジュールMFT232RLを代用するには、どのようにスクリプト(『usbio\Program\02_USB-IO\usb-io.hsp』)を書きかえればよろしいのでしょうか?ご享受ください。 | | | [2] Re:USB-IOとシリアル変換モジュール バケさん 【2008/10/11 09:06:57】[編集][削除] [EZ]W42H 残念ながら汎用USB-IOとシリアル変換モジュールとは全くと言っていいぐらい別物なのでプログラムの流用は難しいと思います。
データシートを取り込んで調べてみますので少しご返事に時間がかかると思います。 | | | [3] Re:USB-IOとシリアル変換モジュール USB-IO 【2008/10/11 09:11:23】[編集][削除] [PC] ありがとうございます。
大変困っています。
よろしくお願いいたします。 | | | [4] Re:USB-IOとシリアル変換モジュール バケさん(管理人) 【2008/10/14 00:27:43】[編集][削除] [PC] 現在、データシートを取り寄せて調査中です。
調べて分かっていることは以下の通りです。
専用のドライバーが必要のようですね。
シリアル・インターフェースで接続する必要があるみたいです。
以下、調査内容です。
---------------------
マルツメイク館のオリジナル商品
FTDI社製USBシリアル変換モジュールMFT232RL
MFT232RLはFTDI社のFT232RLを搭載したUSBシリアル変換モジュールです。
マイコンやロジック回路とシリアル・インターフェースで接続することで、
各種機器を簡単にUSB対応にできます。
■特長■
・24ピンのDIP IC(ワイドタイプ:600mil幅)とほぼ同じサイズです。
同梱の丸ピンプラグを実装すれば、ICのように手軽に扱えます。
・PCからは仮想COMポートとして認識されるので、
プログラム上もUSBを意識することなく簡単に通信できます。
・USBバス・パワー動作が可能なので、別途電源を用意する必要はありません。
外部電源での動作も、ジャンパピン1個で切り替えられます。
・外部インターフェースは5V/3.3Vのいずれにも対応できます。
また、I/O電圧を外部から供給することで、
任意の電圧でインターフェースできます。
▼FTDIメーカーサイト(ドライバをダウンロードできます)
http://www.ftdichip.com/
http://www.ftdichip.com/Drivers/VCP.htm (Windowsドライバーはここにあります)
http://www.ftdichip.com/Documents/AppNotes.htm (資料はこちらをご覧ください)
| | | [5] Re:USB-IOとシリアル変換モジュール バケさん(管理人) 【2008/10/14 12:53:34】[編集][削除] [PC] ドライバーをVCPではなくD2XXを使うと汎用IOとして使えるようです。
いろんな記述がC言語でかかれているので、HSPで使えるように直す必要があると思います。
HSPは得意ではないので使えそうなHSPソースが出来るのはかなり時間がかかりそうです。私事ですが、現在本業が繁忙なため時間が取れそうにありません。
最後に示したサンプルソースが理解できてHSPに組み直しが出来る人がいればいいのですが・・・
FT232RLは自分でも持っているので時間が取れたらトライしてみる予定です。
いつになるかは不明です、やりたいことやしないといけないことが溜まっているのですみません。
以下調査内容
----------------------------------
FTDIのUSBシリアル変換IC FT232RL にはデータ端子を8bitの双方向IOポートとして使う Bit-Bang モードがあります。このモードを使えば FT232RL に接続したハードウェアをPCアプリから直接制御することができます。
FTDIから Bit-Bang モードを利用する為の D2XX ドライバが提供されています。D2XX ドライバは Windows, Linux, MacOSX と各種プラットフォーム用のドライバが提供されています。
Bit-Bangモードの使い方
http://ore-kb.net/hard/BitBang/
【具体的な使い方 (初期化編)】
1. FT_Openでデバイスをオープン
まずはオープンから。これはBit-Bangでなくても同じです。
2. FT_SetBaudRateで入出力間隔を設定
Bit-Bangが有効になっている間は、FT_SetBaudRateで設定した時間間隔で入出力が行われます。
9600と指定したら1/9600=104us周期で入出力が行われるのではなく、指定値×16となります。すなわち、9600と指定した場合、1/(9600×16)=6.51us周期となります。
…そのような事がFTDIの資料に書いているのですが、
実際に測ったところ、指定値×4付近をふらついています。
標準外の周期を指定したい場合は、FT_SetDiviserを使います。
3. FT_SetBitModeでBit-Bangモードを有効にする
FT_SetBitModeにて、Bit-Bangモードの有効・無効、どのビットを入力にするか、出力にするかを設定します。
第2引数が入出力設定(該当するビットが0なら入力、1なら出力)、第3引数がBit-Bangモードの有効(=1)・無効(=0)設定です。
Bit-Bangモードが有効になると、FT8U232/245BM問わず、入力設定の端子はハイ・インピーダンス、出力設定の端子は直前のFT_Write出力値(電源投入時は0x00)になります。
そして、FT_SetBaudRateにて設定された周期で入出力端子がサンプリングされ、端子状態が受信バッファに逐次格納、送信バッファのデータが入出力端子より逐次出力されます。送信バッファが空の場合は、直前の送信データが出力され続けます。
例1) Bit-Bangモード無効
FT_SetBitMode(handle, 0x00, 0);
例2) Bit-Bangモード有効・D0〜D7を入力に設定
FT_SetBitMode(handle, 0x00, 1);
例3) Bit-Bangモード有効・D0〜D3を入力、D4〜D7を出力に設定
FT_SetBitMode(handle, 0xf0, 1);
【具体的な使い方 (読み書き編)】
出力はFT_Writeで
出力設定された端子にデータを出力するには、FT_Writeを使って送信バッファに出力データを設定します。
送信バッファに蓄えられたデータは、FT_SetBaudRateにより設定された周期で出力設定された端子より出力されます。
入出力端子の"その時点で"の状態取得はFT_GetBitModeで
FT_GetBitModeを使うと、入出力端子のその時点での状態を取得することが出来ます。
ただし、USBの仕様上でしょうか? それなりの時間が掛かるので、端子状態のポーリング等には不向きです。
実測値では、1回のAPI呼び出しにつき約4ms掛かりました。
連続した入出力端子の状態取得はFT_Readで
入出力端子の状態取得を連続して行う場合は、FT_Readを使い、受信バッファから一括してデータを取得します。
受信バッファを溢れさせないために、受信データの取得は別スレッドにした方が良いでしょう。
サンプルソース
BYTE bInData; // 入力データ
BYTE bOutData; // 出力データ
DWORD dwWritten; // 書き込んだバイト数
FT_HANDLE hFt; // デバイスのハンドル
// デバイス(1番目)をオープン
FT_Open(0, &hFt);
// Bit-Bangモード有効・D0〜D3を入力、D4〜D7を出力に設定
FT_SetBitMode(fTt, 0xf0, 1);
while(1)
{
// スイッチの状態を取得
FT_GetBitMode(fTt, &bInData);
// 取得した状態を4bitずらす
bOutData = bInData << 4;
// スイッチの状態を出力
FT_Write(hFt, &bOutData, 1, &dwWritten);
}
| | | [6] Re:USB-IOとシリアル変換モジュール バケさん(管理人) 【2008/10/15 13:00:07】[編集][削除] [PC] VBA(ExcelマクロやVB)のサンプルをみつけました。
これをもとにHSP用に直すと簡単かも
'FTDI ダイレクト・ドライバーの使用宣言--------------------
Private Declare Function FT_Open Lib "FTD2XX.DLL" (ByVal intDeviceNumber As Integer, ByRef lngHandle As Long) As Long
'------------------------------------------------------------------------------
Private Declare Function FT_Close Lib "FTD2XX.DLL" (ByVal lngHandle As Long) As Long
'------------------------------------------------------------------------------
Private Declare Function FT_Write Lib "FTD2XX.DLL" (ByVal lngHandle As Long, WritBuffer As Any, ByVal lngBufferSize As Long, ByRef lngBytesWritten As Long) As Long
'------------------------------------------------------------------------------
Private Declare Function FT_SetBaudRate Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal lngBaudRate As Long) As Long
'------------------------------------------------------------------------------
Private Declare Function FT_SetBitMode Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal ucMask As Byte, ByVal ucEnable As Byte) As Long
'------------------------------------------------------------------------------
Private Declare Function FT_GetBitMode Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ucRData As Any) As Long
' Return codes
Const FT_OK = 0
' USB Handle
Dim lngHandle As Long
'------------------------------------------------------------------------------
' USB OPEN FT_OPEN関数を使いUSBをノーマルオープンする。
Public Function UsbOpen() As Long
Dim Rt As Long
Rt = FT_Open(0, lngHandle)
Rt = FT_SetBaudRate(lngHandle, 19200)
Rt = FT_SetBitMode(lngHandle, &H0, 1)
UsbOpen = Rt
End Function
'------------------------------------------------------------------------------
' USB Close FT_Close関数を使いUSBを閉じる。
Public Sub UsbClose()
FT_Close (lngHandle)
End Sub
'------------------------------------------------------------------------------
' USB Write FT_Write関数を使いデータを出力する。
Public Function UsbWrite(data As Byte, wlen As Long) As Boolean
Dim Ln As Long
UsbWrite = FT_Write(lngHandle, data, wlen, Ln)
End Function
'------------------------------------------------------------------------------
' USB Read FT_GetBitMode関数を使いデータを入力する。
Public Function UsbRead() As Byte
Dim Rd As Byte
Dim Rt As Long
Rt = FT_GetBitMode(lngHandle, Rd)
UsbRead = Rd
End Function
'------------------------------------------------------------------------------
' USB Read FT_SetBitMode関数を使いBit制御をする。
Public Function UsbBitSet(bitdata As Byte) As Boolean
UsbBitSet = FT_SetBitMode(lngHandle, bitdata, 1)
End Function
| | | [7] Re:USB-IOとシリアル変換モジュール バケさん(管理人) 【2008/10/18 13:07:02】[編集][削除] [PC] 先に紹介したVBAのサンプルですが、下記のサイトから取ってきました。
Bit-BangのテストプログラムがExeclで書かれていました。
専用のドライバーをインストールして、このサンプルを少し手直しすれば動きそうです。
回路(結線)はMFT232RLに合わせる必要があります。
USBチップICはFT232RLではなく、FT232BMを使っているようです。
西日本常盤商工のUSB Moduleのページです。
http://www.tokiwa-west.co.jp/USB_Module/USB.htm | | | [8] Re:USB-IOとシリアル変換モジュール USB-IO 【2008/10/23 22:58:40】[編集][削除] [PC] 貴重な資料ありがとうございます。
RS-232Cはオンラインスコープ等で、ハード的には身近なものでしたが、ソフトが入ると、まだまだ、勉強が必要と痛感しています。
制御プログラムが完成しましたらメールします。
ありがとうございました。 |
|