Построение графика данных датчика Arduino в реальном времени на Processing, MatLab или Python
У меня есть акселерометр, подключенный к моему Arduino Due, чтобы выдавать данные на мой последовательный монитор, как описано в моем предыдущем посте. Я пытаюсь найти скетч, который я мог бы использовать для построения непрерывного графика в реальном времени либо в Processing, либо в MatLab, либо с помощью Python MatPlot.
Данные акселерометра хранятся в массивах xArray[k]
для значений координаты x, yArray[k]
для значений координаты y и zArray[k]
для значений координаты z. Как построить график этих значений в реальном времени? Заранее спасибо.
@dada, 👍1
3 ответа
Надеюсь, это будет вам полезно.
Сначала вам нужно прочитать о последовательной связи между 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/
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)
- Построение графика на Python с использованием Tkinter Canvas
- Связь между Python и Arduino ненадежна
- Serial.availableForWrite против Serial.flush
- Аналоговые и цифровые акселерометры – плюсы и минусы
- Протокол связи Arduino с python — помимо примера pyserial и Arduino
- Переменная устанавливает значение 32767 — MATLAB Arduino
- Отправка значений с помощью pyserial не работает, если на Arduino Due также есть распознавание.
- Выход устанавливается на «низкий», когда новая переменная в буфере