Написал программу для робота который должен объезжать препятствия с двумя ик дальнометрами, но после загрузки робот вообще ничего не делает, просто стоит: #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 { } } } } } Подскажите в чём ошибка?
Раскидайте по программе отладочные сообщения, чтобы они приходили в Serial monitor. Т.е. в каждую подпрограмму и там где есть ветвления в if добавить что-то типа serial.print("Собираюсь ехать прямо")
До меня ооочень долго доходит, но должно получится вот так? #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 { } } } } }
Да, примерно так. И можно перед датчиками махать и смотеть куда он ехать собирается Но выше правильно сказали - не вызаваются функции движения
Получается робот лишенный намерения двигаться. Он может и знает как обойти препятствие, но никуда не пойдет.
Я немного изменил программу, но всёравно не работает. В чём проблема? #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 { } } } } }
Код (Text): targetState = STATE_FORWARD; //едем прямо Это не "едем прямо", а "записываем в переменную targetState значение STATE_FORWARD" и больше ничего. Чтобы поехать прямо, нужно вызвать функцию runForward().
Странная программа. Похоже откуда то недо-выдрана. Уже ж давно сказали, что не статусы проставлять нужно а вызывать процедуры движения. Еще непонятно, как схема собрана. Может тоже что то недоподключено.
С роботом всё в порядке, проверял на других программах. А программа взята отсюда http://wiki.amperka.ru/робототехника:робот-с-датчиками-линии-на-arduino и просто переделана
Так я же про это и говорю. Недо-выдрана. А куда делся кусок: Код (Text): switch (targetState) { case STATE_FORWARD: runForward(); break; case STATE_RIGHT: steerRight(); break; case STATE_LEFT: steerLeft(); break; ... ?? !!
Надо внимательнее вчитываться в ответы и в то как переделываете программу. Два раза подсказали что не вызываются функции, которые приводят колеса в движение. При переделке программы потерян вот этот кусок: Код (Text): switch (targetState) { case STATE_FORWARD: runForward(); break; case STATE_RIGHT: steerRight(); break; case STATE_LEFT: steerLeft(); break; } Именно он смотрит какое состояние у робота сейчас и на основе него вызывает едущие/рулящие функции.