5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-11

環境

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. ボードに書き込み直後と同じ点滅の仕方であったので再起動したと判断した。

5
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?