2018年1月15日 星期一

Python GUI to show Arduino ADC input and Sine waveform.

這篇文章的程式,是從底下Plotting-real-time-sound-sensor-data-from-Arduino
-using-Python的github去修改的,總共有下面兩種程式語言,修改後的程式
在我的github內。
https://github.com/zsnes631/Python-Arduino


1.寫Arduino程式,將ADC0的輸入電壓, 透過Uart Port輸出到PC。
2.寫Python GUI程式,接收到的數值,還有產生Sine波,依照時間軸動態顯示。

Python GUI程式
1,代入相關的模塊。
   "serial"是用在UART相關的命令
    "numpy"是用在數值運算,Sine波就是由它所計算出的。
    "matplotlib"是用來顯示(plot)圖面。
    "drawnow" 甩來即時更新圖面。
     "serial.tools.list_port"用來確認Serial port裝置的資訊。









2,設定變數,values為序列,plt.ion()是顯示出matlotlib plt的圖。
   Fs、f則是Sine波的參數。











3,尋找Arduino在那個UART Port,由於我用的Arduino是用USB to UART converter IC
   CH340,所以確認PC上的那個Uart Port的描述有CH340,就表示該Port是接到Arduino。










4.定義一個函式,用來設定GUI視窗plot plt的參數,包括它的title、XY的Label,
    XY軸的數值範圍(axis)。









5.values是用來存放Arduino ADC接收到的數值,values1是sine波的數值。我設定
  這些數值的Buffer到100個。所以我們可以看到現在的數值,跟之前的的99個數
  值。append是先用0填入Buffer 0~100,當作初始值。





6.用"serial"模塊的函數,當PC的Uart port有接收到資料,就存到變數valueRead。
    這個資料,就是Arduino傳過來的ADC數值。







7.利用try-except來做例外處理,確認從arduino接收到的數值,是在0~1024。
   每接收到一次數值,就存到values序列裡,並將序列裡,最舊的那筆資料
    移出(pop)。valueX是sine的計算式。f=4, Fs=100,可以得出每25(100/4)
    為一次sine波周期。300是峰值,Sine波的峰對峰pk-pk為600。最後面的
    400是level,等於是將sine wave上移了400個單位。



8.執行程式後,可以看到Arduino傳送來的數值values,跟values1 Sine波
   的波形。



Arduino程式
Arduino程式,每300ms讀取ADC pin A0的數值,再從Uart Port以Baudrate 19200bps
傳送出去。Arduino的ADC是10bits,輸入電壓範圍從0~5V,5V讀進來的值為1023。



Reference
https://github.com/DeligenceTechnologies/Plotting-real-time-sound-sensor-data-from-Arduino-using-Python