質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Tera Term

Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

4260閲覧

ArudinoでPC時刻と同期してteratramにログを出力したい

nullsan

総合スコア20

Tera Term

Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/11/16 00:34

ArduinoUNOからPC時刻が指定時間になった時にTeratramにログを出したいと思います。

細かく言うと、PC時刻で1秒ごとにシリアル通信をしてログを出したいです。
今はArduinoの電源投入から以下のようにしてログを出力していますが、電源投入のタイミング次第で1秒ちょうどではなく
1.300秒→2.300秒→3.300秒などのように、ほぼ一秒周期ですがズレがあります。
このずれを解消する方法があれば教えてください。。

unsigned long TimeCount = 0; unsigned long time = 0; int interval = 1000; //1秒周期でシリアル出力 void loop(){ TimeCount = millis(); if(TimeCount >= time); { time = time+interval; Serial.print("TEST"); } }

理想はPC時刻が指定した時刻、例えば12時00分00秒000になった瞬間からきっちり1秒周期でシリアル出力したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

本当に必要な精度はどのくらいでしょう。

'00秒000' と書いていますが、1msのズレも問題になるのですか? だとすると、実現は厳しいです。
USB-シリアル変換を使う場合、USBのパケットが16msだったかの周期に丸められるはずです。ここはほぼ制御不能でしょう。

その他にも、Windowsのタスク切り替えも数10msのブレを生む要因になるでしょうし、シリアル通信であれば9600bpsとして1バイトの送信におよそ1msかかる、なんていうのは考慮しなければいけません。

Arduino側を何らかの方法でインターネットにつないでNTPで時計合わせをするとか、GPSを繋いでそこから時刻を得るとかして、データにタイムスタンプを付けるのが実用的かなとは思いますが。


100msでいい、とのことでとりあえず原理的なところだけ試してみました。

Teraterm

1;Teraterm Macro 2logopen "C:\Users\default\Documents\teraterm\testSec.log" 0 1 1 1 1 3gettime sec "%S" 4psec=sec 5while 1 6 gettime sec "%S" 7 strcompare sec psec 8 if result<>0 then 9 send "q" 10 endif 11 psec=sec 12endwhile

Arduino

1void setup() { 2 Serial.begin(9600); 3} 4 5void loop() { 6 if(Serial.available()){ 7 Serial.read(); 8 Serial.println(millis()); 9 } 10}

で出来たTeratermのタイムスタンプ付きログファイル

[Sat Nov 16 19:20:47.005 2019] 2268429 [Sat Nov 16 19:20:48.004 2019] 2269427 [Sat Nov 16 19:20:49.004 2019] 2270426 [Sat Nov 16 19:20:50.007 2019] 2271425 [Sat Nov 16 19:20:51.009 2019] 2272424 [Sat Nov 16 19:20:52.006 2019] 2273423 [Sat Nov 16 19:20:53.005 2019] 2274422 [Sat Nov 16 19:20:54.005 2019] 2275421 [Sat Nov 16 19:20:55.006 2019] 2276420 [Sat Nov 16 19:20:56.004 2019] 2277419 [Sat Nov 16 19:20:57.007 2019] 2278418 [Sat Nov 16 19:20:58.007 2019] 2279416 [Sat Nov 16 19:20:59.005 2019] 2280416 [Sat Nov 16 19:21:00.006 2019] 2281414 [Sat Nov 16 19:21:01.005 2019] 2282415 [Sat Nov 16 19:21:02.007 2019] 2283413 [Sat Nov 16 19:21:03.004 2019] 2284411 [Sat Nov 16 19:21:04.007 2019] 2285411 [Sat Nov 16 19:21:05.007 2019] 2286409 [Sat Nov 16 19:21:06.007 2019] 2287409 [Sat Nov 16 19:21:07.005 2019] 2288407

あなたの用途にあうかどうかは私は知りませんが。

投稿2019/11/16 06:56

編集2019/11/16 10:30
thkana

総合スコア7629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nullsan

2019/11/16 08:21

前後100ms以内の誤差が望ましいですが、Teratramでのマクロで運用でも難しいでしょうか?
thkana

2019/11/16 08:36

その程度であれば、だれも保証はしてくれないでしょうが実力としては可能だと思います。 teraterm側マクロで時刻を見ていて、秒の値が変化したらArduinoにリクエストを出して応答を取る、とか。 高校物理あたりで習ったと思いますが工学的には「有効数字」という考え方があって、1.000と書いたら1.001でも0.999でもなく1.000なのです。0.9でも1.1でも構わないときには1と書くのはともかく1.000とは書くべきではありません。
guest

0

PCの時刻と全く関わりなくArduinoは動いてますんで、どこかでPCの時刻と同期させる必要があります
手っ取り早くするには、PC側から時刻のメッセージをArduinoに送って時間合わせをすることですね。

あるいは、PC側から、1秒ごとにメッセージを送り、それに返答させる形でArduinoから出力させるってテもかんがえられますね

投稿2019/11/16 00:40

編集2019/11/16 00:44
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nullsan

2019/11/16 00:55

なるほどですね。 一秒周期でメッセージを自動で送ることはTeratarmでどのように実装すればよろしいでしょうか?
y_waiwai

2019/11/16 01:00

teraterm マクロ でぐぐってみましょう
nullsan

2019/11/16 08:18

ご回答ありがとうございます。 明日までに完成させる必要があり期日が差し迫っていて余裕がありませんのでヒントもしくはサンプルコードをいただければと大変助かります。 Teratarmマクロの実行順序としては 1:ログの採集を始めるコード 2:PCの時刻を取得するコード 3:2のデータを元に1秒ごとに4を実行するコード 4:シリアル通信で1秒ごとにAという値を送信するコード 5:2から4をループ Arduino側としては 0:センサーの情報を変数に格納 1:シリアルリード関数でAの文字列が受信されるか確認 2:Aを受信したらシリアルプリントするコード 3:シリアルリードした変数を0にセット 4:ループをぬけて再度0→1を交互にループ このような感じでしょうか?
y_waiwai

2019/11/16 08:24

目的がわからないのでアレですが、1秒毎の時間精度が必要なのはセンサの情報じゃないんでしょうか。 それであるなら、Aを受信したらセンサの値を取得してシリアルに出す、という動作になろうかと思われます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問