2

ArduinoIO-Matlab インターフェイスを使用して、Matlab から Arduino を制御しています。私の現在のセットアップでは、3 つの EMG マッスル センサー (Advancer Technologies 製) が Arduino のアナログ ピン 1、2、および 3 に接続されています。Arduino は Matlab に接続されています。これら 3 つのピンから同時にデータを収集し、1000x3 のマトリックス サイズに格納しようとしています。私の問題は、Matlab がアナログ ピンからサンプリングするレートです。3 つのピンから同時に 1000 の読み取り値を収集するには、約 25 秒かかります。私はarduino自体がより高いレートでサンプリングしていることを知っています。以下は私のコードです。これを変更して、10 秒で約 1000 サンプルのサンプリング レートを取得するにはどうすればよいですか?

ar = arduino('COM3');

ax = zeros(1000,3);

for ai = 1:1000
    ax(ai,:) = [ar.analogRead(1) ar.analogRead(2) ar.analogRead(3)];
end

delete(ar);

これは、上記のコード (プロファイル ビューアー) にかかった時間です。

  time     calls  line
< 0.01       1    3 ax = zeros(1000,3); 
                  4 
< 0.01       1    5 for ai = 1:1000 
 25.07    1000    6     ax(ai,:) = [ar.analogRead(1) ar.analogRead(2) ar.analogRead(3)]; 
          1000    7 end 
                  8 
  1.24       1    9 delete(ar); 

他に明確にする必要がある場合はお知らせください。ありがとうenter code here

4

2 に答える 2

1

arduino c++ コード (.pde ファイル) を変更する必要があります。このコードでは、必要に応じて信号をサンプリングし (たとえば 1000)、serial.writeln() メソッドを使用してサンプリングされたデータを matlab に転送する必要があります。

これにより、〜3KHzのサンプリングレートが得られます(多くの要因によって異なります)...

于 2013-07-20T22:20:58.320 に答える
0

以下は、あなたが見ている結果と、ムハンマドの答えが示唆するようなことをする必要がある理由をおそらく説明しています。この理由は彼の答えに暗示されていましたが、他の人が「トラップ」を回避できるように詳しく説明されていませんでした。

この回答を確実に確認するために必要な基礎となるコードとシステムにアクセスできません。この回答は「典型的な方法」に基づいており、完全なポピーコック [tm] である可能性はわずかですが、観察と標準的な方法の間の正確な適合は、これが起こっていることを示唆しています. これが正しいかどうかは、必要なシステムを手元に持っている人が少し掘り下げるだけで実証できます。

データが一度に 1 つのデータ サンプルで送信されると、生データを転送するだけの時間を大幅に超える、サンプルごとのオーバーヘッドが発生します。

あなたは、3000 個のサンプルを転送するのに 25 秒かかると言っています。
サンプルあたりの時間 = 25/3000 = サンプルあたり 8.333 ミリ秒。

9600 ボーのデータ転送速度を想定します。
デフォルトの通信速度はわずか 9600 ボーです。これは確認できますが、結果はこれが正しい可能性があることを示唆しており、わずかに異なる仮定を立てても同様に適切な説明が得られます。

シリアル通信は通常、N81 フォーマット = 1 スタート ビット、8 データ ビット、8 ビット バイトあたり 1 ストップ ビットを使用します。
したがって、1 ビットは 1/9600 秒かかり
、10 ビットは 10/9600 = 1.042 mS かかり
、サンプル時間 / バイト時間
= 8.333 / 1.042 = 7.997 ワード時間になります。
実際、丸めや切り捨てを行わずに計算すると、つまり
25 / 3000 x 9600/10 = 8.000.... となります。つまり、あなたの転送は、サンプルごとに正確に 8 x 9600 ボー ワード時間を使用しています。
同様に、これは正確に 4 x 4800 ボーまたは 2 x 2400 ボーの転送時間です。

使用されているフォーマットは調べていませんが、PC モニター プログラムで動作するために、基本的なシリアル ルーチンは
2 x データ バイト + CR + LF = 4 バイトを使用する可能性があると想像してください。
これは、16 ビットの変数が 2 x 8 ビットのバイナリ ワードとして送信されることを前提としています。
可能性が高い =
- 4 x ASCII 文字として送信される 16 ビットまたは
- 6 x ASCII 文字として送信される 24 ビット。

適切な深さの調査がない場合、6 つの ASCII ワードと 9600 ボーでの CR + LF を使用すると、典型的なパラメーターを使用して非常にうまく適合するため、Occam はおそらくこれが最良の出発点であると意見を述べています。合計要件が 8 バイトか 4 バイトか 2 バイトかに関係なく、観測されたデータ レートと標準ボー レートとの間のいくぶん偶然の正確な一致は、これが表示されるものの基本的な理由を提供することを示唆しています。

コードを見ると、使用されているボー レート、データ長、およびパッキングがすぐにわかります。

于 2015-04-10T07:15:42.447 に答える