このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
シリアル ポート通信を使用した Arduino からのストリーミング データの読み取り
この例では、serialport
インターフェイスを使用して Arduino®
ボードから ASCII で終端処理されたストリーミング データを読み取るために、コールバックを有効にする方法を説明します。
この例では Arduino Due を使用しますが、ほとんどの Arduino ボードで適切に動作するはずです。
Arduino へのプログラムのアップロード
Arduino ボードをコンピューターに接続します。
Arduino IDE を使用して、次のプログラムを Arduino®
ボードにアップロードします。このプログラムは正弦波の連続点を書き出し、続いて "キャリッジ リターン" と "改行" の終端文字を書き出します。
/* 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 routine loops 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 への接続の確立
MATLAB で、既存の serialport
接続をすべて閉じます。
delete(serialportfind);
Arduino の接続先のシリアル ポートを見つけます。ポートは Arduino IDE から特定できます。この例では、ポート COM4
に接続できることを Arduino IDE が示しているとします。使用可能なすべてのポートをリストして、このポートがマシン上に存在することを確認します。
serialportlist("available")
ans = 1×2 string
"COM3" "COM4"
serialport
オブジェクトを作成することにより、Arduino Due に接続します。Arduino コードで指定されたポートとボーを使用します。
serialObj = serialport("COM4",9600)
serialObj = Serialport with properties: Port: "COM4" BaudRate: 9600 Tag: "" NumBytesAvailable: 15 Show all properties, functions
データのストリーミングを開始するための serialport
オブジェクトの準備
serialport
オブジェクトを構成するには、そのプロパティを構成し、古いデータをクリアします。
Arduino コードで指定した終端文字と一致するように Terminator
プロパティを設定します。
configureTerminator(serialObj,"CR/LF");
serialport
オブジェクトをフラッシュして、古いデータを削除します。
flush(serialObj);
Arduino データを保存するために UserData
プロパティを準備します。ここでは、Data
フィールドに正弦波値が含まれ、収集されたデータ点数を Count
で記録する struct として UserData
を定義します。この構造により、これらの関連情報に対する系統的かつ効率的なアクセスと更新が可能になります。
serialObj.UserData = struct("Data",[],"Count",1)
serialObj = Serialport with properties: Port: "COM4" BaudRate: 9600 Tag: "" NumBytesAvailable: 0 Show all properties, functions
新しい MATLAB ファイルで、最初の 1,000 個の ASCII 終端処理された正弦波データ点を読み取って結果をプロットするコールバック関数 readSineWaveData
を作成します。この関数は、データをいつプロットするかを決定する引数 maxDataPoints
を受け取ります。
function readSineWaveData(src, ~, maxDataPoints) % 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 over maxDataPoints points have been collected from the Arduino, switch off the % callbacks and plot the data, starting from the second point. if src.UserData.Count > maxDataPoints configureCallback(src, "off"); plot(src.UserData.Data(2:end)); end end
終端文字で示された新しいデータが Arduino から読み取りできるようになるたびに readSineWaveData
関数を実行するようにシリアル ポート オブジェクトを構成します。次の configureCallback
コマンドは、BytesAvailableFcnMode
を "terminator"、BytesAvailableFcn
プロパティを readSineWaveData
関数へのハンドルに設定します。
maxDataPoints = 1002;
configureCallback(serialObj, "terminator", @(src,event) readSineWaveData(src,event,maxDataPoints))
コールバック関数は、最初の 1,000 個のデータ点のプロットを含む MATLAB Figure を開きます。