Построение графика данных датчика Arduino в реальном времени на Processing, MatLab или Python

У меня есть акселерометр, подключенный к моему Arduino Due, чтобы выдавать данные на мой последовательный монитор, как описано в моем предыдущем посте. Я пытаюсь найти скетч, который я мог бы использовать для построения непрерывного графика в реальном времени либо в Processing, либо в MatLab, либо с помощью Python MatPlot.

Данные акселерометра хранятся в массивах xArray[k] для значений координаты x, yArray[k] для значений координаты y и zArray[k] для значений координаты z. Как построить график этих значений в реальном времени? Заранее спасибо.

, 👍1


3 ответа


1

Надеюсь, это будет вам полезно.

Сначала вам нужно прочитать о последовательной связи между Matlab и Arduino. Сначала вам нужно установить связь между этими двумя.

Затем обратите внимание на формат данных, поступающих с вашего акселерометра. В моем случае я работаю с IMU, и мой формат данных, как пример: #YPR = 2.34, 13.23, -2.20

Затем из Matlab вам нужно написать скрипт, который сможет прочитать эту строку и определить любое значение с плавающей точкой.

Вот что я сделал в Matlab. YPR = Yaw, Pitch, Roll

data = fscanf(s);              %Read Data from Serial
[Y(count),P(count),R(count)] = strread(data, '#YPR = %f,%f,%f');

Затем вам нужно настроить график и заставить Matlab обновить график в реальном времени.

%set() is used to set graphic object properties
       set(plotGraph1,'XData',time,'YData',Y,'color','r');  
       set(plotGraph2,'XData',time,'YData',P,'color','g');
       set(plotGraph3,'XData',time,'YData',R,'color','b');
       drawnow;           %force matlab to updata plot instantaneously

Ссылка ниже — хорошее место, чтобы начать. Но вам нужно внести в нее некоторые изменения.

https://billwaa.wordpress.com/2013/07/10/matlab-real-time-serial-data-logger/

,

1
 import serial #import Serial Library
 import numpy  # Import numpy
 import matplotlib.pyplot as plt #import matplotlib library
 from drawnow import *

 accelX = []
 accelY = []
 accelZ = []

arduinoData = serial.Serial('COM4', 115200)
plt.ion()    #Tell matplotlib you want interactive mode to plot live data
cnt = 0
def makeFig():         #Create a function that makes our desired plot
#plt.ylim(0,1000)                #Set the limit on the y axis
plt.title('Sensor data')         #Set the title
plt.grid(True)                   #Set The grid
plt.ylabel('Axis Acceleration')  #Label the y axis
plt.plot(accelX,'ro-', label='Raw X Acceleration') #Set the line plot 
plt.ylim(0, 1000)
plt.legend(loc = 'upper left')
plt2 = plt.twinx()  #Create a new object of plt2 
plt2.plot(accelY, 'b^-', label='Raw Y Acceleration')
#plt2.ylim(0,1000)
plt2.legend(loc='center right')
plt2.ticklabel_format(useOffset=False) #Compel matplotlib not to autoscale
#plt3 = plt.twinx()
plt.plot(accelZ, 'go-', label='Raw Z Acceleration')
plt.legend(loc='upper right')
plt.ylim(0,1000)

 while True: #While loop that loops forever
   while(arduinoData.inWaiting() == 0):   #Wait here until there is data
    pass #do nothing
arduinoString = arduinoData.readline() #read the line of text from serial 
dataArray = arduinoString.strip().strip('\n')  #Split into an array
# Ensure that you are not working on empty line
if arduinoString:
    dataArray = arduinoString.split(",") 
# Ensure that index is not out of range
if len(dataArray) > 1:
    xAxis = int(dataArray[0]) #Convert first element to int insert in xAxis
    yAxis = int(dataArray[1]) #Convert second element to int insert in yAxis
    zAxis = int(dataArray[2]) #Convert third element to int insert in zAxis
    print xAxis, ",", yAxis, ",", zAxis
    accelX.append(xAxis)   #Build our x axis array by appending to accelX
    accelY.append(yAxis)   #Build our y axis array by appending to accelY
    accelZ.append(zAxis)   #Build our z axis array by appending to accelZ
    drawnow(makeFig)       #Call drawnow to update our live graph
    plt.pause(.0000001)
    cnt=cnt+1
    if(cnt>50):
        accelX.pop(0)
        accelY.pop(0)
        accelZ.pop(0)
,

1

MATLAB имеет бесплатное дополнение для подключения к оборудованию Arduino.

,