@Lexluter20

Как сделать какую-нибудь многозадачность на ардуино?

Здравствуйте, есть шаговый двигатель, который крутится, пока ультразвуковой датчик расстояния не определит что объект ближе чем на 35 см.

int wait_kolesa = 1;
    digitalWrite(direction, HIGH);
    digitalWrite(direction2, LOW);
    for(int i=0; i<8000; i++){
      digitalWrite(trigPin1, LOW); 
      delayMicroseconds(2); 
      digitalWrite(trigPin1, HIGH); 
      delayMicroseconds(10); 
      digitalWrite(trigPin1, LOW); 
      duration1 = pulseIn(echoPin1, HIGH); 
      cm1 = duration1 / 58;
      if(cm1 <= 35){
        delay(2000);                                                   
      }
      digitalWrite(step, LOW);
      digitalWrite(step2, LOW); // Подаем логическую 1 на вывод STEP драйвера, чтобы двигатель сделал шаг.
      delay(wait_kolesa);                 // Задержка времени
      digitalWrite(step, HIGH);
      digitalWrite(step2, HIGH);// Подаем логический 0 на вывод STEP драйвера, после этого драйвер будет ожидать новую 1, чтобы сделать еще 1 шаг.
      delay(wait_kolesa);
    }

(код вырван из контекста)

Из-за того, что в цикле, где шагает двигатель, происходит каждые 2 миллисекунды расчёт расстояния ультразвукового датчика это очень тормозит вращение.
Что можете подсказать?
  • Вопрос задан
  • 320 просмотров
Решения вопроса 1
Kyodza
@Kyodza
Инженер по лётным испытаниям лёгких самолетов
В своем устройстве я просто понаставил много Ардуинок Про Микро (3 шт). Они маленькие и дешевые (как Нано, только лучше), и по сути получился многоядерный процессор. Информация ходит только в одну сторону, от вспомогательных к основной (Арду Мега 2560), но можно и в обе стороны и между собой, так как все присоединены к IIC основного контроллера.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@dima20155
you don't choose c++. It chooses you
В Ардуино всего одно физическое ядро, поэтому вычислять в параллель у вас не выйдет. Единственное решение - переложить часть задач на переферию. Например, если значения из датчика отправляются на АЦП, то можно настроить прерывания и забирать данные когда удобно. Классический delay тоже лучше реализовать через таймер, ибо стандартный delay просто заставляет процессор ждать, вместо вычислений/других полезных действий
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Можно поменять логику. Включили мотор и постоянно меряете расстояние. Как домеряли до 35см - остановились.

Можно перед циклом один раз померять - решить, а надо ли вообще мотор включать. Внутри, чтоб электричество зря не жечь, можно даже между вычислениями расстояния сколько-то спать. Смотрите там из расстояния - если оно сильно больше 35 - спите подольше.
Ответ написан
nava2002
@nava2002
Инженер
Хорошо себя показал запуск нескольких потоков.
Но я это на Arduino Zero (SAMD21) применил. На Arduino UNO (Atmel 328) с потоками и многозадачностью сильно не разгонишься.
Есть и другие несколько подходов, но они (в моем случае) оказались не удобны.
Ответ написан
Комментировать
@Lexluter20 Автор вопроса
В итоге решения не нашёл, задержка в работе у ультразвукового датчика слишком большая...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы