Очень просто, я управляю сервоприводами (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
Там, где необходимо выполнить инициализацию, инициализируйте переменные, в которых хранится отображенное значение серво (используя библиотеку серво 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,28 В в моем случае). Если я напишу функцию так, чтобы либо ИЛИ было меньше, чем DEG, то что, если я менял только один сервопривод за раз? Так что есть делимма ..
Это просто свойство сервоприводов (возможно, дешевых?) Или есть обходной путь?
Было бы намного проще включить ссылку на ссылку. Вот полный код: http://pastie.org/8191459
Я прикрепил два сервопривода вместе с лазерной указкой, чтобы обеспечить две степени свободы (X, Y). Существуют опции, основанные на состоянии нескольких кнопок, для управления сервоприводами различными способами. Первый - «Движение», где у меня есть два фоторезистора, которые, в зависимости от степени освещенности, влияют на положение сервоприводов. Я еще не реализовал код для управления сервоприводами с помощью контроллера Xbox. И третий вариант - просто случайное движение.