Posted at
ArduinoDay 5

PythonでArduinoが刺さってるポートを自動取得

More than 3 years have passed since last update.

PythonからArduinoにシリアルで文字列を送る場合、pyserialを使って、こんな感じで書くと思います。

import serial

ser = serial.Serial()
ser.baudrate = 9600
ser.port = 2 # COM3->2,COM5->4
ser.open()
ser.write("Hello")

ser.portはUSBを抜き差しするたびに変わるので、Arduino IDEでポートを確認し、Macの場合はser.port = "/dev/tty.usbmodem1451"、WindowsだとCOM3に刺さってる場合、ser.port = 2と書くわけですが、抜き差しするたびに変わって面倒ということで、こういう書き方も用意されてます。

import serial

import serial.tools.list_ports

ser = serial.Serial()
ser.baudrate = 9600
ser.port = list(serial.tools.list_ports.comports())[0][0]
ser.open()
ser.write("Hello")

この書き方、環境によっては失敗するみたいで、Macなら/dev配下を適当に探せば見つかるだろうと、こういう書き方を試してみたら、ちゃんと動きました。

ser = serial.Serial()

ser.baudrate = 9600
for file in os.listdir('/dev'):
if "tty.usbmodem" in file:
ser.port = '/dev/'+file
ser.open()

Windowsの場合、数字で指定されるので、こんな書き方でもいいですね。

ser = serial.Serial()

ser.baudrate = 9600
for i in range(100):
try:
ser.port = i
ser.open()
break
except:
i = i