Помогите, проблема с датчиком линии
- Войдите на сайт для отправки комментариев
Пнд, 21/01/2013 - 23:04
#define SPEED_LEFT 6 #define SPEED_RIGHT 5 #define DIR_LEFT 7 #define DIR_RIGHT 4 #define LEFT_SENSOR_PIN 8 #define RIGHT_SENSOR_PIN 9 // Скорость, с которой мы движемся вперёд (0-255) #define SPEED 100 // Скорость прохождения сложных участков #define SLOW_SPEED 35 #define BACK_SLOW_SPEED 30 #define BACK_FAST_SPEED 50 // Коэффициент, задающий во сколько раз нужно затормозить // одно из колёс для поворота #define BRAKE_K 4 #define STATE_FORWARD 0 #define STATE_RIGHT 1 #define STATE_LEFT 2 #define SPEED_STEP 7 #define FAST_TIME_THRESHOLD 75 int state = STATE_FORWARD; int currentSpeed = SPEED; int fastTime = 0; //моя вставка int sensorPin1 = A2; // select the input pin for the potentiometer int sensorPin2 = A3; int sensorPin3 = A4; int sensorPin4 = A5; int sensorPin5 = A6; // select the input pin for the potentiometer int sensorPin6 = A7; int sensorPin7 = A0; int sensorPin8 = A1; int ledPin = 13; // select the pin for the LED int sensorValue1 = 0; // variable to store the value coming from the sensor int sensorValue2 = 0; int sensorValue3 = 0; int sensorValue4 = 0; int sensorValue5 = 0; // variable to store the value coming from the sensor int sensorValue6 = 0; int sensorValue7 = 0; int sensorValue8 = 0; int qtr1 = 0; int qtr2 = 0; int qtr3 = 0; int qtr4 = 0; int qtr5 = 0; int qtr6 = 0; int qtr7 = 0; int qtr8 = 0; int qtrposition = 0; int qtrpositionERROR = 0; int label = 0; int L = 0; int R = 0; int stat=0; // конец моей вставки void runForward() { state = STATE_FORWARD; fastTime += 1; if (fastTime < FAST_TIME_THRESHOLD) { currentSpeed = SLOW_SPEED; } else { currentSpeed = min(currentSpeed + SPEED_STEP, SPEED); } analogWrite(SPEED_LEFT, currentSpeed); analogWrite(SPEED_RIGHT, currentSpeed); digitalWrite(DIR_LEFT, LOW); digitalWrite(DIR_RIGHT, LOW); } void steerRight() { state = STATE_RIGHT; fastTime = 0; // Замедляем правое колесо относительно левого, // чтобы начать поворот analogWrite(SPEED_RIGHT, 0); analogWrite(SPEED_LEFT, SPEED); digitalWrite(DIR_LEFT, LOW); digitalWrite(DIR_RIGHT, LOW); } void steerLeft() { state = STATE_LEFT; fastTime = 0; analogWrite(SPEED_LEFT, 0); analogWrite(SPEED_RIGHT, SPEED); digitalWrite(DIR_LEFT, LOW); digitalWrite(DIR_RIGHT, LOW); } void stepBack(int duration, int state) { if (!duration) return; // В зависимости от направления поворота при движении назад будем // делать небольшой разворот int leftSpeed = (state == STATE_RIGHT) ? BACK_SLOW_SPEED : BACK_FAST_SPEED; int rightSpeed = (state == STATE_LEFT) ? BACK_SLOW_SPEED : BACK_FAST_SPEED; analogWrite(SPEED_LEFT, leftSpeed); analogWrite(SPEED_RIGHT, rightSpeed); // реверс колёс digitalWrite(DIR_RIGHT, HIGH); digitalWrite(DIR_LEFT, HIGH); delay(duration); } void setup() { // Настраивает выводы платы 4,5,6,7 на вывод сигналов for(int i = 4; i <= 7; i++) pinMode(i, OUTPUT); Serial.begin(9600); // Сразу едем вперёд runForward(); } void loop() { //моя вставка sensorValue8 = analogRead(sensorPin8); sensorValue1 = analogRead(sensorPin1); sensorValue2 = analogRead(sensorPin2); sensorValue3 = analogRead(sensorPin3); sensorValue4 = analogRead(sensorPin4); sensorValue5 = analogRead(sensorPin5); sensorValue6 = analogRead(sensorPin6); sensorValue7 = analogRead(sensorPin7); // qtr1 if (sensorValue1 < 250) // qtr1 { qtr1 = 0; // действие A } if (sensorValue1 > 600) { qtr1 = 1; // действие B } // qtr2 if (sensorValue2 < 250) // qtr1 { qtr2 = 0; // действие A } if (sensorValue2 > 600) { qtr2 = 1; // действие B } // qtr3 if (sensorValue3 < 250) // qtr1 { qtr3 = 0; // действие A } if (sensorValue3 > 600) { qtr3 = 1; // действие B } // qtr4 if (sensorValue4 < 250) // qtr1 { qtr4 = 0; // действие A } if (sensorValue4 > 600) { qtr4 = 1; // действие B } // qtr5 if (sensorValue5 < 250) // qtr1 { qtr5 = 0; // действие A } if (sensorValue5 > 600) { qtr5 = 1; // действие B } // qtr6 if (sensorValue6 < 250) // qtr1 { qtr6 = 0; // действие A } if (sensorValue6 > 600) { qtr6 = 1; // действие B } // qtr7 if (sensorValue7 < 250) // qtr1 { qtr7 = 0; // действие A } if (sensorValue7 > 600) { qtr7 = 1; // действие B } // qtr8 if (sensorValue8 < 250) // qtr1 { qtr8 = 0; // действие A } if (sensorValue8 > 600) { qtr8 = 1; // действие B } // Наш робот ездит по белому полю с чёрным треком. В обратном случае не нужно // инвертировать значения с датчиков if (qtr8==0 ,qtr7==0 ) { L=0; } else { L=1; } if (qtr2==0 ,qtr1==0 ) { R=0; } else { R=1; } boolean left = R; boolean right = L; // В какое состояние нужно перейти? int targetState; if (left == right) { // под сенсорами всё белое или всё чёрное // едем вперёд targetState = STATE_FORWARD; } else if (left) { // левый сенсор упёрся в трек // поворачиваем налево targetState = STATE_LEFT; } else { targetState = STATE_RIGHT; } if (state == STATE_FORWARD && targetState != STATE_FORWARD) { int brakeTime = (currentSpeed > SLOW_SPEED) ? currentSpeed : 0; stepBack(brakeTime, targetState); } switch (targetState) { case STATE_FORWARD: Serial.println("STATE_FORWARD"); runForward(); break; case STATE_RIGHT: Serial.println("STATE_RIGHT"); steerRight(); break; case STATE_LEFT: Serial.println("STATE_LEFT"); steerLeft(); break; } Serial.print("L="); Serial.print(L); Serial.print(" "); Serial.print("R="); Serial.println(R); Serial.print("currentSpeed="); Serial.println(currentSpeed); Serial.print("fastTime="); Serial.println(fastTime); Serial.println(stat); }
написал код для перемещения по черной линии, но на теперь на поворотах останавливаеться , и долго думает , что делать?