Делаю из сломанной машинки на радио управлении робота на ардуино уно. Робот должен ехать и реагируя на показания УЗ-датчика изменять траекторию направления.
Подключения мотора использую самодельный H-мост т.к. мотор-шилда нет, а ждать его нет желания. В общем в чем собственно суть:
Как правильно написать скетч, чтобы при условии того что перед дальномером нет ничего ехать вперед, а если расстояние меньше определенной величины (например 40 см) отъезжать поворачивать и снова двигаться.
При использовании оператора условия "if":
Код:
#include "Ultrasonic.h"
#define forward 11
#define backward 13
Ultrasonic ultrasonic(5,6);
void setup() {
pinMode(forward, OUTPUT);
pinMode(backward, OUTPUT);
Serial.begin(9600);
}
void loop() {
float dist_cm = ultrasonic.Ranging(CM);
if (dist_cm > 40)
{
digitalWrite(forward, HIGH); //Движение вперед
digitalWrite(backward, LOW);
Serial.println(dist_cm);
}
else
{
digitalWrite(forward, LOW); //Движение назад
digitalWrite(backward, HIGH);
}
В данном случае вывод расстояния в порт использую для отладки чтобы видеть как срабатывает датчик и соответственно мотор от его показаний...
В итоге этот код не вращает мотор... как я понимаю по причине того что я не указал продолжительность вращения...
В итоге я изменил часть кода:
Код:
float dist_cm = ultrasonic.Ranging(CM);
if (dist_cm > 40)
{
digitalWrite(forward, HIGH); //Движение вперед
digitalWrite(backward, LOW);
delay(1000);
Serial.println(dist_cm);
}
else
{
digitalWrite(forward, LOW); //Движение назад
digitalWrite(backward, HIGH);
delay(500);
}
Но вращение стало рваным, и дерганым... А хочется чтобы вперед машинка ехала без остановок пока не появится препятствие перед ней.
Затем я попробовал использовать цикл "while", но это не принесло мне никакой пользы потому как движок просто постоянно крутился и все в 1 сторону не реагируя на появление препятствий... вот пример моего кода с циклом "while":
Код:
void loop() {
float dist_cm = ultrasonic.Ranging(CM);
while(dist_cm > 40)
{
digitalWrite(forward, HIGH); //Движение вперед
digitalWrite(backward, LOW);
Serial.println(dist_cm);
float dist_cm = ultrasonic.Ranging(CM);
}
while (dist_cm < 40)
{
digitalWrite(forward, LOW); //Движение назад
digitalWrite(backward, HIGH);
Serial.println(dist_cm);
float dist_cm = ultrasonic.Ranging(CM);
}
Жду ваших советов есть ли возможность сделать вращение двигателю вперед без прерываний пока не появится препятствие в зоне видимости датчика?
В дальнейшем после того как разберусь с этой задачей планирую подключить серво для вращения передних колес и поворота.