2017-06-22 4 views
1

現在、私はRaspberry Pi 3モデルBからアナログ - デジタルコンバータ(ADC)の2チャンネルのデータを送信しているプロジェクトに取り組んでいます。 2つのUDPポートを介してデータを正常にコンピュータに送信するCコードを記述しました。この2つのデータを2つの別々のプロットでリアルタイムにプロットします。 1つのプロットだけを表示しようとすると、リアルタイムの値が表示されます。これは、ジェネレータからの信号をカットすると、プロットで見ることができるからです。しかし、これを2つの別々のプロットで試したところ、値はプロットされましたが、リアルタイムではプロットされませんでした。ジェネレータから信号をカットすると、信号があるようなプロットが表示されます。最初はバッファサイズの問題だと思ったので、バッファサイズを1024から32に変更しました(RPiは浮動小数点データ値を送信するため)。また、私は一時停止期間を台無しにしました。どちらも私にとっての解決策ではありませんでした。複数のプロットがあるとリアルタイムプロットはリアルタイムではありません

ここは私のPythonコードです。

#!/usr/bin/env python3 

import time, random 
import math 
from collections import deque 
import socket 
UDP_IP = "192.168.180.25" 
UDP_PORT1 = 5013 
UDP_PORT2 = 5012 

sock1 = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
sock1.bind((UDP_IP, UDP_PORT1)) 

sock2 = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
sock2.bind((UDP_IP, UDP_PORT2)) 

start = time.time() 


class RealtimePlot: 
    def __init__(self, axes, max_entries=100): 
     self.axis_x = deque(maxlen=max_entries) 
     self.axis_y = deque(maxlen=max_entries) 
     self.axes = axes 
     self.max_entries = max_entries 

     self.lineplot, = axes.plot([], [], "ro-") 
     self.axes.set_autoscaley_on(True) 

    def add(self, x, y): 
     self.axis_x.append(x) 
     self.axis_y.append(y) 
     self.lineplot.set_data(self.axis_x, self.axis_y) 
     self.axes.set_xlim(self.axis_x[0], self.axis_x[-1] + 1e-15) 
     self.axes.relim(); 
     self.axes.autoscale_view() # rescale the y-axis 

    def animate(self, figure, callback, interval=50): 
     import matplotlib.animation as animation 
     def wrapper(frame_index): 
      self.add(*callback(frame_index)) 
      self.axes.relim(); 
      self.axes.autoscale_view() # rescale the y-axis 
      return self.lineplot 

     animation.FuncAnimation(figure, wrapper, interval=interval) 


def main(): 
    from matplotlib import pyplot as plt 

    fig, axes = plt.subplots(2) 
    display1 = RealtimePlot(axes[0]) 
    display2 = RealtimePlot(axes[1]) 
    while True: 
     data1, addr = sock1.recvfrom(32) 
     display1.add(time.time() - start, data1) 
     data2, addr = sock2.recvfrom(32) 
     display2.add(time.time() - start, data2) 
     plt.pause(0.0001) 


if __name__ == "__main__": main() 

Plot image

EDIT:私は両方のチャンネルに同じ信号を与えています。だから、プロットがイメージで同じであることに気にしないでください。

答えて

0

私は現在、ラズベリーパイから送られた各データ間100000μs(0.1秒)に10000μs(0.01秒)からの時間間隔を増やすことで、問題を解決するために管理してきました。

関連する問題