Здравствуйте, столкнулся с проблемой набегания при работе робота, помогите разобраться. Значит, есть голова робота, она крепится на вал мотора, по замыслу голова должна вращаться по часовой стрелке 2 сек., потом пауза, 2 сек. против часовой. Вроде все просто, но через час-два голова практически выворачивается наизнанку, такое сильное набегание. В чем может быть проблема? Код который я использую: #define SPEED_LEFT 6 #define SPEED_RIGHT 5 #define DIR_LEFT 7 #define DIR_RIGHT 4 void go(int speed, bool reverseLeft, bool reverseRight, int duration) { analogWrite(SPEED_LEFT, speed); analogWrite(SPEED_RIGHT, speed); digitalWrite(DIR_LEFT, reverseLeft ? LOW : HIGH); digitalWrite(DIR_RIGHT, reverseRight ? LOW : HIGH); delay(duration); } void setup() { for(int i = 5; i <= 8; i++) pinMode(i, OUTPUT); } void loop() { // Вращение go(255, 0, false, true, 5000); // Пауза go(0, 0, true, false, 1000); // Вращение go(255, 0, true, false, 5000); // Пауза go(0, 0, false, false, 1000); }
Ошибка в отсутствии системы абсолютного позиционирования или иной обратной связи. У вас набегает ошибка из-за неточности механики, при этом в системе нет обратной связи, т.е. невозможна коррекция ошибки позиционирования, поскольку неизвестна ее величина. Программа управления для системы без обратной связи вполне корректна, в ней нет ошибок, но есть предположение о том, что механика идеальна. Систематическую ошибку можно частично побороть калибровкой. Если ошибка набегает стабильно с определенной скоростью (сколько-то градусов на один поворот), можно попытаться это скомпенсировать уменьшением или увеличением задержки в одном плече, величину поправки рассчитать из скорости набегания ошибки. Код (C): void loop() { go(255, 0, false, true, 5000); // Вращение go(0, 0, true, false, 1000); // Пауза go(255, 0, true, false, 5132); // 5000 Вращение + 132 коррекция go(0, 0, false, false, 1000); // Пауза }
Ну а полностью проблема решается установкой энкодера: оптического и магнитного, который будет точно говорить, что голова вот сейчас находится в своём крайнем положении