より現実的なデータを使ってシミュレーションしたい場合や、実測データの解析をしたい場合には、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モデルのファイルをご要望の方はこちらまでお問い合わせ下さい。