Çok basit bir şekilde, başka bir yerden okunan bazı verilere dayanarak servoları (9g Mikro Servolar) kontrol ediyorum. Servolar sürekli "sallanacak" dışında her şey iyi çalışıyor. Yani, çok ince hareketlerle (1/2 -> 1 cm kadar aralıklı hareketlerle) geri titreşirler.
Aşağıdaki gibi bir şey yaparak yazılımda bu sorunu düzeltmeye çalıştım:
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 gerektiğinde, eşlenen servo değerini saklayan değişkenleri başlatın (arduino servo kütüphanesini kullanarak).
ReadChange () işlevi şu şekilde tanımlanır:
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
}
Burada xRead, başlatılan değerdir (ilk, eşlenen servo çıkışı).
Bununla birlikte, bu gerçekten iyi bir yaklaşım değildir. İKİ değerlerin bir DEG faktörü tarafından değiştirilmemesi gerekir (benim durumumda ~ 10 derece veya ~ 0.28V). Eğer işlevi OR veya DEG'den daha az olacak şekilde yazarsam, bir seferde sadece bir servo değiştiriyor olsaydım ne olurdu? Demek bir sınır var ..
Bu sadece servoların (belki de ucuz olanların) bir özelliği mi yoksa bir çözüm var mı?
Bir pastie bağlantısı eklemek çok daha kolay olurdu. İşte tam kod: http://pastie.org/8191459
İki serbestlik derecesine (X, Y) izin vermek için lazer işaretçisiyle birlikte iki servo bağladım. Servoları çeşitli şekillerde kontrol etmek için birkaç düğmenin durumuna bağlı seçenekler vardır. Birincisi, ışığa maruz kalma miktarına bağlı olarak, servoların konumunu etkileyen iki fotodirençim olan "Hareket" tir. Henüz bir Xbox denetleyicisi tarafından servoları kontrol etmek için kod uygulamadı. Ve üçüncü seçenek sadece rastgele harekettir.