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

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

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

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

シリアルポート

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

Arduino

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

受付中

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

masotail
masotail

総合スコア0

Python 3.x

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

シリアルポート

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

Arduino

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

4回答

0評価

0クリップ

1252閲覧

投稿2020/01/12 15:38

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

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

Arduino

  void setup() { // シリアルポート初期化 Serial.begin(250000); } int sampling_num = 200,i; float sampling_rate = 0.05;//1microsに何回サンプリングするか int sampling_interval = 1/sampling_rate;//[micros] int V0[200]; void loop() { int moji; // シリアルポートより、文字を1字読み込む moji = Serial.read(); // 文字入力があった場合のみif関数を実行 if(moji != -1){ // 開始時間を記録 unsigned long StartTime = micros(); unsigned long NextTime = StartTime; for (i=0; i<sampling_num; i++){ NextTime=NextTime+sampling_interval; V0[i] = analogRead(0); while (micros() < NextTime){ } } //電圧測定終了 // 終了時間を記録 unsigned long StopTime = micros(); Serial.println(StopTime - StartTime);//電圧測定にかかった時間 //電圧データをシリアルポートに表示させるためのコード String stringData = ""; //結果の文字列を入れる変数 for (i=0; i<sampling_num; i++) { if(i<sampling_num-1){ stringData = stringData + String(V0[i])+",";} else{ //最後は、データの数字と改行文字列を追加する stringData = stringData + String(V0[i])+"\r\n";} } unsigned long StopTime2 = micros(); Serial.println(StopTime2-StartTime); //Stringにかかった時間 Serial.println(stringData); unsigned long StopTime3 = micros(); Serial.println(StopTime3-StartTime); //シリアルポートに出力するのにかかった時間 } }

そしてこのコードにも書かれているように処理にかかった時間も出力させました。
その結果
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で解析できる方法があれば教えていただきたいです。

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

ozwk
ozwk

2020/01/16 09:29

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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

シリアルポート

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

Arduino

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