Перейти к содержанию

ildark

Members
  • Постов

    3
  • Зарегистрирован

  • Посещение

Достижения ildark

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме
  • 10 лет  на форуме

Последние значки

0

Репутация

  1. Имеется радиоуправляемая машинка переделанная под управление Ардуино. Алгоритм обычный, при обнаружении препятствия ультразвуковым дальномером, машина двигается назад с поворотом и потом движение продолжается снова вперед до следующего препятствия. Подскажите как можно организовать что то подобное плавному останову двигателя при обнаружении препятствия и плавному пуску в последующем. Решил попробовать самый простой вариант: движение вперед, потом понижение шим двигателя до значения 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); } Но по моему что то делаю не так.
×
×
  • Создать...