Main Content

シリアル ポート通信を使用した Arduino からのストリーミング データの読み取り

この例では、serialport インターフェイスを使用して Arduino® Due から ASCII で終端処理されたストリーミング データを読み取るために、コールバックを有効にする方法を説明します。

Arduino へのプログラムの読み込み

Arduino Due をコンピューターに接続します。

Arduino IDE を使用して、以下のプログラムの Arduino Due に読み込みます。このプログラムは正弦波の連続点を書き出し、続いて "キャリッジ リターン" と "改行" の終端文字を書き出します。

/*
 SineWavePoints
 
 Write sine wave points to the serial port, followed by the Carriage Return and LineFeed terminator.
 */

int i = 0;

// The setup routine runs once when you press reset:
void setup() {
  // Initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// The loop routine runs over and over again forever:
void loop() {
  // Write the sinewave points, followed by the terminator "Carriage Return" and "Linefeed".
  Serial.print(sin(i*50.0/360.0));
  Serial.write(13);
  Serial.write(10);
  i += 1;
}

Arduino への接続の確立

serialport インスタンスを作成して、Arduino Due に接続します。

Arduino の接続先のシリアル ポートを見つけます。ポートは Arduino IDE から特定できます。

serialportlist("available")'
ans = 3×1 string
    "COM1"
    "COM3"
    "COM13"

Arduino コードで指定されているポートとボー レートを使用して serialport オブジェクトを作成することにより、Arduino Due に接続します。

arduinoObj = serialport("COM13",9600)
arduinoObj = 
Serialport with properties

                 Port: "COM13"
             BaudRate: 9600
    NumBytesAvailable: 0
      NumBytesWritten: 0

Show all properties

データのストリーミングを開始するための serialport オブジェクトの準備

古いデータをクリアしプロパティを構成することで、serialport オブジェクトを構成します。

Arduino コードで指定した終端文字と一致するように Terminator プロパティを設定します。

configureTerminator(arduinoObj,"CR/LF");

serialport オブジェクトをフラッシュして、古いデータを削除します。

flush(arduinoObj);

Arduino データを保存するために UserData プロパティを準備します。struct の Data フィールドは正弦波の値を保存し、Count フィールドは正弦波の x 軸値を保存します。

arduinoObj.UserData = struct("Data",[],"Count",1)
arduinoObj = 
Serialport with properties

                 Port: "COM13"
             BaudRate: 9600
    NumBytesAvailable: 10626
      NumBytesWritten: 0

Show all properties

最初の 1000 個の ASCII 終端処理された正弦波データ点を読み取って結果をプロットするコールバック関数 readSineWaveData を作成します。

function readSineWaveData(src, ~)

% Read the ASCII data from the serialport object.
data = readline(src);

% Convert the string data to numeric type and save it in the UserData
% property of the serialport object.
src.UserData.Data(end+1) = str2double(data);

% Update the Count value of the serialport object.
src.UserData.Count = src.UserData.Count + 1;

% If 1001 data points have been collected from the Arduino, switch off the
% callbacks and plot the data.
if src.UserData.Count > 1001
    configureCallback(src, "off");
    plot(src.UserData.Data(2:end));
end
end

BytesAvailableFcnMode プロパティを "terminator" に、BytesAvailableFcn プロパティを @readSineWaveData に設定します。コールバック関数 readSineWaveData は、新たな正弦波データ (終端文字付き) が Arduino から読み取りできるようになるとトリガーされます。

configureCallback(arduinoObj,"terminator",@readSineWaveData);

コールバック関数は、最初の 1000 個の正弦波データ点のプロットとともに MATLAB® の Figure ウィンドウを開きます。