浜松ホトニクスc12880maをPythonで使う (5)
タイトル変えた...
PC側Python、Raspberry Pi Pico側がMicro PythonでC12880MAを動かす。PC側はデータ処理でスペクトルの表示。Pico側はC12880MAの制御とPC側へのデータ送信。あと、シャッターの制御などもPicoの仕事。
スペクトルメータだけでなく、もっと様々な外部機器に対応できるように汎用性を持たせてみる。クラスにはport_statusとperipheral_messageを持ち、それぞれのセンサーや機器の接続先のシリアルポートの状態、機器の状態を人にも理解しやすいようにした。peripheral_messageの内容はport_statusリストの最後にも同様な内容を持たせてある。スペクトルメータなども複数接続対応可能に出来るのである。たぶん。
現状考えているシステムでは新しいデバイスとそれが収集するデータに関してはセンサーに付随するRaspberry Pi PicoのMicroPython側とデータベースの設定のみの変更で対応可能としたい。できるのか... 分光計は難しいけどね。温度、湿度、気圧、電圧などの単純なものなら可能であろう。おそらく。
その前に、Linux以外のOSでの接続確認を行わなければならないのであるがな...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
import platform import serial.tools.list_ports class serial_ports_info(): def __init__(self): self.OS = platform.system() self.Version = platform.version() self.Platform = platform.platform() self.port_status_message = "Initialize class" self.ports_refresh() def scan(self): for p in self.ports: print(": %s" % p) print("device: %s" % p.device) print("name: %s" % p.name) print("description: %s" % p.description) print("hwid: %s" % p.hwid) print("vid: %s" % (None if p.vid == None else hex(p.vid))) print("pid: %s" % p.pid) print("serial Number: %s" % p.serial_number) print("location: %s" % p.location) print("manufacturer: %s" % p.manufacturer) print("product: %s" % p.product) print("interface: %s" % p.interface) def ports_refresh(self): self.ports_status = [] self.ports = serial.tools.list_ports.comports() for p in self.ports: if p.manufacturer == "MicroPython": try: uartport = serial.Serial( port=p.device, baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=3 ) # buffer clear uartport.reset_input_buffer() uartport.reset_output_buffer() try: uartport.write(("identify" + "\n").encode("utf-8")) device = uartport.readline().decode('utf-8').rstrip('\r\n') if device == 'identify': device = "Unknow Device on MicroPython" self.uart_message = "Cannot connect to MicroPython device on port %s on %s." % (p.device, self.OS) else: self.uart_message = "Can connect to %s on port %s on %s." % (device, p.device, self.OS) uartport.close() except serial.SerialException: self.uart_message = "Failed to receive data." uartport.close() except serial.SerialException: self.uart_message = "Failed to open serial port." else: device = "Unknown device" self.uart_message = "Cannot connect." self.ports_status.append([p, device, self.uart_message]) if __name__ == '__main__': pc = serial_ports_info() for port in pc.ports_status: print(port) |
実行結果
1 2 3 |
[<serial.tools.list_ports_linux.SysFS object at 0x7efce2613f40>, 'Unknown device', 'Cannot connect.'] [<serial.tools.list_ports_linux.SysFS object at 0x7efce26ba530>, 'Unknow Device on MicroPython', 'Cannot connect to MicroPython device on port /dev/ttyACM1 on Linux.'] [<serial.tools.list_ports_linux.SysFS object at 0x7efce26ba5f0>, 'Spectrometer', 'Can connect to Spectrometer on port /dev/ttyACM0 on Linux.'] |
ちょっと、コードを大きく変えた、名前とかも… MicroPythonが動いているが、対象外のPicoの場合、つまり、’Identify'に返事しないPicoが繋がっていると返事を待ち続ける問題があったので、timeoutを3秒に設定した(45行目)。timeoutした場合、エコーバックしてくるようなので、その様な場合、Unkonw device...とCannot connet...のメッセージを返すように変更した(54行目〜)。全体的にもう少し、スッキリさせたい...
<追記>
Linux以外での動作確認だが、VirtulBoxにWindows10を入れていたのだが、シリアルポートを認識させることに難儀している。設定の操作ができない。やはり実機を用意しなければダメそうである。レーザー加工機などの制御用PCはネットワーク接続していないので、Pythonの導入が面倒なのだ。
<追記-2>
Windowsでの動作確認は未だできず。
macOSでは動作を確認できた。ただし、部品のレイアウトがおかしくなる。
一応、シリアル通信周りのマルチプラットフォーム化はできた模様。
次はexe化か、レイアウトの崩れもなんとかしないとな...