【本サイトのご利用指針】
当サイトはSPAM対策等のためJavaScriptを使っています。
JavaScriptの実行を可能な状態にしてご利用下さい。
Please enable the execution of JavaScript!






































































【トランジスタ技術2013年3月号】
『FT232RL USBシリアル変換モジュールで

I2CやSPIインターフェースを構成する』

  【リンクフリー】 私設研究所ネオテックラボ Neo-Tech-Lab.co.uk
【記載者】 私設研究所Neo-Tech-Lab.com 上田智章
【掲載日】2013年02月08日
 
ここにチェックボックス型外部コンテンツ・メニューが入ります。




【ブラウザはGoogle Chrome】
●最新版ダウンロードはこちら

【お知らせ】

Windows7でChromeがフリーズを起こす場合は、コントロールパネル⇒管理ツール⇒サービス でWindows Media Player Network Sharing Serviceを停止かつ無効にします。Micorosoftのバグです。


【トランジスタ技術2013年3月号】
『プログラム不要!USB-シリアル変換モジュール』

【Appendix】(57-58頁)
★マイコンを使わないので、マイコンのプログラムが不要と言う意味です。
 パソコン側のソフトウェアは必要です。念のため。

【写真1】USBインターフェースの加速度センサの例

【FTDIクローンチップで発生する不具合について】

FT232RLが実装されたモジュールを購入したつもりでも、ロゴまでそっくりに印刷されたクローンチップ(偽物)が実装されたモジュールが出回っています。どうやら中国でプリント基板実装を行う際に、安価なクローンが実装されているようなのですが、これらのクローンユーザーのプリント基板にUSBで認識しなくなる事態が相次いでいるはずです。詳しくは以下のリンクを参照してください。
【Slashdot.jp】FTDIのUSBシリアルドライバに模造品対策機能が搭載される?
【Slashdot.jp】FTDI、クローンチップを動作しないようにするドライバーをWindows Updateから削除

【はじめに】

以前はセンサと言えばアナログ出力のものが殆どでしたが、最近はセンサがモバイル機器に組み込まれるアプリケーションが増えたので、SPIやI2Cと言ったシリアル・インターフェース仕様のデジタルタイプのセンサ・デバイスが増えてきました。
多くのセンサ・デバイスは写真1に示すように非常に小さなパッケージが使われていることが多くなりました。ウェアラブルな計測システムを開発する上では、こういった小さなデバイスを積極的に活用していく必要性が増してきています。
センサ・デバイスがSPIあるいはI2Cのようなオンボード上で使われるシリアル通信インターフェースを持っている場合に普通に考えると、測定データを一旦マイコンで受けてから信号処理を行うメイン・コンピュータに中継するというのが一般的な方法だと思います。
しかし、それでは中継用マイコンのソフトウェアを組み、デバッグする工数、測定用ボードのコストなどに悩まされる結果となります。
SPIやI2C等のシリアル・インターフェースに特化したUSBインターフェースもありますが、まだ少し高く、入手性も良くないようです。
そこで定番USB-シリアル・インターフェースとして知られるFTDI社のFT232RLを使う方法を考えてみました。写真2に示すように安く、コンパクトなセンサを簡単に構成することができます。しかもマイコンを使わず、直接パソコンに接続するので、マイコンのソフトウェアを作成する必要がなく、Visual C#やVisual Basic.Netだけで開発することができます。

【写真2】Kionix社製直交3軸加速度センサ(±2G,±4G,±8G)

【写真3】USBインターフェースを持った加速度センサの例

【サンプル・ソフトウェア】

1) 秋月電子通商のFT232RL USB-シリアル・モジュールを使うには、FTDI社のデバイス・ドライバーをインストールします。
 I2Cインターフェースを実現するために必要なD2XX (Dynamic Link Library)はVirtual Comm Portドライバーに同梱しています。
  ★【FTDI社のダウンロード・サポートページ】
 上記URLより、32bitあるいは64bit対応のWindows用ドライバーの圧縮ファイル(zip形式)をダウンロードして解凍します。
 『CDM 2.08.24 WHQL Certified.zip』が最新版です。解凍すると、トップ・ディレクトリ内に.inf形式ファイルが2つ存在するはずです。
2) XPやVistaなら、ケーブル接続すれば自動的に認識してくれます。
 トップ・ディレクトリを参照すれば、インストールが行えるはずです。
3) しかし、Windows7はこの手順に失敗するはずです。
 コントロールパネル⇒デバイスマネージャーで認識に失敗したデバイスを選択して、右クリックのメニューで、
 ドライバーソフトウェアの更新(P)を実行する必要があります。
 正常にインストールが完了したら、シリアルポートが作成されたはずです。
4) Visual C# 2010 ExpressあるいはVisual Studio 2012 Express for Windows Desktop をインストールしておきます。
5) FTDI_BitBangI2C_3.zip(C#プロジェクトファイル)

【D2XX DLLと同期型BitBangモード】

FT232RLはUSB-シリアル・インターフェースの定番デバイスですが、パソコンにそのデバイス・ドライバであるVCP (Virtual Comm Port)をインストールすると、D2XXというDLL (Dynamic Link Library)も同梱されており、Windows7の64bitOSの場合ならC:ドライブのWindows/System32/にftd2xx.dllがインストールされています。
実はこのftd2xx.dllには、本来の非同期シリアル通信のための関数だけでなく、非常に多機能なデバイス再設定用関数が用意されており、パラレル・ポートや他のシリアル・インターフェースとして使うことができるようになっています。


【D2XXの必要な関数】

Visual C#から同期型BitBangモードを使うために必要な関数群を以下に列挙します。
使い方はサンプルプログラムを参考にしてください。

【FT ListDevices】

 パソコンに接続されているFTDI社製デバイスのリストを得る関数です。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_ListDevices(void* pArg1, void* pArg2, UInt32 Flags);
 例:【デバイス数を調べる】
   UInt32 numDevices;
   UInt32 FT_Status = FT_ListDevices(&numDevices, null, 0x80000000);

【FT Open】

 指定番号のデバイスをオープンし、ハンドル番号を取得します。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_Open(Int16 DeviceNumber, UInt32* ftHandle);
 例:【デバイス番号0をオープン】
   UInt32 FT_Status;
   UInt32 FT_Handle;
   FT_Status = FT_Open(0, &FT_Handle);

【FT Close】

 指定ハンドル番号のデバイスをクローズします。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_Close(UInt32 ftHandle);
 例:FT_Handle1(UInt32)に格納されたハンドル番号のデバイスをクローズする
   FT_Status = FT_Close(FT_Handle1);

【FT SetBitMode】

 指定ハンドル番号のデバイスのモードを設定します。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_SetBitMode(UInt32 ftHandle, Byte Mask, Byte Enable);
   // Mask 1:出力 0:入力 Enable: 0x4: 同期Bit Bangモード 1:BitBangモード 0:ハンドシェークモード
 例:ハンドル番号FT_Handle1(UInt32)のデバイスをD7,D1を入力に残りを出力にして同期BitBangモードに設定します。
     FT_Status = FT_SetBitMode(FT_Handle1, 0x7D, 0x04);

【FT GetBitMode】

 現在設定中のビットモードを取得します。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_GetBitMode(
     UInt32 ftHandle,
     [MarshalAs(UnmanagedType.LPArray)] byte[] bdata);

【FT SetBaudRate】

 ポートの更新速度を設定します。マニュアルによれば16倍のクロックで変更されるとのことです。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_SetBaudRate(UInt32 ftHandle, UInt32 BaudRate);
 例:ハンドル番号FT_Handleのデバイスのデータ更新速度を115200bpsに設定
   FT_Status = FT_SetBaudRate(FT_Handle, 115200);

【FT Read】

 指定バイト数のデータを指定バッファに読込ます。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_Read(
     UInt32 ftHandle,
     [MarshalAs(UnmanagedType.LPArray)] byte[] bdata,
      UInt32 dwBytesToRead, UInt32* lpBytesReturned);

【FT Write】

 指定バッファ内にある指定バイト数のデータを出力します。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_Write(
     UInt32 ftHandle,
     [MarshalAs(UnmanagedType.LPArray)] byte[] bdata,
     UInt32 dwBytesToWrite, UInt32* lpBytesWritten);

【FT Purge】

 ドライバ側バッファ内にある受信したデータや送信未完了のデータを消去する。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_Purge(UInt32 ftHandle, UInt32 Mask);

【FT GetStatus】

 ドライバ側バッファ内にある受信済みデータや送信未完了データのバイト数を取得する。
 定義:    [DllImport("ftd2xx.dll")]
   unsafe private static extern UInt32 FT_GetStatus(
     UInt32 ftHandle, UInt16* lpRxBytes, UInt16* lpTxBytes, UInt16* lpEventWord);

【シリアルモードと同期型BitBangモードの違い】

 同期型BitBangモードでは、指定したシリアルクロック速度に同期してFT232RLの8ビットのI/Oポートのうち、出力ポートに指定されているポートが同時に変化します。
入出力方向はプログラムで自由に変更できますが、元々のシリアル・モードで設定された入力・出力のピン割り当てをそのまま引き継いだ方が、出力どうしの衝突を避けるためにも心がけた方が良いでしょう。

【図】モードによる動作の違い

【赤外線近接センサの例】

Rohm株式会社の照度近接センサ RPR-0400(J)もI2Cインターフェースのデバイスです。
照度センサとして環境光の照度を測定できるだけでなく、内蔵の赤外線LEDで投影して反射光強度を測定することで10cm程度の距離を測定することができます。
こんなに小さなパッケージのデバイスですが、指を動かすだけで組込機器を操作するようなNUI(Natural User Interface)を構成することができます。

【写真】照度・赤外線近接センサの例

【図】内部ブロック図

【加速度センサの例】

スポーツ・エレクトロニクスにおいては、呼吸、心拍(HR: Heart Rate)、心電図(ECG: Electrocardiograph)、GPS地理情報(Global Positioning System Geo Location)とともに3軸直交加速度センサで取得できる加速度は定番の生体信号と言えます。運動に伴う人体への衝撃の強さや方向がわかるからです。加速度センサに要求される測定レンジは、運動の激しさによっても異なりますが、日常生活の範囲なら±2g、激しいスポーツでは少なくとも±6g程度が要求されます。
3軸直交加速度センサは数年前まではアナログ出力のものが主流でしたが、現在ではスマートフォンやモバイル機器などでタップ(指先でコンコンと軽く叩く)動作の検出などにも利用されているせいもあり、マイコンとの直接接続が容易なSPIやI2Cといったデジタル・インターフェースの品種が多く開発されています。
アナログ出力のセンサはA/Dコンバータが必要になり、パソコンとの間にマイコンを介する必要性から開発が面倒です。そこで写真1に示すように秋月電子通商の定番USBシリアル変換モジュールAE-UM232R(FTDI社FT232RLを実装)を使ってI2Cインターフェースの加速度センサを安価に直接接続する方法を紹介いたします。



下側の緑色の基板は秋月電子通商のAE-UM232R。本来は実装されているストレートピンを抜き取っている。使用した加速度センサはKionix社のKXTI9-1001。パッケージは3×3×0.9mmのLGAプラスチックパッケージ。ベーク基板に穴を掘って逆向きに埋め込み、細い銅線を使ってワイヤーボンディングして実装した。

【写真1】秋月電子通商のUSB-シリアルモジュールを利用した直交3軸加速度センサ

【KXTI9-1001】

Rohm株式会社の子会社米国Kionix社の直交3軸加速度センサは、秋月電子通商の3軸加速度センサモジュールKXM52-1050(アナログ出力タイプ)やMicrosoft社のKinectセンサの仰角制御にも使用されており、既によく知られています。

     
【例1】Kinectには重量方向を基準として水平状態を基準とした仰角制御を行う目的でKionix社の直交3軸加速度センサが使用されている。Kinect for Windows SDK Version1.6からは加速度センサの値をパソコン側に読込んで利用することが可能になった。

KXTI9-1001は写真2に示すように3×3×0.9mmLGAプラスチックパッケージに封止された3軸直交加速度センサで、I2Cインターフェースを持ち、電源電圧DC1.8~3.6Vで動作します。測定レンジはソフトウェア切り替えが可能で、±2g、±4g、±8gに対応しています。
図1に示すようにパッケージは10ピンですが6ピンのみ使用します。ノイズ・パス・コンデンサは積層セラミックコンデンサ0.1μF(104)を使用します。表1にピン配置を示します。2,3,6,8ピンは接続してはいけません。INTは割り込み処理を使う場合のピンでポーリング処理しか行わないのであれば接続の必要はありません。
INTを使用しないのであれば、たった5本の接続だけで利用することができるわけです。


   ●Kionix社のKXTI9-1001の製品情報ページ
【写真2】KXTI9-1001のパッケージ外観


【図1】KXTI9-1001のピン配置と内部ブロック


【表1】ピン番号とピン名称の対照表

【I2Cについて】

I2Cインターフェースは、同一基板上に実装された複数のデバイス間の近距離通信を2線式で行う通信インターフェースの名称です。図2に示されるようにマスター・デバイスが出力するシリアルクロック(SCL)と、データ入出力やハンドシェークで共用する双方向シリアルデータ(SDA)の2本のラインを使います。SCL、SDAともにプルアップ抵抗が接続され、通信が行われない状態では常にHighレベルに保たれている必要があります。
しかしながら、マスターデバイスが1個だけならSCLラインを利用するのはそのマスターデバイスだけであるので、3S出力にせずに常時、通常ロジック出力を出力し続けるのであれば、SCLラインのプルアップ抵抗は省略することができます。


【図2】I2Cインターフェースのデバイス接続方法

【I2Cの通信プロトコルについて】

通信はバイト単位に行われます。SDAにはデータだけでなく、どのスレーブ・デバイスをアクセスするのかを示す7ビットのスレーブ・アドレスやデータの書き込みか読出しかを示すビット、AckやNack、通信開始や終了を示すStart ConditionやStop Conditionが出現します。データのビット転送順は常に上位ビット(MSB)からになります。図3にSCLとSDAのタイミングを例示します。


【図3】SCLとSDAのタイミング例

【KXTI9-1001の通信シーケンス】

図4に示す通り、KXTI9-1001の通信シーケンスは4種類あります。通常のレジスタ設定にはSequence1を、加速度データの読出しにはSequence3ないしSequence4を用います。

【Start ConditionとStop Condition】

通信は、マスター・デバイスによってSCLがHighレベルのときにSDAがHighレベルからLowレベルに変化すると、Start Conditionが成立して開始されます。反対に、SCLがHighレベルのときにSDAがLowレベルからHighレベルに変化すると、Stop Conditionが成立して通信が終了します。

【通常のデータ】

Start ConditionとStop Condition以外の通常のデータ転送は、SDAは常にSCLがLowレベルになってから変化させ、SCLをLow⇒High⇒Lowと変化させます。

【スレーブ・アドレスとアクセス方向】

Start Condition成立後は常に7ビットのスレーブ・アドレスを上位ビットから送出し、続いて書込みか読出しかを示すビット(WriteはLow、ReadはHigh)をスレーブに送ります。続いてマスター側がSCLをLow⇒High⇒Lowと変化させるとき、スレーブはSDAをLowレベルにしてAckを返します。

【スレーブへのデータ書込み】

マスターからスレーブへのデータ書込みが指定されている場合には8回のSCLのLow⇒High⇒Lowに同期して書込みデータが上位ビットから送られます。さらにマスターが1回SCLをLow⇒High⇒Lowと変化させるタイミングでスレーブ側からSDAをLowレベルにしてAckを返します。

【スレーブからのデータ読込み】

スレーブからマスターへのデータ読込みが指定されている場合には8回のSCLのLow⇒High⇒Lowに同期してスレーブ側から読込みデータが上位ビットから送られます。さらにマスターが1回SCLをLow⇒High⇒Lowと変化させるタイミングでマスター側からSDAをLowレベルにしてAckをスレーブに返します。

【データ転送の継続性】

データ書込みあるいは読込みはアクセス方向が変わらない限り、連続して構いません。Stop Conditionが出現するまでアクセスは継続されます。


【図4】KXTI9-1001の通信シーケンス

【KXTI9-1001の主なレジスタ一覧】

KXTI9-1001にはタップ検出やチルト検出など多数の機能が実装されており、複雑なFIFO動作モードなどが用意されているため、内部レジスタの数は多いのですが、とりあえず加速度を検出して取り込むだけなら、3つのコントロールレジスタと6つの読出しレジスタだけを取り扱えばOKです。

【KXTI9-1001のスレーブ・アドレス】

KXTI9のスレーブ・アドレスは0001111Bに固定されています。

【KXTI9-1001のモード設定】

KXTI9-1001は非常に複雑な機能を持った高機能なデバイスですが、最低限度の3軸加速度の計測を行う為に設定が必要なレジスタはCTRL_REG1(レジスタ・アドレスは1BH)だけです。モード設定のための他のレジスタは多いのですが、デフォルト設定のままで使用することができます。図5に示すように、PC1ビットで動作状態(Operating Mode)と待機状態(Stand By Mode)を切り替えることができます。他のビットの設定を切り替えるには必ず待機状態(PC1=0)で設定を行う必要があります。
分解能12ビット、測定レンジ±8gで加速度測定を行うのであれば、レジスタ(1BH)に2回書込みを行う必要があります。1回目に01011000B=58H、2回目に11011000B=D8Hを書き込みます。

【加速度計測値の読出し】

図8に示すように、加速度測定データの読出しには6個のレジスタ(06H, 07H, 08H, 09H, 0AH, 0BH)を読み出す必要があります。注意すべき点は下位バイト、上位バイトの順に並んでいることと、左詰めでデータが並んでいるので、下位バイトのレジスタの下位4ビットが無効なデータである点です。
分解能8ビットのモードでは上位バイトと下位バイトに4ビットずつデータが分かれてしまう設計なので注意が必要です。パソコンでは殆どメリットがありません。12ビットで読み込む方が良いでしょう。



           PC1 0:StandByMode  1:OperatingMode
           RES  【A/D分解能】0:8bits 1:12bits
           DRDYE【DataReady反映機能】 0:非許可 1:IntにDataReadyが反映される
           GSEL1, GSEL0,  Range
               0,     0,   ±2g
               0,     1,   ±4g
               1,     1,   ±8g
               1,     1,     NA
           TDTE【DirectionalTap機能】    0:非許可 1:許可
           WUFE【モーション検出時WakeUp】0:非許可 1:許可
           TPE 【チルト位置検出】        0:非許可 1:許可
【図5】コントロールレジスタ1



           OTDTH【TapDataの出力速度】0:SLOWER 1:FASTER
             LEM  【左】left
             RIM  【右】right
             DOM  【下】down
             UPM  【上】up
             FDM  【面下】face down
             FUM  【面上】face up
【図6】コントロールレジスタ2



           SRST 【RAM reboot】0:NoAction 1:Start RAM Reboot
           OPTA, OPTB
              0,    0,  1.6Hz
                0,    1,  6.3Hz
                1,    0, 12.5Hz(default)
                1,    1,   50Hz
             DCST 【SelfTest】0:NoAction
             (OTDTH),OTDTA,OTDTB【DirectionTap用出力データ速度】
                   0,    0,    0,   50Hz
                   0,    0,    1,  100Hz
                   0,    1,    0,  200Hz
                   0,    1,    1,  400Hz(default)
                   1,    0,    0, 12.5Hz
                   1,    0,    1,   25Hz
                   1,    1,    0,  800Hz
                   1,    1,    1, 1600Hz
             OWUFA,OWUFB 【MotionWakeUpの出力速度】
                 0,    0,   25Hz
                 0,    1,   50Hz(default) 
                 1,    0,  100Hz
                 1,    1,  200Hz
【図7】コントロールレジスタ3


【図8】データ読出しレジスタ

【製作例】

~ USBシリアル変換モジュールAE-UM232Rで
            I2Cインターフェースを構成する ~

図9に秋月電子通商のUSBシリアル変換モジュールAE-UM232Rを使ったI2Cインターフェースの回路を例示します。図中に記載のリセット回路や3端子レギュレータの電源回路はKXTI9-1001に接続を行う場合にはオプションであり、必須ではありません。
さて、秋月電子通商のUSBシリアル変換モジュールAE-UM232RにはFTDI社のFT232RLが実装されており、殆どの人はVCP(Virtual Comm Port)ドライバを用いてシリアルポートとして使用されるはずです。しかし、無償提供されているドライバにはD2XXも同梱されています。D2XXはDLLを介してシリアルポートとして利用できる他、BitBangモードを使って、FT232RLを汎用8ビットポートとして使うことができます。特に同期BitBangモードは秀逸でバイト単位に書込みを行うと同期して読出しを行うことができる特徴があります。入出力の方向もビット単位に変更することができます。但し、I2Cインターフェースを構成するために、一つのビットに対して入出力を切り替えて使用するのはWindowsの制約で速度が遅くなってしまうので、出力用のビット(D0:TxD)は1kΩの抵抗を通して、入力用のビット(D1:RxD)と接続して、SDAラインとします。D0:TxDをLowにすることにより強制的にSDAをLowレベルに、D0:TxDをHighにすればSDAはHighレベルとなります。マスターが出力しない状態は、出力用のビット(D0:TxD)をHighレベルにして、SDAをプルアップ状態に維持します。マスターがプルアップの状態で、もしスレーブ・デバイスがSDAにLowを出力すればSDAはLowレベルとなるため、入出力方向を切り替えずにD1:RxDでデータラインのモニターが行えます。また、D4:DTRはSCL出力として、D7:RIはINT入力として使用します。
LGAパッケージの実装(はんだづけ)には通常はリフロー炉でのはんだづけが必要となってしまいます。試作では時間的余裕も数を作るのも難しい場合が多いので、手作業でのLGA実装方法を考えてみました。プリント基板加工機を使ってプリント基板を作る際に、写真3に示すように基板上にLGAがちょうどすっぽり入る四角い溝を掘りました。パッケージをひっくり返して埋め込み、接着剤でしっかり固定しました。多芯ケーブル線の撚線の1本を使って『ワイヤ・ボンディング』を行いました。先にパッケージのパッドにハンダをつけておくのがコツです。
LGAがすっぽり入る溝を掘ってデバイスを埋め込んだので、プリント基板のパターンとLGAのピンの高さが揃いました。ワイヤーボンディング(ハンダづけ)作業は比較的容易に裸眼で行うことができました。デバイスが固定されて動かないことと高さが揃うことはハンダづけには好条件であるようです。
これまで、新規デバイスを使いたくてもチップの裏側にハンダづけが必要であるため、リフロー炉を通す必要があり、ウルトラ超特急納期の少量試作プロジェクトでは使えずに敬遠していたのですが、これで道が開けたように思います。

【図9】製作物の回路図


【写真3】アマチュア的LGAデバイス実装方法の事例

【Visual C#】

リスト1にVisual C#でのコーディング事例を示します。加速度センサのモードレジスタへの設定には図4のシーケンス(Sequence)1を、測定値データレジスタ(XoutL, XoutH, YoutL, YoutH, ZoutL, ZoutH)からの読出しにはシーケンス(Sequence)3を用いています。
クロックSCLとデータSDAの変化するタイミングを考慮した結果、このソフトウェアでは、同期BitBangモードを図10のように1クロック分のタイミングを4フェーズに分割して記述しています。図11に動作状態の表示例を示します。図12に取得したデータをExcelでグラフを表示した事例を示します。

   ●FTDI_BitBangI2C_3.zip(C#プロジェクトファイル)


【図10】SCLとSDAのタイミング


【図11】C#で製作したソフトウェアの表示例


【図12】取得した運動時加速度の観測データの例



【トランジスタ技術2013年3月号】
『プログラム不要!USB-シリアル変換モジュール』

【Appendix】(57-58頁)
★マイコンを使わないので、マイコンのプログラムが不要と言う意味です。
 パソコン側のソフトウェアは必要です。念のため。

【図1】I2C-USBインターフェースの構成事例