Робот едет по черной линии

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Majormaks1204, 3 фев 2024.

  1. Majormaks1204

    Majormaks1204 Нуб

    Доброго времени суток ВСЕМ! Подскажите пожалуйста, как добавить третий датчик линии роботу? Робот - старый робот пылесос. Питание от аккумулятора, не родного но подходящего по характеристикам. Управление Arduino uno (амперка),Motorshield (амперка). Питание arduino от 12 вольт аккумулятора. Питание раздельное. С двумя датчиками линии по данному примеру работает отлично
    Код (C++):
    // Моторы подключаются к клеммам M1+,M1-,M2+,M2-
    // Motor shield использует четыре контакта 6,5,7,4 для управления моторами
    #define SPEED_LEFT       6
    #define SPEED_RIGHT      5
    #define DIR_LEFT         7
    #define DIR_RIGHT        4
    #define LEFT_SENSOR_PIN  A3
    #define RIGHT_SENSOR_PIN A5
    // Скорость, с которой мы движемся вперёд (0-255)
    #define SPEED            155
    // Скорость прохождения сложных участков
    #define SLOW_SPEED       25
    #define BACK_SLOW_SPEED  15
    #define BACK_FAST_SPEED  40
    // Коэффициент, задающий во сколько раз нужно затормозить
    // одно из колёс для поворота
    #define BRAKE_K          5
    #define STATE_FORWARD    0
    #define STATE_RIGHT      1
    #define STATE_LEFT       2
    #define SPEED_STEP       2
    #define FAST_TIME_THRESHOLD     300
    int state = STATE_FORWARD;
    int currentSpeed = SPEED;
    int fastTime = 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, HIGH);
        digitalWrite(DIR_RIGHT, HIGH);
    }
    void steerRight()
    {
        state = STATE_RIGHT;
        fastTime = 0;
        // Замедляем правое колесо относительно левого,
        // чтобы начать поворот
        analogWrite(SPEED_RIGHT, 0);
        analogWrite(SPEED_LEFT, SPEED);
        digitalWrite(DIR_LEFT, HIGH);
        digitalWrite(DIR_RIGHT, HIGH);
    }
    void steerLeft()
    {
        state = STATE_LEFT;
        fastTime = 0;
        analogWrite(SPEED_LEFT, 0);
        analogWrite(SPEED_RIGHT, SPEED);
        digitalWrite(DIR_LEFT, HIGH);
        digitalWrite(DIR_RIGHT, HIGH);
    }
    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, LOW);
        digitalWrite(DIR_LEFT, LOW);
        delay(duration);
    }
    void setup()
    {
        // Настраивает выводы платы 4,5,6,7 на вывод сигналов
        for(int i = 4; i <= 7; i++)
            pinMode(i, OUTPUT);
        // Сразу едем вперёд
        runForward();
    }
    void loop()
    {
        // Наш робот ездит по белому полю с чёрным треком. В обратном случае не нужно
        // инвертировать значения с датчиков
        boolean left = !digitalRead(LEFT_SENSOR_PIN);
        boolean right = !digitalRead(RIGHT_SENSOR_PIN);
        // В какое состояние нужно перейти?
        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:
                runForward();
                break;
            case STATE_RIGHT:
                steerRight();
                break;
            case STATE_LEFT:
                steerLeft();
                break;
        }
    }
    Нужно добавить третий датчик линии и функцию остановки когда три датчика на черной линии. Так же при включении питания-задний ход, разворот и выезд на черную линию. Пробовал несколько похожих примеров, но нет движения вообще:
    Код (C++):
    // Include necessary libraries
    #include <AFMotor.h>

    // Define motor shield pins
    #define MOTOR1 1
    #define MOTOR2 2

    // Define line sensors pins
    #define LINE_SENSOR1 A3
    #define LINE_SENSOR2 A4
    #define LINE_SENSOR3 A5

    // Create motor shield object
    AF_DCMotor motor1(MOTOR1);
    AF_DCMotor motor2(MOTOR2);

    // Define variables for line sensor readings
    int sensor1, sensor2, sensor3;

    void setup() {
      // Initialize serial communication
      Serial.begin(9600);

      // Set motor speed
      motor1.setSpeed(255);
      motor2.setSpeed(255);

      // Set line sensor pins as inputs
      pinMode(LINE_SENSOR1, INPUT);
      pinMode(LINE_SENSOR2, INPUT);
      pinMode(LINE_SENSOR3, INPUT);
    }

    void loop() {
      // Read line sensor values
      sensor1 = digitalRead(LINE_SENSOR1);
      sensor2 = digitalRead(LINE_SENSOR2);
      sensor3 = digitalRead(LINE_SENSOR3);

      // If all three sensors are on black line, stop
      if (sensor1 == LOW && sensor2 == LOW && sensor3 == LOW) {
        motor1.run(RELEASE);
        motor2.run(RELEASE);
      }
      // If only sensor1 is on black line, turn left
      else if (sensor1 == LOW) {
        motor1.run(FORWARD);
        motor2.run(BACKWARD);
      }
      // If only sensor3 is on black line, turn right
      else if (sensor3 == LOW) {
        motor1.run(BACKWARD);
        motor2.run(FORWARD);
      }
      // If only sensor2 is on black line, move forward
      else if (sensor2 == LOW) {
        motor1.run(FORWARD);
        motor2.run(FORWARD);
      }
      // If all sensors are on white surface, move backward
      else {
        motor1.run(BACKWARD);
        motor2.run(BACKWARD);
      }
    }
    Подозреваю что библиотека не работает с данным Motor Shield https://amperka.ru/product/arduino-motor-shield