2019年6月7日金曜日

Arduinoにターミナルで接続するたびにリセットがかかる...困った

最近デジモノいろいろ買っているんですが、もっぱらArduinoで遊んでいます。

おいおい記事を書けたらと思うのですが…。

さて、Arduino UnoやArduino nanoでプログラミングを行うと、ターミナルに接続するたびにArduinoにリセットがかかってしまいます。これは、USB経由のシリアル通信でプログラムの書き込み終了後に、自動リセットを掛けるためのもののようです。
いろいろ調べていくと自動リセットを解除する方法がいくつかあるようです。

 方法1 ターミナルソフトでシリアルポートのDTR端子出力をH(Hi/1)にする
 方法2 Arduino のDTR信号のラインをカットする
     DTR-10uF-GNDと接続する
 方法3 ソフトウエアシリアルを使う

方法1
ターミナルソフトはいくつかありますが
  a Arduino IDE付属のターミナルソフト
   そもそもDTRの設定ができない

  b TeraTerm
   DTRの設定はマクロを記述することで設定できるが、
   COMポートを開いたときにDTRの設定をどうやっても反映されず、
   必ずArduinoが再起動する

  c RLogin
   DTRの設定はあるがどう設定しても必ずArduinoが再起動する

  d ターミナルソフトを自作する 
   未検証
   参考:http://nuneno.cocolog-nifty.com/blog/2014/03/arduino-f24c.html

方法3
 ソフトウエアシリアルを使う

 USB接続のシリアルポートは、プログラム書き込み後にプログラムを起動しないといけないのでリセットしなければならないというしがらみがあるわけで、それならシリアルポートを別にもうければよいのであって、それならばソフトシリアルを使えばよい…

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  Serial.begin(57600); // ハードウェアシリアルを準備
  while (!Serial) {
    ; // シリアルポートの準備ができるのを待つ(Leonardoのみ必要)
  }
  Serial.println("Ready");
  mySerial.begin(4800); // ソフトウェアシリアルの初期化
  mySerial.println("Hello, world?");
}

void loop() {
  if (mySerial.available()) Serial.write(mySerial.read());
  if (Serial.available()) mySerial.write(Serial.read());
}

http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=92
www.musashinodenpa.comより
原理的にはこれで解決できそうです。Arduino.ccのフォーラムでこれを使っている人がいました。

いろいろ試した結果、ターミナルソフトではDTRの設定がうまく反映されず、『ターミナル接続リセット問題』は未解決です。

いや、現状それほど問題ではないのだけれど、Arduinoの動作状況を確認するためにターミナルで接続したとたんリセットかかると動作状況の確認ができないという。簡単に解決できそうでできない。
TeraTarmもなんでできないのだろうか。