下の質問の続きです。(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で解析できる方法があれば教えていただきたいです。
これでもかなり自分で調べた結果質問しているのでお手柔らかにお願いします。