2011-03-31 2 views
2

파이썬으로 코드를 작성하여 직렬 포트를 통해 초음파 거리 측정기와 통신하면 다음을 수행 할 수 있습니다.
-0.1 초. 센서는 거리 측정을하고, 센서
마지막 오초파이썬과 matplotlib을 사용하여 데이터를 동시에 수집하고 그래프를 업데이트하십시오.

다음

의 모든 거리 측정의 플롯 내 코드의 - 표시의 응답 등록 : 지금

import serial 
import numpy as np 
import time 
from matplotlib import pyplot as plt 

tagnr=2#Tag number of the sensor that we're pinging 
samplingRate=.1#Sampling Rate in seconds 
graphbuf=50.#Buffer length in samples of logger graph 

!#Initialize logger graph 
gdists=np.zeros(graphbuf) 
ax1=plt.axes() 

!#Main loop 
nsr=time.time()#Next sample request 
try: 
    while True: 
     statreq(tagnr)#Send status request to sensor over serial port 
     temp,dist=statread(tagnr)#Read reply from sensor over serial port 
     gdists=np.concatenate((gdists[1:],np.array([dist]))) 
     print gdists 
     nsr=nsr+samplingRate 
     while time.time()<nsr: 
      pass 

finally: 
    ser.close()#Close serial port 
    print 'Serial port closed.' 

, 내 코드를 마지막 50 mea 배열을 얻을 수있다. 확실하지만, 동시에 그래프로 표시하는 방법을 모르겠습니다 (보통 Matplotlib를 사용하여 그래프를 그립니다). 스레딩을 사용해야합니까? 아니면 pyGTK 또는 pyQt4를 사용하여 애니메이션 그래프를 사용합니까? 나는 파이 게임 (pygame) 사용을 고려하고 있었습니까? 타이밍 메커니즘이 너무 좋지는 않지만 꽤 정확하다고 생각합니다.

답변

1

matplotlib에는 플롯이 표시되는 동안 데이터를 업데이트 할 수있는 애니메이션 플롯이 있습니다 (take a look at this page).

코드는 다음과 같습니다

import serial 
import numpy as np 
import time 
from matplotlib import pyplot as plt 

plt.ion() # set plot to animated 

tagnr=2#Tag number of the sensor that we're pinging 
samplingRate=.1#Sampling Rate in seconds 
graphbuf=50.#Buffer length in samples of logger graph 

!#Initialize logger graph 
gdists=np.zeros(graphbuf) 
ax1=plt.axes() 

# make plot 
line, = plt.plot(gdists) 

!#Main loop 
nsr=time.time()#Next sample request 
try: 
    while True: 
     statreq(tagnr)#Send status request to sensor over serial port 
     temp,dist=statread(tagnr)#Read reply from sensor over serial port 
     gdists=np.concatenate((gdists[1:],np.array([dist]))) 
     print gdists 

     line.set_ydata(gdists) # update the data 
     plt.draw() # update the plot 

     nsr=nsr+samplingRate 
     while time.time()<nsr: 
      pass 

finally: 
    ser.close()#Close serial port 
    print 'Serial port closed.' 

그냥 몇 가지 조언 (아마도 나쁜) : 저는 개인적으로 정확도를 잃지 않고 어떤 프로세서를 해제하는 방식으로 time.sleep을 사용합니다. try/except 블록에 몇 가지 오류 유형을 넣을 수도 있습니다. 그리고 나는 np.rollconcatenate보다 좋고 빠르다고 생각합니다.

+0

의견을 보내 주셔서 감사합니다.하지만 여전히 업데이트 할 플롯을 가져올 수 없습니다. 그 동안 필자는 완전한 파이썬 코드를 발견하여 Eli Bendersky의 직렬 데이터를 로그하고 표시했습니다. [link] (http://eli.thegreenplace.net/2009/08/07/a-live-data-monitor-with- python-pyqt-and-pyserial /). –