อย่างง่าย ๆ ฉันควบคุม servos (9g Micro Servos) ตามข้อมูลที่อ่านจากที่อื่น ทุกอย่างทำงานได้ดียกเว้นเซอร์โวจะ "สั่น" อย่างต่อเนื่อง นั่นคือพวกมันสั่นสะเทือนด้วยการเคลื่อนไหวที่ละเอียดอ่อนมาก (ด้วยการเคลื่อนไหวที่ไม่สม่ำเสมอของ 1/2 -> 1 ซม. หรือมากกว่านั้น)
ฉันพยายามแก้ไขปัญหานี้ในซอฟต์แวร์โดยทำสิ่งที่ชอบ:
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
ที่จำเป็นต้องทำในขณะเริ่มต้นตัวแปรที่เก็บค่า servo ที่แมป (โดยใช้ไลบรารี arduino servo)
ฟังก์ชัน 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 คือค่าที่เริ่มต้น (เอาต์พุตแรกที่แม็พเซอร์โว)
แม้ว่านี่จะไม่ใช่วิธีการที่ดีจริงๆ มันต้องการให้ค่า BOTH ต้องไม่เปลี่ยนแปลงโดย DEG (~ 10 องศาหรือ ~ 0.28V ในกรณีของฉัน) ถ้าฉันเขียนฟังก์ชันเช่นนั้นหรือน้อยกว่า DEG ถ้าฉันเปลี่ยนเซอร์โวครั้งละหนึ่งครั้งล่ะ ดังนั้นจึงมีข้อผิดพลาดคือ ..
นี่เป็นเพียงคุณสมบัติของเซอร์โว (อาจจะถูกหรือไม่) หรือมีวิธีแก้ปัญหาหรือไม่?
มันจะง่ายกว่ามากถ้าจะรวมลิงค์ของ Pastie นี่คือรหัสเต็ม: http://pastie.org/8191459
ฉันได้แนบเซอร์โวสองตัวพร้อมกับตัวชี้เลเซอร์เพื่อให้มีอิสระสององศา (X, Y) มีตัวเลือกตามสถานะของปุ่มหลายปุ่มเพื่อควบคุมเซอร์โวในรูปแบบต่างๆ อย่างแรกคือ "โมชั่น" ที่ฉันมีสองโฟโต้ต้านทานที่ขึ้นอยู่กับปริมาณของแสงที่กระทบกับตำแหน่งของเซอร์โว ฉันยังไม่ได้ติดตั้งรหัสเพื่อควบคุมเซอร์โวโดยคอนโทรลเลอร์ Xbox และตัวเลือกที่สามเป็นการเคลื่อนไหวแบบสุ่ม