2016-06-21 5 views
0

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

私はSDモジュールを取り付けたArduino Megaを使用しています。 SDカードには4種類の.txtファイルがあります。各ファイルには30個の整数値が含まれ、各行には1つの整数が含まれ、(、)で終わります。これは単なるテストデータなので、角度の範囲を掃引して、私が読んでいることを確認し、値をうまく変換することができます。しかし、タイマーを使ってサーボを減速させようとすると、コードが遅れてスピードが速くなります。私の場合、コードは次のようになります。

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を焼き切る危険性を抱えて、他の問題を引き起こしたくはありません。

ありがとうございます!

答えて

0

最後に修正しました。データを読み込んでいて、micros()やmillis()などのタイマー関数を混乱させたときは、割り込みを無効にしました。彼らは経過時間を追跡するために割り込みに頼っています。 割り込みサービスルーチンをデフォルトで無効にするのではなくむしろ切り離す方がいいでしょう。

関連する問題