Помогите найти ошибку в коде

Vero4ek

✩✩✩✩✩✩✩
25 Апр 2024
1
0
Дана программа arduino mega для робота, который должен пройти трассу в виде лабиринта, используя ультразвуковые датчики. Все порты проверила
C++:
#include <Servo.h>
#include <NewPing.h>

Servo motor;    // Объект для управления мотором
Servo myservo;  // Объект для управления сервоприводом

// Пины для ультразвуковых датчиков
#define FRONT_TRIGGER_PIN 13
#define FRONT_ECHO_PIN 12
#define LEFT_TRIGGER_PIN 4
#define LEFT_ECHO_PIN 5
#define RIGHT_TRIGGER_PIN 10
#define RIGHT_ECHO_PIN 11
#define BACK_TRIGGER_PIN 6
#define BACK_ECHO_PIN 7

// Максимальное расстояние для измерения (в сантиметрах)
#define MAX_DISTANCE 300

// Пороговые расстояния для определения препятствий (в сантиметрах)
#define OBSTACLE_FRONT_DISTANCE 20
#define OBSTACLE_SIDE_DISTANCE 30
#define OBSTACLE_BACK_DISTANCE 10

// Объекты для ультразвуковых датчиков
NewPing sonarFront(FRONT_TRIGGER_PIN, FRONT_ECHO_PIN, MAX_DISTANCE);
NewPing sonarLeft(LEFT_TRIGGER_PIN, LEFT_ECHO_PIN, MAX_DISTANCE);
NewPing sonarRight(RIGHT_TRIGGER_PIN, RIGHT_ECHO_PIN, MAX_DISTANCE);
NewPing sonarBack(BACK_TRIGGER_PIN, BACK_ECHO_PIN, MAX_DISTANCE);

void setup() {
  // Serial.begin(9600); // Инициализация последовательной связи для вывода данных в монитор порта
  motor.attach(8);    // Подключение мотора к пину 8
  myservo.attach(9);  // Подключение сервопривода к пину 9

  motor.writeMicroseconds(1500);  // Установка мотора в нейтральное положение
  myservo.write(90);              // Устанавливает сервопривод в положение 90 градусов
  delay(1000);                    // Задержка для стабилизации
}

void loop() {
  int distanceFront = sonarFront.ping_cm();  // Измерение расстояния спереди
  int distanceLeft = sonarLeft.ping_cm();    // Измерение расстояния слева
  int distanceRight = sonarRight.ping_cm();  // Измерение расстояния справа
  int distanceBack = sonarBack.ping_cm();    // Измерение расстояния сзади

  Serial.print("Front Distance: ");
  Serial.print(distanceFront);
  Serial.println(" cm");

  Serial.print("Left Distance: ");
  Serial.print(distanceLeft);
  Serial.println(" cm");

  Serial.print("Right Distance: ");
  Serial.print(distanceRight);
  Serial.println(" cm");

  Serial.print("Back Distance: ");
  Serial.print(distanceBack);
  Serial.println(" cm");

  // Логика движения в зависимости от обнаруженных препятствий
  if (distanceFront > 0 && distanceFront <= OBSTACLE_FRONT_DISTANCE) {
    // Обнаружено препятствие спереди, выбираем направление поворота
    if (distanceLeft > OBSTACLE_SIDE_DISTANCE && distanceRight > OBSTACLE_SIDE_DISTANCE) {
      // Если по бокам свободно, поворачиваем налево или направо случайным образом
      if (random(0, 2) == 0) {
        turnLeft();
      } else {
        turnRight();
      }
    } else if (distanceLeft > OBSTACLE_SIDE_DISTANCE) {
      // Если слева свободно, поворачиваем налево
      turnLeft();
    } else if (distanceRight > OBSTACLE_SIDE_DISTANCE) {
      // Если справа свободно, поворачиваем направо
      turnRight();
    } else {
      // Если спереди и по бокам препятствия, поворачиваем назад
      turnBack();
    }
  } else if (distanceBack > 0 && distanceBack <= OBSTACLE_BACK_DISTANCE) {
    // Обнаружено препятствие сзади, поворачиваем назад
    turnBack();
  } else {
    // Нет препятствий, двигаемся вперед
    moveForward();
  }

  delay(50);  // Небольшая задержка между итерациями цикла
}

// Функция движения вперед
void moveForward() {
  motor.writeMicroseconds(1570);  // Увеличиваем пульс для движения вперед
}

// Функция движения назад
void moveBackward() {
  motor.writeMicroseconds(1400);  // Уменьшаем пульс для движения назад
}

// Функция поворота налево
void turnLeft() {
  myservo.write(60);  // Поворот налево
  delay(500);         // Задержка для поворота
  myservo.write(90);  // Возврат в нейтральное положение
}

// Функция поворота направо
void turnRight() {
  myservo.write(120);  // Поворот направо
  delay(500);          // Задержка для поворота
  myservo.write(90);   // Возврат в нейтральное положение
}

// Функция разворота назад
void turnBack() {
  myservo.write(180);  // Разворот назад
  delay(1000);         // Задержка для разворота
  myservo.write(90);   // Возврат в нейтральное положение
}
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,970
632
45
// Если по бокам свободно, поворачиваем налево или направо случайным образом

// Если слева свободно, поворачиваем налево

// Если справа свободно, поворачиваем направо
"Замечательная" логика. Так он будет целую вечность ездить по лабиринту.
 

Сотнег

★★★★★★★
15 Янв 2020
4,372
1,497
@Vero4ek,
типа, робот начинает туда-сюда переж препятствием дёргаться?
Или какую ошибку вы хотите найти?
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,058
910
@Vero4ek, вам уже на другом форуме сказали вроде - формулируйте проблему грамотно. Как проявляется ошибка в коде?
Или вы ожидаете, что все станут собирать такого же робота и тестировать, что с ним не так?
 

ForZe

✩✩✩✩✩✩✩
2 Май 2024
7
0
C++:
else if (distanceBack > 0 && distanceBack <= OBSTACLE_BACK_DISTANCE) {
    // Обнаружено препятствие сзади, поворачиваем назад
    turnBack();
Если обнаружено препятствие сзади, поворачиваем назад? В препятствие? Зачем поворачивать в обнаруженное препятствие?

Может Вы хотели написать примерно так:
C++:
else if (distanceFront > 0 && distanceBack <= OBSTACLE_BACK_DISTANCE) {
    // Обнаружено препятствие сзади, ЕДЕМ ВПЕРЕД
moveForward();
?