0

SDカードに保存されたデータに基づいてサーボモーターを制御する必要があるプロジェクトに取り組んでいます。これまでのところ順調に進んでいますが、サーボ モーターの動きのタイミングと速度の制御に問題があります。私が達成しようとしていることと、いくつかのサンプルコードについて説明します。

SDモジュールが接続されたArduino Megaを使用しています。SD カードには 4 つの異なる .txt ファイルがあります。各ファイルには 30 個の整数値が含まれ、各行には単一の整数が含まれ、(,) で終了します。これは単なるテスト データであるため、角度の範囲をスイープして、値を正しく読み取って変換していることを確認できます。しかし、タイマーや遅延などを使用してサーボの速度を落とそうとすると、あたかもそこにあるかのようにコードが高速化されます。私の場合、コードは次のようになります。

string dataRead ="";                  // String object to read bytes from
unsigned long int motorTime = 250;    // Refresh time of the motor (250 ms)      
unsigned long int lastMotor = (long) micros();
while (entry.available()) {           // While there are bytes in the file to be read
   dataRead = entry.readStringUntil(',');
   while((long) micros() - lastMotor <= (motorTime * 1000));    // Do nothing until refresh time has elapsed

   myServo.write(dataRead.toInt());
   lastMotor = (long) micros();
}

データは正常に読み取られ、モーターはデータに従って動作しますが、何らかの理由でタイミング コードが無効になっているように見えます。これは、Arduino IDE のすべての抽象化レイヤーの下であらゆる種類のハードウェア機能が有効化および無効化されており、何らかの理由で遅延が無効になっているためだと思われます。

誰もこれを経験したことがありますか?設定した速度でサーボを駆動するためのヒントはありますか? 私の別の解決策は、データを配列にロードすることです。しかし、すべての RAM を焼き尽くして他の問題を引き起こす危険を冒したくありません。

前もって感謝します!

4

1 に答える 1

0

最後に修正しました。データを読み取っているときの割り込みを無効にし、micros() や millis() などのタイマー関数を台無しにしました。経過時間を追跡するために割り込みに依存しています。デフォルトで割り込みサービス ルーチンを無効にするよりも、割り込みサービス ルーチンを切り離す方がおそらく理にかなっています。

于 2016-06-22T09:12:30.893 に答える