實作部分
pyserial
因為要從樹梅派的USB到3D列印機的Arduino控制系統,必須做出一套橋梁,來做兩端的溝通,採用的方式是使用pyserial,由python第三方模組支援的串列通訊溝通,由官方提供的方法可以import pyserial後,就可以進行serial.open(Value),開啟兩端的連接後,接者進行資料的傳送和溝通,利用3Dprinter裡面的指令,就可以下指令到3D列印機中控制他(例如:G01、M105…),利用這樣的方式,就可以傳送基本指令控制3D列印機。 以下為串列傳輸程式碼: (包含解字、切字、utf-8、執行緒)
#!/usr/bin/python3 import serial import sys import numpy as np import tkinter from matplotlib import pyplot, rcParams port = serial.Serial('COM6', 9600, timeout=1) # Tkinter canvas top = tkinter.Tk() top.title("Tkinter + matplotlib") # Create flag to work with indefinite while loop flag = tkinter.BooleanVar(top) flag.set(True) def cleanText(data): data = data.replace("\r\n", "") return data def onStartButtonPress(): while True: if flag.get(): line = port.readline().decode('UTF-8') reading = line.split(':') # print (reading) if len(reading) == 2: for i in range(2): if reading[0] == "temperature": TempLabel.config(text=cleanText(reading[1])) TempUnitLabel.config(text="C") TempUnitLabel.update_idletasks() # if reading[0] == "Temperature(F)": # TempLabel.config(text=cleanText(reading[1])) # TempUnitLabel.config(text="F") # TempUnitLabel.update_idletasks() if reading[0] == "Humidity": HumdLabel.config(text=cleanText(reading[1])) pData.append(float(reading[1])) del pData[0] # if reading[0] == "Light(lx)": # LighLabel.config(text=cleanText(reading[1])) if reading[0] == "Flag": # print (reading[1]) if int(reading[1]) == 1: try: print ("In flag") print ("In flag -> if ") l1.set_xdata(np.arange(len(pData))) l1.set_ydata(pData) # update the data pyplot.ylim([0, 100]) pyplot.draw() # update the plot except: print ("In flag except") pyplot.figure() pyplot.title('Humidity') ax1 = pyplot.axes() l1, = pyplot.plot(pData) pyplot.ylim([0, 100]) if int(reading[1]) == 0: try: pyplot.close('all') l1 = None except: continue port.flushInput() top.update() else: flag.set(True) break def onExitButtonPress(): print ("Exiting....") flag.set(False) port.close() top.quit() top.destroy() print ("Done.") sys.exit() pyplot.ion() rcParams['toolbar'] = 'None' pData = [0] * 25 tkinter.Label(top, text="Temperature").grid(column=1, row=1) tkinter.Label(top, text="Humidity").grid(column=1, row=2) tkinter.Label(top, text="Light").grid(column=1, row=3) TempLabel = tkinter.Label(top, text=" ") TempLabel.grid(column=2, row=1) HumdLabel = tkinter.Label(top, text=" ") HumdLabel.grid(column=2, row=2) LighLabel = tkinter.Label(top, text=" ") LighLabel.grid(column=2, row=3) TempUnitLabel = tkinter.Label(top, text=" ") TempUnitLabel.grid(column=3, row=1) HumdUnitLabel = tkinter.Label(top, text="%") HumdUnitLabel.grid(column=3, row=2) LighUnitLabel = tkinter.Label(top, text="lx") LighUnitLabel.grid(column=3, row=3) # Create Start button and associate with onStartButtonPress method StartButton = tkinter.Button(top, text="Start", command=onStartButtonPress) StartButton.grid(column=1, row=4) # Create Exit button and destroy the window ExitButton = tkinter.Button(top, text="Exit", command=onExitButtonPress) ExitButton.grid(column=2, row=4) top.mainloop()
Flask
這邊我們選用的框架是flask,因為它輕巧、且具有大量的可擴充性,因此選用,相較於python其他兩個,他擁有比較小的空間和核心,較符合Raspberrypi的系統。 底下為利用flask看通訊端得到的資料
import flask import serial from time import sleep app = flask.Flask(__name__) app.debug = True def event_barcode(): messageid = 0 ser = serial.Serial() ser.port = COM^ ser.baudrate = 9600 ser.bytesize = 8 ser.parity = serial.PARITY_NONE ser.stopbits = serial.STOPBITS_ONE ser.timeout = 0 try: ser.open() except serial.SerialException as e: yield 'event:error\n' + 'data:' + 'Serial port error({0}): {1}\n\n'.format(e.errno, e.strerror) messageid = messageid + 1 str_list = [] while True: sleep(0.01) nextchar = ser.read() if nextchar: str_list.append(nextchar) else: if len(str_list) > 0: yield 'id:' + str(messageid) + '\n' + 'data:' + ''.join(str_list) + '\n\n' messageid = messageid + 1 str_list = [] @app.route('/barcode') def barcode(): newresponse = flask.Response(event_barcode(), mimetype="text/event-stream") newresponse.headers.add('Access-Control-Allow-Origin', '*') newresponse.headers.add('Cache-Control', 'no-cache') return newresponse if __name__ == '__main__': app.run(port=5000, threaded=True)
OctoPrint
我們在找相關資料的時候,發現到其實已經有人將我們實作的部分寫成一份套件包,只需要從新編譯過,就可以符合我們使用,而且他是屬於OpenSource,不會有版權上的問題,他將程式碼公開,讓我們這些後輩人學習,真的非常感動,我們照著他的code一路走,看到每個人針對他所想要走所設計的不同,看到不一樣的寫法,因此感謝他的幫助好讓我們可以有參考資料。主要他用的方法是使用我們看到的flask+js+nginx+pyserial+oprint+yaml,非常的複雜,但是在flask底下,可以很清楚的知道,每個py檔的作用和功能,可以讓我們比較好了解如何使用。
Comments
comments powered by Disqus