Проблема в программе. Не выполняются необходимые действия.
- Войдите на сайт для отправки комментариев
Сб, 13/06/2015 - 18:40
Здравствуйте. Решил сделать робота-машинку, сделал по примеру этой статьи http://payaem.ru/avtonomnaya-mashinka.html
Проблема: Загрузил код, все вроде бы хорошо, но, после того как робот-машинка натыкается на препятствие останавливается, поворачивает колеса и все, ни назад не едет, ни вперед влево или вправо. Проше говоря, робот не избегает препятствия.
Буду очень благодарен за помощь. В заранее СПАСИБО!
#include <Ultrasonic.h> int motorPin1 = 9; int motorPin2 = 10; int motorPin3 = 7; int motorPin4 = 8; int steeringMotorSpeed = 150; int avoidDistance = 80; int endAvoidDistance = 100; int goToReverseDistance = 55; int reverseTime = 2000; int fullTrottleMinDistance = 250; int fullTrottleSpeed = 220; int cruiseSpeed = 160; int avoidSpeed = 120; int reverseSpeed = 130; int sensorDelay = 100; long randNumber; int avoidDirection = 1; int avoidCirclesBeforeDirectionChange = 10; int countDown = 1; int distanceCountDown = 1; #include "Ultrasonic.h" Ultrasonic ultrasonic(12,13); int distance = (ultrasonic.Ranging(CM)); void setup() { Serial.begin(9600); randomSeed(analogRead(0)); pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); } void loop() { // Serial.println("start loop "); // Serial.println(ultrasonic.Ranging(CM)); //choseMode(); distance = (ultrasonic.Ranging(CM)); if(distance <= goToReverseDistance){ avoidDirection = avoidDirection * -1; // while(distance < avoidDistance) { // Serial.println("start reverse "); if(avoidDirection == 1){ analogWrite(motorPin3, steeringMotorSpeed); digitalWrite(motorPin4, LOW); } else { analogWrite(motorPin4, steeringMotorSpeed); digitalWrite(motorPin3, LOW); } analogWrite(motorPin2, reverseSpeed); digitalWrite(motorPin1, LOW); delay(reverseTime); // delay(sensorDelay); distance = (ultrasonic.Ranging(CM)); // } digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); avoidDirection = avoidDirection * -1; distance = (ultrasonic.Ranging(CM)); } distance = (ultrasonic.Ranging(CM)); if(distance < avoidDistance){ // Serial.println("start avoid "); distance = (ultrasonic.Ranging(CM)); countDown = avoidCirclesBeforeDirectionChange; distanceCountDown = distance; while(distance <= endAvoidDistance && distance > goToReverseDistance){ if(avoidDirection == 1){ analogWrite(motorPin3, steeringMotorSpeed); digitalWrite(motorPin4, LOW); } else { analogWrite(motorPin4, steeringMotorSpeed); digitalWrite(motorPin3, LOW); } analogWrite(motorPin1, avoidSpeed); digitalWrite(motorPin2, LOW); delay(sensorDelay); distance = (ultrasonic.Ranging(CM)); if(distance < distanceCountDown) { countDown--; } if(countDown < 1) { avoidDirection = avoidDirection * -1; countDown = avoidCirclesBeforeDirectionChange; distanceCountDown = distance; } // Serial.println(distance); // Serial.println(avoidDirection); } // end while (avoid) digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); } distance = (ultrasonic.Ranging(CM)); while(distance > avoidDistance && distance < fullTrottleMinDistance){ analogWrite(motorPin1, cruiseSpeed); digitalWrite(motorPin2, LOW); delay(sensorDelay); distance = (ultrasonic.Ranging(CM)); // Serial.println("cruise"); // Serial.println(distance); } // end while distance = (ultrasonic.Ranging(CM)); while(distance > fullTrottleMinDistance){ analogWrite(motorPin1, fullTrottleSpeed); digitalWrite(motorPin2, LOW); delay(sensorDelay); distance = (ultrasonic.Ranging(CM)); // Serial.println("FULL"); // Serial.println(distance); } // end while // Serial.println("REstart loop "); // Serial.println(distance); }
Попробуй раскомпелировать строку 71, 85 там ведь и написано start reverse (начать обратное).
Спасибо за ответ, но к сожалению не помогло! :)
раскомпелировать 59 строку см какк работает датчик, если в порту не будет 80 или меньше думай почему, молотком её или препятствие поменять.
аааааа.... Не работает! :(