より現実的なデータを使ってシミュレーションしたい場合や、実測データの解析をしたい場合には、MATLABやそのオプション製品が持つデータI/O機能を利用すると、ファイルからデータを読み出したり、外部機器から直接データを取得したりすることができます。オプション製品によって対応している機器やファイルフォーマットが異なります。これから何回かにわたって、データI/Oに関して色々な機能や使用例をご紹介したいと思います。
前回ご紹介したArduino Unoを使ったモータ制御の例では、目標値信号として5秒周期のSin波を入力していました。本当に意図したとおりに回転しているのか、Unoに搭載されているAnalog入力ポートで取得した回転角信号を、PC上のMATLABにデータを取り込んで解析してみましょう。
Arduino Unoに実装するモデルには、Analog Input信号をシリアル通信で送信するブロックを新たに追加しました。図中の水色のブロックが追加したブロックです。
MATLABでシリアルデータを受信するコマンドは次のようになります。
シリアル通信を行うオブジェクトを作成します。COMポート番号はPCのデバイスマネージャを参照して、それに合わせます。
>> serialObj = serial(‘COM8’)
Serial Port Object : Serial-COM8
Communication Settings
Port: COM8
BaudRate: 9600
Terminator: 'LF'
Communication State
Status: closed
RecordStatus: off
Read/Write State
TransferStatus: idle
BytesAvailable: 0
ValuesReceived: 0
ValuesSent: 0
転送速度などの設定を必要に応じて変更します。
>> set(serialObj, 'BaudRate', 57600)
Serial Port Object : Serial-COM8
Communication Settings
Port: COM8
BaudRate: 57600
Terminator: 0
Communication State
Status: closed
RecordStatus: off
Read/Write State
TransferStatus: idle
BytesAvailable: 512
ValuesReceived: 0
ValuesSent: 0
シリアル通信オブジェクトをデバイスに接続後、データを読み込み/書き込みし、デバイスを切断します。
>> fopen(serialObj) % serial port オブジェクトと接続
>> tmp = fscanf(serialObj) % ASCIIデータでHeader = A
tmp =
AC
>> ad_data(n) = typecast(uint8(tmp(2:3)), 'uint16'); % Little Endian2バイトのデータを変換
ans =
67
>> fclose(serialObj) % serial port オブジェクトの切断
連続データを取得するため、Simulinkでシリアルデータを受信して表示してみましょう。Serial Configurationブロックは、シリアル通信の設定を行うためのブロックで、通信ポート番号、Baud Rate、データビット、パリティの有無、バイトオーダーなどを設定します。前述したMATLABプログラムによるシリアル通信例で示した">> set(serialObj, ParameterName, Parameter)"と同様です。
Serial Receiveブロックは実際にデータを受信するブロックで、ヘッダ、ターミネータ、サンプル時間などを設定します。このシリアル通信をSimulink上で行うブロックは、オプション製品のInstrument Control Toolboxで提供されています。
Serial Receiveブロックからの出力信号線を右クリックし、メニューが現れたらプロパティを選択し、「信号データのログ」にチェックを入れます。こうすることで、Simulinkモデル内の時系列データはMATLABワークスペースに保存され、シミュレーション後にMATLABの機能を使って解析や可視化が出来るようになります(ログを取るにはコンフィギュレーションパラメータ/データのインポート/エクスポートにある「信号のログ」設定も有効になっている必要があります)。
著者紹介
松本 充史(まつもと あつし)
MathWorks Japan
アプリケーションエンジニアリング部
シニアアプリケーションエンジニア
Mathworks JapanではMATLABの中でも特に信号処理やコード生成に関する機能を担当している。
今回の記事で紹介しているMATLABコードやSimulinkモデルのファイルをご要望の方はこちらまでお問い合わせ下さい。