Проблема с кодом движения по прямой линии и остановки в заданной точке
- Войдите на сайт для отправки комментариев
Втр, 03/05/2016 - 23:15
Вечер добрый. Может кто сможет помочь с программой. Идея такая, что трехостный робокар должен проехать по прямой линии и остановиться через заданное расстояние. Написал кое какую программу которая выравнивает движение. В программировании не силен.
Первая проблема. Когда я подключаю ардуину к компу, заливаю скетч в котором указываю что если расстояние больше 100 см, то стоп. По монитору порта, благодаря данным поступающих со счетчиков импульсов, отслеживаю пройденное расстояние. Все работает просто отлично. Но когда я отключаюсь от пк, ставлю машинку на пол и включаю, она вместо 100 см проезжает 130-170. Причем очень частым является то, что после остановки машинка может рывком проехать еще некоторое расстояние.
Вторая проблема возникает в части кода отвечающем за корректировку движения. Алгоритм следующий: сравниваем количество импульсов на правом и левом колесе. Если на правом колесе импульсов больше, то мы останавливаем его, тем самым левое колесо проезжает недостающее расстояние, и аналогично с левым колесом. Т.е. в теории должно произойти следующее: если мы рукой остановим одно из колес, второе тоже должно остановиться и сигнал должен подаваться только на то колесо, которое мы остановили. На деле происходит следующее: остановив левое колесо, правое колесо останавливается, но если остановить правое колесо, то левое продолжает крутиться, а так быть не должно.
Мне кажется что все дело в моих дуратских циклах, но иначе у меня никак не получилось реализовать.
Если кто сможет, помогите подправить код.
Использую
Arduino Mega 2560
Motor shield L293D
Код программы:
#include <AFMotor.h> // Подключаем библиотеку для управления двигателями //Создаем объекты для двигателей AF_DCMotor motor1(1); //канал М1 на Motor Shield — левый AF_DCMotor motor2(2); //канал М2 на Motor Shield — правый enum { ENC_PIN1 = 22, ENC_PIN2 = 23 }; // пины с энкодеров // все во float потому что иначе неправильно считалось расстояние float contL=0.00; // импульсы с левого колеса float contP=0.00; // импульсы с правого колеса float contS=0.00; //разница между количеством импульсов на колесах float L;//расстояние пройденное левым колесом float P;//расстояние пройденное правым колесом float N=20.00; // число дырок на диске энкодера boolean kflagL=LOW; boolean kflagP=LOW; void setup() { pinMode(ENC_PIN1, INPUT); digitalWrite(ENC_PIN1, HIGH); pinMode(ENC_PIN2, INPUT); digitalWrite(ENC_PIN2, HIGH); Serial.begin(9600); go();} void loop() { //************ Для левого колеса *************** if (digitalRead(ENC_PIN1)==HIGH) { kflagL=HIGH; } if(digitalRead(ENC_PIN1)==LOW && kflagL==HIGH) { contL=contL+1; Serial.println("Dlya LEVOGO kolesa:"); Serial.print(contL); L=(contL/N)*3.14*8; Serial.print(" | "); Serial.println(L); stop(); kflagL=LOW; } //************* Для правого колеса **************** if (digitalRead(ENC_PIN2)==HIGH) { kflagP=HIGH; } if(digitalRead(ENC_PIN2)==LOW && kflagP==HIGH) { contP=contP+1; Serial.println("Dlya PRAVOGO kolesa:"); Serial.print(contP); P=(contP/N)*3.14*8; Serial.print(" | "); Serial.println(P); stop(); kflagP=LOW; } //******************************************** // Часть кода отвечающая за стабилизацию движения contS=contL-contP; if (contS==0.00){ go();} if (contS<0.00){right();} else {left;} if (contS>0.00){left();} else {right;} //******************************************** } void stop(){ if(L>=100.00 or P>=100) //условие отвечающее за остановку через заданное расстояние { motor1.setSpeed(0); motor2.setSpeed(0); motor1.run(RELEASE); motor2.run(RELEASE); } } void go(){ // Движение вперед motor1.run(FORWARD); motor2.run(FORWARD); //Устанавливаем скорость 100% (0-255) motor1.setSpeed(255); motor2.setSpeed(255); } void left(){ motor1.setSpeed(0); motor2.setSpeed(255); } void right(){ motor1.setSpeed(255); motor2.setSpeed(0); }
Для начала исправьте ошибки. В частности, в строках 71,72 что там у вас в блоке else без скобок отписано? Остальное смотреть не стал, думаю Вы сами пересмотрите лучше.