Задача, следующая за линией — робот движется вперед, но игнорирует линию

#c #arrays #function #robot

Вопрос:

Я пытаюсь решить задачу, следующую за линией, с помощью робота 3Pi , используя 3 ИК-датчика (массив в моем коде), и хотя я заставляю свой массив работать, получаю правильные данные на последовательном мониторе и устанавливаю пороговое значение для своих датчиков, я, похоже, не могу заставить робота следовать линии : робот движется вперед, но игнорирует линию.

Я добавляю свой код здесь:

 const int left_sensor_pin = A0;
const int right_sensor_pin = A3;
const int centre_sensor_pin = A2;

// store values into array
#define NB_LS_PINS 3
int ls_pin[NB_LS_PINS] = { left_sensor_pin, centre_sensor_pin, right_sensor_pin };
int which;

// store time
unsigned long start_time;
unsigned long elapsed_time [3];
unsigned long end_time_ls [3];
unsigned long set_motors;

bool done = false;

# define L_PWM_PIN 10
# define L_DIR_PIN 16
# define R_PWM_PIN 9
# define R_DIR_PIN 15

void setup() {
  Serial.begin (9600);
  pinMode (left_sensor_pin, INPUT);
  pinMode (right_sensor_pin, INPUT);
  pinMode (centre_sensor_pin, INPUT);
  delay(5000);

  pinMode(L_PWM_PIN, OUTPUT);
  pinMode(L_DIR_PIN, OUTPUT);
  pinMode(R_PWM_PIN, OUTPUT);
  pinMode(R_DIR_PIN, OUTPUT);

  digitalWrite(L_DIR_PIN, LOW);
  digitalWrite(R_DIR_PIN, LOW);

  analogWrite(L_PWM_PIN, 50);
  analogWrite(R_PWM_PIN, 50);
}

void loop() {

  //charge capacitor
  pinMode (left_sensor_pin, OUTPUT);
  pinMode (right_sensor_pin, OUTPUT);
  pinMode (centre_sensor_pin, OUTPUT);
  digitalWrite(left_sensor_pin, HIGH);
  digitalWrite(right_sensor_pin, HIGH);
  digitalWrite(centre_sensor_pin, HIGH);

  // Delay for capacitor to charge.
  delayMicroseconds(10);
  start_time = micros();

  pinMode (left_sensor_pin, INPUT);
  pinMode (right_sensor_pin, INPUT);
  pinMode (centre_sensor_pin, INPUT);

  bool pins_read [3] = {false, false, false};
  done = false;

  while ( done == false ) {

    for ( int which = 0; which < NB_LS_PINS; which  ) {

      if ( digitalRead (ls_pin[ which ]) == LOW amp;amp; pins_read [which] == false) { // need also to track whether pins are read, a single = is setting to a value and == compares values

        end_time_ls [which] = micros ();
        elapsed_time [which] = micros() - start_time;
        pins_read [which] = true;
      }

      if (pins_read [0] == true amp;amp; pins_read [1] == true amp;amp; pins_read [2] == true) {

        done = true;
      }
    }
  }

  elapsed_time[0] = end_time_ls [0] - start_time;
  elapsed_time[1] = end_time_ls [1] - start_time;
  elapsed_time[2] = end_time_ls [2] - start_time;

  Serial.println (elapsed_time [0]);
  Serial.println (elapsed_time [1]);
  Serial.println (elapsed_time [2]);
  Serial.println("------------------------------");

  //Motors

  if (elapsed_time [0] < 10000 amp;amp; elapsed_time[1] > 10000 amp;amp; elapsed_time[2]  < 10000)
  {
    //go forward
    analogWrite( L_PWM_PIN, 100 );
    analogWrite( R_PWM_PIN, 100 );
  }

  else if (elapsed_time [0] > 10000 amp;amp; elapsed_time[1] < 10000 amp;amp; elapsed_time[2]  < 10000)
  {
    // Turn right.
    analogWrite( L_PWM_PIN, 100 );
    analogWrite( R_PWM_PIN, 0 );
  }
  else if (elapsed_time [0] < 10000 amp;amp; elapsed_time[1] < 10000 amp;amp; elapsed_time[2]  > 10000)
  {
    // turn left.
    analogWrite( L_PWM_PIN, 0 );
    analogWrite( R_PWM_PIN, 100 );
  }
}
 

Комментарии:

1. Я подозреваю, что проблема в последней части, где у вас есть тройное условие, разделенноеamp;amp;, но у вас нет другого условия, и вы не охватываете все возможности этих 3 утверждений с помощью if/elseif. Из-за этого движение вперед, заданное сначала, может просто остаться неизменным навсегда, если вы не введете одно из 2 других «если». У меня нет оборудования, поэтому я не могу проверить наверняка, но, возможно, стоит добавить сюда еще и проверить, какие из них вперед/вправо/влево вы охватываете во время выполнения

2. Спасибо! Я постараюсь добавить «еще», чтобы охватить больше. Мне также было интересно, правильно ли было бы добавить пороговое значение или вместо этого я должен добавить что-то вроде этого: « без знака длинное значение left_sensor_value = digitalRead (left_sensor_pin); без знака длинное значение centre_sensor_value = digitalRead (centre_sensor_pin); без знака длинное значение right_sensor_value = digitalRead (right_sensor_pin); если (left_sensor_value == НИЗКИЙ amp;amp; centre_sensor_value == ВЫСОКИЙ amp;amp; right_sensor_value == НИЗКИЙ) //перейти к аналоговой записи( L_PWM_PIN, 100 ); Аналоговая запись( R_PWM_PIN, 100 ); «

3. Это зависит от точности и предпочтений. Сервоприводы никогда не будут работать точно так же в фиксированное время из-за разницы в мощности или физической мощности, но это облегчает кодирование, и если ошибка достаточно мала, чтобы ее игнорировать, сделайте это. Потому что, хотя поворот на определенный угол более точен, для определения того, куда вы смотрите, требуются дополнительные датчики гироскопа или какой-то другой метод. последнее примечание: обязательно проверьте, что произойдет, если один из них каким-то образом будет точно равен 10000. похоже, что вы игнорируете это на всех остальных ветвях, судя по всему.

4. Правда, мне может понадобиться использовать =>> Но знаете ли вы, как писать интервалы в Arduino ? Я хотел бы написать что-то вроде if 20000<sensorsX.. но я не могу найти эту информацию на сайтах C