Help us understand the problem. What is going on with this article?

Arduino UNOでpyserialを使ったら再起動してしまった

More than 1 year has passed since last update.

環境

Windows 10
python3.6
Arduino UNO R3

コマンドを送るとどうしても再起動してしまう

pysesialを利用してWindowsとArduino Uno で通信をしようと試みていた。
しかしながらpyserial側でコマンドを送信すると何故か再起動1してしまう。

原因

pyserialはCOMポートを開く際にDTR信号がLowになる。
しかし、Arduino UNOはDTR信号がLowになるとArduino UNOが再起動してしまう。
これはUNOに採用されているシリアル変換チップがそういった仕様となっているためである。
なのでArduino Leonardo などでは問題にならない。

対処

ser = serial.Serial("COM3",9600)

のように一回で開けるのではなく

ser = serial.Serial()
ser.port = "COM3"
ser.baurate = 9600
ser.setDTR(False)  # DTRをセットしない
ser.open()
ser.write(bytes("hoge", 'UTF-8'))

の手順を踏むことで無事通信ができた。
しかしながら、setDTRの利用は推奨されないとのことなので

ser = serial.Serial("COM3",9600,dsrdtr = True) # dsrdtrの初期値はFalse
# コメント頂いたので修正(自身の環境では未検証)

で対応をするべきだろう。

余談

pySerial API 公式ドキュメント
によると

Some OS and/or drivers may activate RTS and or DTR automatically, as soon as the port is opened. There may be a glitch on RTS/DTR when rts or dtr are set differently from their default value (True / active).

一部の環境ではポートを開けたときにDTRがTrueになってしまう事があるらしい。
これが原因なのかもしれない。後日検証したい。

参考にしたサイト

DTR と Arduino の関係 - eggshell blue

DTR and RTS control lines toggle unintentionally when opening port - Github/pyserial


  1. ボードに書き込み直後と同じ点滅の仕方であったので再起動したと判断した。 

pyu666
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした