Проблема с программой

Тема в разделе "Arduino & Shields", создана пользователем Артём Маракшин, 14 апр 2015.

  1. Написал программу для робота который должен объезжать препятствия с двумя ик дальнометрами, но после загрузки робот вообще ничего не делает, просто стоит:


    #define SPEED_LEFT 3
    #define SPEED_RIGHT 5
    #define DIR_LEFT 4
    #define DIR_RIGHT 6
    #define LEFT_SENSOR A0 //левый сенсор
    #define RIGHT_SENSOR A1 //правый сенсор
    #define THRESH 200

    int ledPin = 13;

    #define SPEED 255


    #define STATE_FORWARD 0
    #define STATE_RIGHT 1
    #define STATE_LEFT 2
    #define STATE_BACK 3

    int state = STATE_FORWARD;

    void runForward()
    {
    state = STATE_FORWARD; //едем прямо

    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);

    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
    }

    void steerRight()
    {
    state = STATE_RIGHT; //поворачиваем направо

    analogWrite(SPEED_RIGHT, SPEED);
    analogWrite(SPEED_LEFT, SPEED);

    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, LOW);

    digitalWrite(13, HIGH);
    }

    void steerLeft()
    {
    state = STATE_LEFT; //поворачиваем налево

    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);

    digitalWrite(DIR_LEFT, LOW);
    digitalWrite(DIR_RIGHT, HIGH);

    digitalWrite(13, HIGH);

    }
    void steerBack()
    {
    state = STATE_BACK; //едем назад
    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);

    digitalWrite(DIR_LEFT, LOW);
    digitalWrite(DIR_RIGHT, LOW);

    digitalWrite(13, HIGH);
    }


    void setup()
    {
    pinMode(SPEED_LEFT, OUTPUT);
    pinMode(SPEED_RIGHT, OUTPUT);
    pinMode(DIR_LEFT, OUTPUT);
    pinMode(DIR_RIGHT, OUTPUT);
    pinMode(LEFT_SENSOR, INPUT);
    pinMode(RIGHT_SENSOR, INPUT);
    pinMode(13, OUTPUT);
    runForward();
    }

    void loop()
    {
    bool motion_Left = analogRead(LEFT_SENSOR) < THRESH; //перед левым сенсором препятствие
    bool motion_Right = analogRead(RIGHT_SENSOR) < THRESH; //перед правым сенсором препятствие
    int targetState;
    if (!motion_Left && !motion_Right) //если препятствий нет, то
    {
    targetState = STATE_FORWARD; //едем прямо
    }
    else
    {
    if (analogRead(LEFT_SENSOR) < THRESH && analogRead(RIGHT_SENSOR) > THRESH) //если препятствие перед левым, то
    {
    targetState = STATE_RIGHT; //поворачиваем направо
    }
    else
    {
    if (analogRead(LEFT_SENSOR) > THRESH && analogRead(RIGHT_SENSOR) < THRESH) //если препятствие перед правым, то
    {
    targetState = STATE_LEFT; //поворачиваем налево
    }
    else
    {
    if (analogRead(LEFT_SENSOR) < THRESH && analogRead(RIGHT_SENSOR) < THRESH) //если препятствие перед обеими, то
    {
    targetState = STATE_BACK; //едем назад
    }
    else
    {
    }
    }
    }
    }
    }

    Подскажите в чём ошибка?
     
  2. ANV

    ANV Гуру

    Раскидайте по программе отладочные сообщения, чтобы они приходили в Serial monitor.
    Т.е. в каждую подпрограмму и там где есть ветвления в if добавить что-то типа serial.print("Собираюсь ехать прямо")
     
  3. iglooshtosser

    iglooshtosser Гик

    Не вижу в коде loop() ни одного вызова фунции движения или записи в порт.
     
  4. До меня ооочень долго доходит, но должно получится вот так?

    #define SPEED_LEFT 3
    #define SPEED_RIGHT 5
    #define DIR_LEFT 4
    #define DIR_RIGHT 6
    #define LEFT_SENSOR A0 //левый сенсор
    #define RIGHT_SENSOR A1 //правый сенсор
    #define THRESH 200

    int ledPin = 13;

    #define SPEED 255


    #define STATE_FORWARD 0
    #define STATE_RIGHT 1
    #define STATE_LEFT 2
    #define STATE_BACK 3

    int state = STATE_FORWARD;

    void runForward()
    {
    state = STATE_FORWARD; //едем прямо

    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);

    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
    }

    void steerRight()
    {
    state = STATE_RIGHT; //поворачиваем направо

    analogWrite(SPEED_RIGHT, SPEED);
    analogWrite(SPEED_LEFT, SPEED);

    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, LOW);

    digitalWrite(13, HIGH);
    }

    void steerLeft()
    {
    state = STATE_LEFT; //поворачиваем налево

    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);

    digitalWrite(DIR_LEFT, LOW);
    digitalWrite(DIR_RIGHT, HIGH);

    digitalWrite(13, HIGH);

    }
    void steerBack()
    {
    state = STATE_BACK; //едем назад
    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);

    digitalWrite(DIR_LEFT, LOW);
    digitalWrite(DIR_RIGHT, LOW);

    digitalWrite(13, HIGH);
    }


    void setup()
    {
    pinMode(SPEED_LEFT, OUTPUT);
    pinMode(SPEED_RIGHT, OUTPUT);
    pinMode(DIR_LEFT, OUTPUT);
    pinMode(DIR_RIGHT, OUTPUT);
    pinMode(LEFT_SENSOR, INPUT);
    pinMode(RIGHT_SENSOR, INPUT);
    pinMode(13, OUTPUT);
    runForward();
    }

    void loop()
    {
    bool motion_Left = analogRead(LEFT_SENSOR) < THRESH; //перед левым сенсором препятствие
    bool motion_Right = analogRead(RIGHT_SENSOR) < THRESH; //перед правым сенсором препятствие
    int targetState;
    if (!motion_Left && !motion_Right) //если препятствий нет, то
    {
    targetState = STATE_FORWARD; //едем прямо
    Serial.print(STATE_FORWARD);
    }
    else
    {
    if (analogRead(LEFT_SENSOR) < THRESH && analogRead(RIGHT_SENSOR) > THRESH) //если препятствие перед левым, то
    {
    targetState = STATE_RIGHT; //поворачиваем направо
    Serial.print(STATE_LEFT);
    }
    else
    {
    if (analogRead(LEFT_SENSOR) > THRESH && analogRead(RIGHT_SENSOR) < THRESH) //если препятствие перед правым, то
    {
    targetState = STATE_LEFT; //поворачиваем налево
    Serial.print(STATE_LEFT);
    }
    else
    {
    if (analogRead(LEFT_SENSOR) < THRESH && analogRead(RIGHT_SENSOR) < THRESH) //если препятствие перед обеими, то
    {
    targetState = STATE_BACK; //едем назад
    Serial.print(STATE_BACK);
    }
    else
    {
    }
    }
    }
    }
    }
     
  5. ANV

    ANV Гуру

    Да, примерно так. И можно перед датчиками махать и смотеть куда он ехать собирается

    Но выше правильно сказали - не вызаваются функции движения
     
  6. iglooshtosser

    iglooshtosser Гик

    Получается робот лишенный намерения двигаться. :) Он может и знает как обойти препятствие, но никуда не пойдет.
     

  7. Я немного изменил программу, но всёравно не работает. В чём проблема?

    #define DIR_LEFT_F 6
    #define DIR_RIGHT_F 4
    #define DIR_LEFT_B 5
    #define DIR_RIGHT_B 3
    #define LEFT_SENSOR A0
    #define RIGHT_SENSOR A1
    #define THRESH 110

    #define STATE_FORWARD 0
    #define STATE_RIGHT 1
    #define STATE_LEFT 2
    #define STATE_BACK 3

    int state = STATE_FORWARD;
    int targetState;

    void setup()
    {
    pinMode(DIR_LEFT_F, OUTPUT);
    pinMode(DIR_RIGHT_F, OUTPUT);
    pinMode(DIR_LEFT_B, OUTPUT);
    pinMode(DIR_RIGHT_B, OUTPUT);
    pinMode(LEFT_SENSOR, INPUT);
    pinMode(RIGHT_SENSOR, INPUT);
    Serial.begin(9600);
    }

    void runForward()
    {
    int state = STATE_FORWARD; //едем прямо

    digitalWrite(DIR_LEFT_F, HIGH);
    digitalWrite(DIR_RIGHT_F, HIGH);

    digitalWrite(DIR_LEFT_B, LOW);
    digitalWrite(DIR_RIGHT_B, LOW);
    }

    void steerRight()
    {
    int state = STATE_RIGHT; //поворачиваем направо

    digitalWrite(DIR_LEFT_F, HIGH);
    digitalWrite(DIR_RIGHT_F, LOW);

    digitalWrite(DIR_LEFT_B, LOW);
    digitalWrite(DIR_RIGHT_B, HIGH);
    }

    void steerLeft()
    {
    int state = STATE_LEFT; //поворачиваем налево

    digitalWrite(DIR_LEFT_F, LOW);
    digitalWrite(DIR_RIGHT_F, HIGH);

    digitalWrite(DIR_LEFT_B, HIGH);
    digitalWrite(DIR_RIGHT_B, LOW);
    }
    void steerBack()
    {
    int state = STATE_BACK; //едем назад
    digitalWrite(DIR_LEFT_F, LOW);
    digitalWrite(DIR_RIGHT_F, LOW);

    digitalWrite(DIR_LEFT_B, HIGH);
    digitalWrite(DIR_RIGHT_B, HIGH);
    }

    void loop()
    {
    bool motion_Left = analogRead(LEFT_SENSOR) < THRESH; //перед левым сенсором препятствие
    bool motion_Right = analogRead(RIGHT_SENSOR) < THRESH; //перед правым сенсором препятствие
    int targetState;
    if (!motion_Left && !motion_Right) //если препятствий нет, то
    {
    targetState = STATE_FORWARD; //едем прямо
    Serial.print(STATE_FORWARD);
    }
    else
    {
    if (analogRead(LEFT_SENSOR) < THRESH && analogRead(RIGHT_SENSOR) > THRESH) //если препятствие перед левым, то
    {
    targetState = STATE_RIGHT; //поворачиваем направо
    Serial.print(STATE_RIGHT);
    }
    else
    {
    if (analogRead(LEFT_SENSOR) > THRESH && analogRead(RIGHT_SENSOR) < THRESH) //если препятствие перед правым, то
    {
    targetState = STATE_LEFT; //поворачиваем налево
    Serial.print(STATE_LEFT);
    }
    else
    {
    if (analogRead(LEFT_SENSOR) < THRESH && analogRead(RIGHT_SENSOR) < THRESH) //если препятствие перед обеими, то
    {
    targetState = STATE_BACK; //едем назад
    Serial.print(STATE_BACK);
    }
    else
    {
    }
    }
    }
    }
    }
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Код (Text):
    targetState = STATE_FORWARD; //едем прямо
    Это не "едем прямо", а "записываем в переменную targetState значение STATE_FORWARD" и больше ничего.
    Чтобы поехать прямо, нужно вызвать функцию runForward().
     
  9. Vad33

    Vad33 Капитан-оригинал

    Странная программа. Похоже откуда то недо-выдрана.
    Уже ж давно сказали, что не статусы проставлять нужно а вызывать процедуры движения.
    Еще непонятно, как схема собрана. Может тоже что то недоподключено.
     
  10. С роботом всё в порядке, проверял на других программах. А программа взята отсюда http://wiki.amperka.ru/робототехника:робот-с-датчиками-линии-на-arduino и просто переделана
     
  11. Vad33

    Vad33 Капитан-оригинал

    Так я же про это и говорю. Недо-выдрана.
    А куда делся кусок:

    Код (Text):
    switch (targetState) {
            case STATE_FORWARD:
                runForward();
                break;
            case STATE_RIGHT:
                steerRight();
                break;
            case STATE_LEFT:
                steerLeft();
                break;
    ...
    ?? !!
     
    Последнее редактирование: 15 май 2015
  12. ANV

    ANV Гуру

    Надо внимательнее вчитываться в ответы и в то как переделываете программу.
    Два раза подсказали что не вызываются функции, которые приводят колеса в движение.
    При переделке программы потерян вот этот кусок:
    Код (Text):
        switch (targetState) {
            case STATE_FORWARD:
                runForward();
                break;
            case STATE_RIGHT:
                steerRight();
                break;
            case STATE_LEFT:
                steerLeft();
                break;
        }
    Именно он смотрит какое состояние у робота сейчас и на основе него вызывает едущие/рулящие функции.