storing arduino serial data to cell array

7 vues (au cours des 30 derniers jours)
Ritter
Ritter le 1 Août 2014
Commenté : harold le 14 Mai 2018
I have an Arduino Mega 2560 that reads and outputs raw the x, y and z accelerometer sensor values of 3 different acceleromters(shown below):
void loop()
{
int hip_x = analogRead(hip_xpin);
int hip_y = analogRead(hip_ypin);
int hip_z = analogRead(hip_zpin);
int knee_x = analogRead(knee_xpin);
int knee_y = analogRead(knee_ypin);
int knee_z = analogRead(knee_zpin);
int ankle_x = analogRead(ankle_xpin);
int ankle_y = analogRead(ankle_ypin);
int ankle_z = analogRead(ankle_zpin);
if(digitalRead(pulse)== LOW)
{
Serial.print(hip_x);
Serial.print("\t");
Serial.print(hip_y);
Serial.print("\t");
Serial.print(hip_z);
Serial.print("\t");
Serial.print(knee_x);
Serial.print("\t");
Serial.print(knee_y);
Serial.print("\t");
Serial.print(knee_z);
Serial.print("\t");
Serial.print(ankle_x);
Serial.print("\t");
Serial.print(ankle_y);
Serial.print("\t");
Serial.print(ankle_z);
Serial.print("\n");
count=count+1;
while (digitalRead(pulse)== LOW)
{
//do nothing
}
}
}
The Arduino is meant to synchronize with a motion capture system running at 60 frames per second and then take accelerometer values once per frame. I wrote a Matlab script to read and store the values into a cell array.
%clear all;
s1 = serial('COM9'); %define serial port
s1.BaudRate=115200; %define baud rate
%data=zeros(490<)
%open serial port
%set(s1, 'terminator', 'LF');
fopen(s1);
s1.ReadAsyncMode = 'continuous';
count =1;
%data = cell(480,10);
%evalin('data', 's1');
readasync(s1);
while(s1.BytesAvailable <= 0) %wait until Arduino outputs data
end
while (1)
%while(s1.BytesAvailable > 0)
data = fscanf(s1); %read sensor
flushinput(s1);
disp(data);
%disp(count)
%count = count+1;
% end
end
% close the serial port!
fclose(s1);
However no matter how I play with the 'fscanf' function to store the incoming values into an array I keep getting a dimension mismatch error. When I display the incoming serial values I get this:
515 511 620 515 514 622 502 495 624
515 511 620 515 514 622 502 495 624
corresponding to the x, y and z values of each acceleromter respectively. I would like to keep this format but have Matlab store it in a cell array for further processing. Can anyone explain how I may accomplish this?

Réponses (2)

Juan B. Gutierrez
Juan B. Gutierrez le 4 Avr 2015
Ritter, it has been a few months since you asked this, but I ran into it yesterday. The trick is to know that the serial gives you a string, and you have to split it using strsplit. Here is a solution:
In your Arduino code, send the values separated by tab (any other character works as well):
Serial.print(accelerationX);
// print a tab character:
Serial.print("\t"); // Use this character in MATLAB
Serial.print(accelerationY);
Serial.println();
The following MATLAB code loads it into a matrix:
sFile = 'AcceDualAxis.csv';
if exist(sFile) == 0 ; % if the file does not exists, read instrumentation
delete(instrfindall); %pre-emptively close all ports
s1 = serial('COM5'); %define serial port to read the Arduino
s1.BaudRate=115200; %define baud rate
fopen(s1);
s1.ReadAsyncMode = 'continuous';
readasync(s1);
while(s1.BytesAvailable <= 0) %wait until Arduino outputs data
%
end
mData = [];
for i=1:1000 %while if constant acquisition is needed.
sSerialData = fscanf(s1); %read sensor
flushinput(s1);
t = strsplit(sSerialData,'\t'); % same character as the Arduino code
mData(i,1) = str2double(t(1));
mData(i,2) = str2double(t(2));
end
delete(instrfindall); % close the serial port
csvwrite(sFile,mData); % save the data to a CSV file
else % if the file exists, load it
mData = csvread(sFile);
end
  3 commentaires
James Hornby
James Hornby le 11 Avr 2015
Modifié(e) : James Hornby le 11 Avr 2015
Hi, Iv sort of managed to get it to work by copying and pasting the line:
mData(i,1) = str2double(t(1));
Replacing it with:
mData(i,1) = hex2dec(t(1));
and Iv managed to select just the 12, 20th and 21st byte of the packet.
However, the function never runs to completion and to generate my .csv file, it only manages between 20 and 70 cycles before it crashes out and produces the error message:
"Error using serial/fscanf (line 154) Unsuccessful read: Index exceeds matrix dimensions.
Error in RouterPacketIn (line 14) sSerialData = fscanf(s1); %read sensor"
Any thoughts on what is causing the crash? If its something to do with errors in the comms is there any way of just telling the code to ignoore it and carry on?
Thanks again
aqsa aqsa
aqsa aqsa le 21 Sep 2016
Hi, James. i am working on a matlab code which recieves values in the form of string from arduino. And there are four values in a string i recieve. Now i have to split all four of these in a cell array. But after storing first two values i am recieving the error of Index exceeds matrix dimensions. Please guide me how u manage to read the values in an array of 1000x3.

Connectez-vous pour commenter.


Chirag Gupta
Chirag Gupta le 1 Août 2014
Have you taken a look at the Serial_Monitor? Might solve your issue http://www.mathworks.com/matlabcentral/fileexchange/45839-serial-monitor--debugger-
  2 commentaires
Ritter
Ritter le 4 Août 2014
Modifié(e) : Ritter le 4 Août 2014
Thank you for the reply. This was exactly what I needed. However, it outputs nonsense characters when I run the Arduino. I tried to fix this by changing the baud rate on the Matlab side(in the "Test & measurement Tool")to match the baud rate of the Arduino, and it still outputs these characters. Do you know how to remedy this?
Thanks.
harold
harold le 14 Mai 2018
Hey, did you solved the situation? If so, would you mind sharing the code? Because I face with a similar problem. Thx.

Connectez-vous pour commenter.

Catégories

En savoir plus sur MATLAB Support Package for Arduino Hardware dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by