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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

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

Q&A

解決済

2回答

5046閲覧

PythonでArduinoから送られてきた値をリアルタイムで処理したい

Tomori_T

総合スコア8

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

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

0グッド

0クリップ

投稿2020/03/31 03:12

タイトルにもあるように、PythonでArduinoから取得した値をリアルタイムで処理したいです。

具体的には、Arduinoから送られてくるデータをPythonの方で5秒おきに取得して、一定時間毎にそのデータをデータベースの方に保存したいです。

現時点でのPythonのコードは以下のようになっていて、Arduinoが起動している間はずっとwhileループを回るようになっています。

適当に変数iなどを設置して、ループの回数に応じて何回かに一回データベースに保存すればどうにかなるとは思うのですが、これはプログラム的に大丈夫でしょうか。

リアルタイム処理をしたことがないのでご教授いただけるとありがたいです。

Python

1# coding:utf-8 2import time 3import serial 4import sys 5import matplotlib.pyplot as plt 6import re 7import datetime 8 9 10if __name__ == "__main__": 11 ser = serial.Serial() 12 ser.baudrate = 9600 # ArduinoのSerial.beginで指定した値 13 ser.timeout = 0 # タイムアウトの時間 14 ser.port = "COM6" # Arduinoのポート番号 15 16 # 開いてみる 17 try: 18 ser.open() 19 print("open " + ser.port) 20 except: 21 print("can't open" + ser.port) 22 sys.exit(0) 23 24 i = 0 25 DATASETS = { 26 'TIME': [], 27 'CO2': [], 28 } 29 regex = re.compile('\d+.?\d+') 30 31 # ちゃんと開けていたらループに入る 32 while ser.is_open: 33 s = ser.readline(100).decode() 34 if s != "": 35 s2 = regex.findall(s) 36 37 now_time = str(datetime.datetime.now().time())[:8] 38 DATASETS['TIME'].append(now_time) 39 DATASETS['CO2'].append(s2) 40 41 print('DATE: ', now_time) 42 print('CO2: ', s2, '[ppm]') 43 44 time.sleep(5.0) # 5秒待つ 45 46 print("serial connection closed") 47

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

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

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

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

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

quickquip

2020/03/31 03:38

リアルタイムという語は使わずに客観的なスペック(要求仕様)を書いた方がいいですよ。 マイクロ秒単位を想像する人から、秒単位を想像する人まで、分野によって感じ方がぜんぜん違う、やっかいな単語です。
guest

回答2

0

これはプログラム的に大丈夫でしょうか。

大丈夫かどうかはそのプログラムだけを見てもわかりません。
単純に考えて、Arduino側が5秒間に1行を超えるデータを吐き出せば、データがどんどん溜まっていって破綻することになるでしょう。
また、よほどの時間データが湧き出し続けていれば、そのプログラムではメモリが一杯になるでしょう(現実的な時間かどうかは別ですが)。

どうにかなる

どういう状況をどうしたいと考えているのですか?

とにかく、データの湧き出しに対して、処理は次回のデータ湧き出しまでに処理を終えていなければいけません。追いつかないなら、適宜データを間引いて捨てるなりなんなりが必要です。

投稿2020/03/31 13:38

thkana

総合スコア7639

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

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

0

ベストアンサー

シリアル通信は、OSの内部である程度のバッファを持ってバッファリングするようになってます。
ですんで、シリアル通信するだけなら、数秒に一回の読み出しでも大丈夫です

ましかし、通信をリアルタイムでどーこーという場合はそれでは遅れが出ることになりますんで、ある程度頻繁にループを回す必要があります

提示のコードでは9600ボーですんで、1文字あたり約1msの転送時間となりますんで、1つのメッセージのバイト数と勘案してループ頻度を決めればいいと思います。

ということで、シリアル通信だけの処理のループじゃなくて、他のいろんな処理のループの合間にシリアルは処理させればいいかと思います

投稿2020/03/31 03:22

y_waiwai

総合スコア87774

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

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

Tomori_T

2020/03/31 04:34

すいません、シリアル通信の仕組みなどちゃんと理解していないのでいまいちピンときていないのんですけど、whileループ内にDB関連のコードもまとめて書いてしまっても大丈夫ということでしょうか? それとも、ずっとループを回すのではなく、数秒に1回のペースでプログラムを実行するということでしょうか。
y_waiwai

2020/03/31 04:42

まずはシリアル通信の仕組みをきちんと理解しましょう。はなしはそれからになります 単純に、シリアルから一つのメッセージを受信すればDBに保存、という繰り返しでいいのではないかとおもいますが。
Tomori_T

2020/03/31 04:51

わざわざありがとうございます。 シリアル通信についてもう少し詳しく調べてみます。 質問はもうしばらくこのままにさせてもらいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問