建立完成的Arduino與超音波連線,除了可以透過Arduino IDE提供的窗口查看回傳的距離資訊之外,我們也可以自己寫程式來讀取。這裡介紹一個用Python讀取Arduino透過串列通訊回傳資訊的方式,透過Python讀取回傳的資訊後,我們也可以更方便的將參數做其他的使用。
事先準備
- 在下面這篇文章中[1],有紀錄使用Arduino讀取超音波感測器的方式,可以先參考該篇文章建立Arduino程式。
- Python 中會使用一個叫做pySerial的工具。使用前需要先依照中[2]的介紹來安裝:
- 使用PyPI安裝: python -m pip install pyserial
- 使用Conda安裝:
- conda install pyserial 或
- conda install -c conda-forge pyserial
- 安裝前記得先確認pySerial版本是否有對應自己的Python版本。
程式編寫
要讀取電腦的串列通訊(如 USB)時,可以透過使用 serial.Serial( 通訊口名稱, baudrate)
Eq. serial.Serial(‘COM3’, baudrate)
建立並且得到由該通訊接口傳來的資料。
程式介紹
首先我建立了一個叫做SerialArduino的Class,在一開始,設定了一個讀取使用者輸入數字0來當作程式啟動的訊號的程式。當使用者輸入數字0後,會先透過前面提到的serial.Serial的方式建建立通訊,接著透過pyserial API 的readline()功能來讀取傳送過來的資料。
由於在[1]中,Arduino最後會送出的資料是,Eq. Distance : 22.22cm
的字串資料。並且在尚未處理前的樣子如以下所示:
因為Python收到的字串中我只想要顯示距離的資料,因此處理訊息資料時,我也使用了Python本身提供的split()的功能。Split()是用來將字串依照()內指定的位置來切割用,Eq:
輸入資料: input_inf =“AB,CD,EF”
透過 input_inf.split(“,”)可以得到 [“AB”,”BC”, “EF”]。
在程式中,最後一項使用了split(“\\”)來分割,是因為在得到的資料中,最後會有 [/r/n] 的結尾,為了將其部分清除,因此必須要以 [/]來分割,但因為在Python中此方向的斜線與其他字出現時會有其他功用,所以需要以兩個反向的斜線來表示。
測試結果
建立完成Python 程式後,先將超音波接上Arduino並且與電腦連線,接著先去電腦中的 [裝置管理員] 查看接上後的串列通訊埠(port)名稱,獲得接口名稱並修改好程式後,既可執行Python程式做確認。
輸出的數據會依照障礙物距離的遠近改變時,既表示動作正常。如果想要進一步確認準度,也可以拿尺量看看實際與測量得的距離誤差。
コメント