|
【ブラウザはGoogle Chrome】
●最新版ダウンロードはこちら 【お知らせ】Windows7でChromeがフリーズを起こす場合は、コントロールパネル⇒管理ツール⇒サービス でWindows Media Player Network Sharing Serviceを停止かつ無効にします。Micorosoftのバグです。 |
【トランジスタ技術2013年3月号】
|
|
【リンクフリー】 私設研究所ネオテックラボ Neo-Tech-Lab.jp 【記載者】 私設研究所Neo-Tech-Lab.jp 上田智章 【掲載日】2013年02月08日 |
|
ここにチェックボックス型外部コンテンツ・メニューが入ります。 | |
|
【ブラウザはGoogle Chrome】
●最新版ダウンロードはこちら 【お知らせ】Windows7でChromeがフリーズを起こす場合は、コントロールパネル⇒管理ツール⇒サービス でWindows Media Player Network Sharing Serviceを停止かつ無効にします。Micorosoftのバグです。 |
|
【トランジスタ技術2013年3月号】
【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】ピン番号とピン名称の対照表 |
【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月号】
【Appendix】(57-58頁) |
【図1】I2C-USBインターフェースの構成事例 |