Имеется радиоуправляемая машинка переделанная под управление Ардуино.
Алгоритм обычный, при обнаружении препятствия ультразвуковым дальномером, машина двигается назад с поворотом и потом движение продолжается снова вперед до следующего препятствия.
Подскажите как можно организовать что то подобное плавному останову двигателя при обнаружении препятствия и плавному пуску в последующем.
Решил попробовать самый простой вариант:
движение вперед, потом понижение шим двигателя до значения 10, потом пауза в допустим 50-100 мс, потом продолжаем алгоритм дальше с последующим движение назад и т.д.
Как то так:
analogWrite(REV_PIN,SPEED_1 ); analogWrite(REV_PIN, 10 ); delay(100);
Вот сам скетч:
const int Trig = 8;
const int Echo = 7;
#define FWD_PIN 9
#define REV_PIN 5
#define LEFT_PIN 3
#define RIGHT_PIN 10
#define SPEED_1 180
#define SPEED_2 260
#define SPEED_3 360
#define SPEED_4 250
void setup() {
Serial.begin(115200);
pinMode(FWD_PIN, OUTPUT);
pinMode(REV_PIN, OUTPUT);
pinMode(LEFT_PIN, OUTPUT);
pinMode(RIGHT_PIN, OUTPUT);
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
}
unsigned int time_us=0;
unsigned int distance_sm=0;
void loop() {
digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig, LOW); // Затем убираем
time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm=time_us/58; // Пересчитываем в сантиметры
Serial.println(distance_sm); // Выводим на порт
if (distance_sm >= 490 || distance_sm == 0) {
analogWrite(REV_PIN,0 );
analogWrite(FWD_PIN,SPEED_3 );
analogWrite(RIGHT_PIN,0);
analogWrite(LEFT_PIN,0);
};
if (distance_sm >= 300 && distance_sm < 490) {
analogWrite(REV_PIN,0 );
analogWrite(FWD_PIN,SPEED_2 );
analogWrite(RIGHT_PIN,0);
analogWrite(LEFT_PIN,0);
};
if (distance_sm >= 100 && distance_sm < 300) {
analogWrite(REV_PIN,0 );
analogWrite(FWD_PIN,SPEED_2 );
analogWrite(RIGHT_PIN,SPEED_4 );
analogWrite(LEFT_PIN,0);
};
if (distance_sm >= 50 && distance_sm < 100) {
analogWrite(REV_PIN,0 );
analogWrite(FWD_PIN,SPEED_1 );
analogWrite(RIGHT_PIN,SPEED_4 );
analogWrite(LEFT_PIN,0);
};
if (distance_sm >= 0 && distance_sm < 50) {
analogWrite(REV_PIN,SPEED_1 );
analogWrite(FWD_PIN,0 );
analogWrite(RIGHT_PIN,0);
analogWrite(LEFT_PIN,SPEED_4 );
};
delay(50);
}
Но по моему что то делаю не так.