パソコンでアナログ入力
パソコンでアナログデータの取得が行えると,色々と応用が広がります. ですが,インターフェースに必要な機材は結構高価だったりします.
ここでは秋月で安価に買える部品を組み合わせてアナログ電圧ロガーを製作してみます.
使用する主な部品を以下に示します.
品名 | 価格 | 概要 |
---|---|---|
FT232RL USBシリアル変換モジュール | 950円 | BitBangModeを使ってSPIをエミュレートします."SPI-USB bridge"として使います. |
MCP3208-CI/P | 280円 | SPI対応8ch12bitADC.Vrefは外付け.こいつをFT232RLから叩きます. |
NJM431L | 30円 | シャントレギュレータ.ADCの基準電圧源として使います.USBバスパワー電圧の精度はあてにできません. |
作成例
左側の黒いのはポテンショメータ.動作テスト用に接続.ポテンショのかわりに電圧出力の温度センサを繋げば温度ロガーになる.
本プロジェクトのメリット
通信するにあたり,覚えることが少ない.紹介する通信ソフト(BBSPI.exe)の使い方と,エクセルが使えれば十分.
これに加えて,基板,細々としたCRでロガーを作ることができます.
BitBangModeによるSPIエミュレートアプリ/BBSPI.exe
FTDIが提供するD2XXDriverを使ってBitBangModeを操ります.FTDIのサイトや先人の方々の情報が豊富にあるので簡単に使えます.今回は.Net版のFDT2XX_NET.dllを使いました.
プロジェクトをここに置いておきます.詳細はコード参照.
プログラム本体.動作させるためには,"FTD2XX_NET.dll"が必須ですが同梱していません.FTDIさんのwebサイトから各自ダウンロードし, プログラム本体と同じフォルダにdllを置いてください.
概要としては,コマンドライン引数で渡した16進文字列をSPIに変換して送信し,同時に受信したデータを16進文字列で出力します. このプログラムだけでは実用性はありません.リダイレクトでCSVファイルに落として,エクセルで追加工したりして使ってください.
エミュレート形式
項目 | 値/説明 |
---|---|
ビットオーダー | MSB先行 |
送受信長 | 8bitの整数倍限定(7bitとか9bitでの送信はできません).データ長に制限はありません. |
データ/クロック形式 | (1,1)or(0,0)/SCKのアップエッジでデータラッチ,SCのダウンエッジでデータシフトアウト. |
ビットレート | よしなに(最高で100kHzぐらい) |
オプション一覧
コマンド | 機能 | 省略可/不可 | 例 |
---|---|---|---|
-d [H,H,,,] | 送信データ指定.カンマ区切り16進数で指定.複数個指定可能. | 不可 | -d a5,80とすると,0xA580を送信します. また,-d 12 -d 34とすると,まず0x12を送信し,一回CSのネゲートを入れてから,0x34を送信します. |
-b [d] | ボーレート指定 | 可.省略時は115200が指定されます. | -b 9600とすると,9600×16/2でデータを投げますが,あまり当てにならない.×16がドライバ仕様で,/2しているのは2つのデータで1クロックを作るため. |
-r [d1,d2] | 繰り返し回数(d1),繰り返し時間間隔(d2)を指定.時間の単位はミリ秒.時間精度は悪い. 繰り返し回数にゼロを指定すると,無限に実行します.停止したいときはCtrl+C. |
可.省略時は,1回だけ送信します. | -r 100,1000とすると,-dで指定したデータを100回送信します.送信間隔は1000ミリ秒です. |
戻り値一覧
番号 | 内容 | 説明 |
---|---|---|
1 | ループ回数 | 何番目のデータかを示します. |
2 | 時刻 | 通信を実行した時刻を[hh;mm;ss]形式で示します. |
3 | 時刻(ミリ秒) | 通信を実行した時刻をミリ秒で示します. |
4,,, | 受信データ | 受信データを16進数で示します.1バイトごとに区切られて返却されます. |
ハードウエア接続(FT232RL bitbang 対応関係(秋月モジュール))
ピン名称 | ピン番号(FT232RL) | DOUTbit | ADC接続ピン | IO方向(FT232) |
---|---|---|---|---|
TXD | 1 | D0 | DIN | OUT |
#DTR | 2 | D4 | CLK | OUT |
#RTS | 3 | D2 | CS | OUT |
RXD | 5 | D1 | DOUT | IN |
実際に測定してみる
約1000ミリ秒間隔で,MCP3208のCH0に印加されている電圧のログを採ることを考えます. このときMCP3208に送信するデータは,0x06,0x00,0x00です.なんでこうなるのかは,MCP3208のデータシート参照. 対応するオプション指定子は,"-d 06,00,00"です. 加えて,1000ミリ秒で無限繰り返しするため,"-r 0,1000"を指定します.
あとは,返却値を表計算ソフトで後処理するため,返却値をファイルに落とします.これに対応するのが"| tee dump.csv"です.
"dump.csv"を表計算ソフトで開きます.
ここでのポイントは,AD変換結果だけ取り出す方法です.3バイトの返却値のうち,必要な値は,下位12bitです.3バイト中,後の2バイトをまずhex2dec()で数値に変換し, さらに,bitand()で必要な下位12bitを取り出します.時刻を横軸に,取り出した12bitを縦軸にとってグラフを作ることで,データロガーになります.その他応用
ここではADCと接続した例を示しましたが,SPIにさえ対応していれば,その他デバイスと接続することも可能です. DACと組み合わせてプログラマブル電圧源を作ったり,シフトレジスタと組み合わせてデジタルIOを作ることもできます.