MATLABでのシリアルポートの値の表示と保存

Arduinoで加速度ジャイロセンサを使い、
Serial.println(gx); %%これはArduinoコードの一部です
としてgxの値をMATLABでも表示させたく、
arduin = serialport('COM18',9600); %シリアルポートに接続
fopen(arduin);
fwrite(arduin,'a')
gx = zeros(100,1); %ここにデータを保存
uicontrol('String','Pause','Callback','jin=0;');
jin=1;
while(jin)
gx(end) = fscanf(arduin,'%d')
drawnow;
plot(gx)
gx(1:end-1)=gx(2:end);
title('mpu signal');
xlabel('time[s]');
ylabel('angle');
end
fclose(arduin);
% csvwrite('raw.txt',theta)
とすると、データをリアルタイムで表示することは出来るのですが、例えばArduinoのコードを
Serial.print(gy); Serial.print(" , "); %%これはArduinoコードの一部です
Serial.println(gx);
といった感じで2つのデータを表示、保存したい場合はどのようにコードを変更すればよいのでしょうか?
ご教授お願いいたします。

Answers (1)

Atsushi Ueno
Atsushi Ueno on 1 Oct 2022
Edited: Atsushi Ueno on 1 Oct 2022

1 vote

gxを1列から2列に増やせば、新たな変数gyを作らなくても2つのデータを同時に扱えます。
arduin = serialport('COM18',9600); %シリアルポートに接続
fopen(arduin);
fwrite(arduin,'a')
gx = zeros(100,2); % ここにデータを保存(1列⇒2列に拡張)
uicontrol('String','Pause','Callback','jin=0;');
jin=1;
while(jin)
temp = fscanf(arduin,'%d,%d'); % 受信データは[gx; gy]のベクトルで受け取る見込み
gx(end,:) = temp'; % 転置したベクトル1行をgxの最後の行に追加する
drawnow;
plot(gx)
gx(1:end-1,:)=gx(2:end,:); % ここも変更
title('mpu signal');
xlabel('time[s]');
ylabel('angle');
end
fclose(arduin);
csvwrite('raw.txt',gx); % 保存はコメントアウトされたこのコードでOK
writematrix(gx,'raw.txt'); % R2022aなら、開発が続いているこっちの方が良いです

4 Comments

Ochi Kai
Ochi Kai on 1 Oct 2022
コメントありがとうございます。
教えていただいた通りに実行してみたのですが、値がすべて0を受け取ってしまいます。Arduinoの
Serial.print(gy); Serial.print(" , "); 
Serial.println(gx);
辺りのコードが良くないのでしょうか?(Arduinoのシリアルモニタには二つの値は 0.00 , 0 のようにしっかり表示されます。)
良く見るとスペース記号が含まれていますね。また、gyは整数ではなく浮動小数点数ですね。
Arduino側が下記の通りなら、
Serial.print(gy); Serial.print(" , "); 
Serial.println(gx);
MATLAB側はこうしなければなりませんね
temp = fscanf(arduin,'%f , %d');
ありがとうございます。
一応そちらでも試してみたのですが上手くいきませんでした。
Aruino側ではint型でgx,gyを宣言しています。それに伴い
temp = fscanf(arduin,'%d , %d')
としましたが、値がAruinoのシリアルポートと違う値を出します。
gxを見てみると、1列目と2列目が同じ値を取得している為、グラフ上でも2つの線は完全に被っています。
現状を簡潔にまとめます、
Serial.print(gx);Serial.println(gy); %これはAruinoのコード、gxとgyはint型
delay(100);
としていて、Aruinoのシリアルモニタでは求めている数値がしっかりと反映されています。
temp = fscanf(arduin,'%d,%d');
これがMATLABコードで、恐らくAruinoの1つ目のgxは上手く表示されていますが、gx(MATLAB側の変数)を見ると1列目と2列目が全く同じ値(Aruinoのgxの値)を取得している状態です。

Sign in to comment.

Categories

Find more on MATLAB Support Package for Arduino Hardware in Help Center and File Exchange

Products

Release

R2022a

Asked:

on 1 Oct 2022

Commented:

on 4 Oct 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!