非常に簡単に言えば、私は他の場所から読み込まれたデータに基づいてサーボ(9gマイクロサーボ)を制御しています。サーボが常に「揺れる」ことを除いて、すべてが正常に機能します。つまり、非常に微妙な動きで振動します(1/2-> 1cm程度の断続的な動き)。
私は次のようなことをしてソフトウェアでこの問題を修正しようとしました:
do{
delay(DTIME);
positionServo();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("X position: ");
lcd.print(xRead);
lcd.setCursor(0,1);
lcd.print("Y position: ");
lcd.print(yRead);
}while( readChange() ); //while there has been change
do-whileが必要な場合は、マッピングされたサーボ値を格納する変数を初期化します(arduinoサーボライブラリを使用)。
readChange()関数は次のように定義されます:
int readChange(){
int x_Temp, y_Temp;
x_Temp = map(analogRead(x_axisReadPin), 0, 1023, 0, 179);
y_Temp = map(analogRead(y_axisReadPin), 0, 1023, 0, 179);
if( abs(x_Temp - xRead) < DEG && abs(y_Temp - yRead) < DEG ) return 0; // no change
else return 1; //change
}
xReadは初期化された値です(最初のマップされたサーボ出力)。
しかし、これは本当に良いアプローチではありません。両方の値がDEGの係数(約10度、または私の場合は約0.28V)だけ変化していないことが必要です。ORがDEG未満になるように関数を記述した場合、一度に1つのサーボのみを変更した場合はどうなりますか?デリマがあります..
これは単にサーボの特性ですか(おそらく安価なものですか?)、または回避策はありますか?
ペーストのリンクを含める方がはるかに簡単です。完全なコードは次のとおりです。http: //pastie.org/8191459
2つの自由度(X、Y)を可能にするために、2つのサーボとレーザーポインターを一緒に取り付けました。いくつかのボタンの状態に基づいて、さまざまな方法でサーボを制御するオプションがあります。1つ目は「モーション」で、露光量に基づいてサーボの位置に影響を与える2つのフォトレジスターがあります。Xboxコントローラーでサーボを制御するコードをまだ実装していません。3番目のオプションは、ランダム化された動きです。