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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

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

Q&A

4回答

2752閲覧

ArduinoとPython間でのシリアル通信

masotail

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Arduino

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

0グッド

0クリップ

投稿2020/01/12 15:38

下の質問の続きです。(Arduino Dueを使用しています)
https://teratail.com/questions/230766

coco_bauerさんの解答を参考に以下のコードを作成しとりあえず1つの電圧データをシリアルポートに出力できるようにしました。

Arduino

1  2void setup() { 3 // シリアルポート初期化 4 Serial.begin(250000); 5} 6 7int sampling_num = 200,i; 8float sampling_rate = 0.05;//1microsに何回サンプリングするか 9int sampling_interval = 1/sampling_rate;//[micros] 10 11int V0[200]; 12 13void loop() { 14 15 int moji; 16 // シリアルポートより、文字を1字読み込む 17 moji = Serial.read(); 18 19 // 文字入力があった場合のみif関数を実行 20 if(moji != -1){ 21 22 // 開始時間を記録 23 unsigned long StartTime = micros(); 24 unsigned long NextTime = StartTime; 25 26for (i=0; i<sampling_num; i++){ 27 NextTime=NextTime+sampling_interval; 28 V0[i] = analogRead(0); 29 while (micros() < NextTime){ 30 } 31 } //電圧測定終了 32 // 終了時間を記録 33 unsigned long StopTime = micros(); 34 35 Serial.println(StopTime - StartTime);//電圧測定にかかった時間 36 37//電圧データをシリアルポートに表示させるためのコード 38String stringData = ""; //結果の文字列を入れる変数 39for (i=0; i<sampling_num; i++) { 40 if(i<sampling_num-1){ 41 stringData = stringData + String(V0[i])+",";} 42 else{ //最後は、データの数字と改行文字列を追加する 43 stringData = stringData + String(V0[i])+"\r\n";} 44} 45 unsigned long StopTime2 = micros(); 46 Serial.println(StopTime2-StartTime); //Stringにかかった時間 47 Serial.println(stringData); 48 unsigned long StopTime3 = micros(); 49 Serial.println(StopTime3-StartTime); //シリアルポートに出力するのにかかった時間 50 } 51 52 53}

そしてこのコードにも書かれているように処理にかかった時間も出力させました。
その結果
Serial.println(StopTime - StartTime);//電圧測定にかかった時間  = 4002
Serial.println(StopTime2-StartTime); //Stringにかかった時間 = 19555
Serial.println(StopTime3-StartTime); //シリアルポートに出力するのにかかった時間 =46770
となり、電圧測定した時間と比べシリアルポートに出力する時間がとても長くなってしまいます。

しかしリアルタイム性をとても重視しているので
電圧測定にかかった時間≒Stringにかかった時間≒シリアルポートに出力するのにかかった時間としたいです。
しかしシリアルポートに出力しなければいけないシリアル通信を使っている時点でこれは不可能であると結論付けたのですが、この認識は合っていますか?(そもそも「Arduinoのシリアル通信=送りたいデータをシリアルポートに出力しなければいけない」という認識は合っていますか?)

理想はArduino Dueで測定した電圧データを高速(電圧測定にかかった時間とくらべて10分の1以下)でpython側で読み取りたいのですが何か良い方法はないでしょうか?

データ送信に時間がかかってもデータ送信中に電圧測定ができればいいのですがマルチタスクは無理ですよね...?

サンプリング周波数もとても重視しているためサンプリング周波数は下げたくありません。(なので大量のデータを送る必要があります)

Arduino Dueじゃなくてもいいのでとにかく大きなサンプリング周波数で電圧を測定しそのデータをリアルタイムでpythonで解析できる方法があれば教えていただきたいです。

これでもかなり自分で調べた結果質問しているのでお手柔らかにお願いします。

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

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

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

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

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

ozwk

2020/01/16 09:29

そもそも何がしたいんですか? 別質問で最低100kHzとありましたが 目的によっては別の手法の提案ができるかもしれません
guest

回答4

0

あぁ、一度書いたのが消えちまった...気力なくして簡略版。

最初に結論。
破綻してるので無理です。

電圧データを高速(電圧測定にかかった時間とくらべて10分の1以下)でpython側で読み取りたい

夢ではなく、現実を語りましょう。

シリアルではデータ本体にstart/stopビットがついて10bitで1byte分の転送。250000baudなら25000Byte/s、1データ3桁+デリミタで4byteとして、160μsかかることになります。(これはパルス列だけ考えた理想。実際はこれよりかかる)

一方、データの湧き出しは0.05個/μsとのことなので1個あたり20μs。

データの湧き出し < データの転送なので、マルチタスクごときでは歯が立ちません。根本的にダメ、としかいいようがないです。UART(USB-CDC)シリアルも1Mbaudぐらいが限界でしょう。

私が思いつく代案は
・USBをCDC以外の転送モードで使う。Arduinoライブラリがあるか不明。場合によってはホスト側(Windows? Linux? の)ドライバ開発が必要かも
・Arduinoを複数枚使ってストライピング。現状で8枚使えばデータの湧き出しと転送を同レートに出来る...
ぐらいですが。

本当に必要な要求を絞れれば、また別の突破口が出てくるかもしれませんが。サンプリングする期間を限定出来ないかとか、実はもう少しサンプリングレートを下げられないかとか。

投稿2020/01/13 01:15

編集2020/01/13 01:19
thkana

総合スコア7610

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

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

0

Serial.begin(115200);
にして、再測定してみてください。

投稿2020/01/27 00:58

hillacken

総合スコア359

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

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

0

Arduinoのような非力なチップに無茶な要求をしてもダメです。

高速A/Dコンバータを内蔵したチップを使い、専用に設計した基板とギガビット・イーサネット(250000baudより数千倍速い)で高速のCPUと高性能GPUを備えたPCにつなげば、相当な事ができると思いますよ。

ソフトウェアの工夫で出来る範囲は限られています。
金に糸目をつけずに高性能なハードウェアで実現するのが、現実的だと思います。

投稿2020/01/16 08:49

coco_bauer

総合スコア6915

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

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

0

シリアルポートに出力するのにかかった時間 =46770

これが正しいなら、シリアル通信でかかっている時間はたかだか20~40ms程度です。
こんなもんでしょう。

サンプリング周波数はどれだけのものが必要なんでしょうか

投稿2020/01/12 23:56

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問