Adafruit Motor Shield v1 Нужна помощь. Запуск одновременно трех двигателей постоянного тока?

Мой проект заключается в том, что я строю анимированного (поющего, танцующего, поворачивающего голову и машущего руками) снеговика.

У меня есть 3 двигателя постоянного тока для отдельных функций, которые должны запускаться с помощью программирования карты Arduino Adafruit V1. Двигатель № 1 будет управлять поворотом головы, двигатель № 2 будет управлять движением руки, а двигатель № 3 будет управлять танцем верхней части туловища. Движения будут происходить как по отдельности, так и одновременно время от времени на протяжении всего временного цикла (2 минуты 45 секунд).

Мне нужно выяснить, как запрограммировать мою карту, чтобы синхронизировать моторы с движениями и таймфреймами. Я любитель в этом и никогда ничего не кодировал до этого проекта.

Ниже показан фрагмент того, как должен выглядеть мой код:

Когда цикл начинается, голова снеговика (мотор 1) будет медленно поворачиваться вправо в течение двух секунд, затем поворачиваться влево в течение двух секунд (по мере того, как он возвращается в центр), делает паузу в течение 3 секунд, а затем поворачивается влево в течение 2 секунды, затем вправо на две секунды (снова возвращаясь в центр). (Это 11-секундная отметка 2-минутного 45-секундного временного цикла; и голова остается неподвижной до тех пор, пока на 21-секундной отметке она не повернется вправо на две секунды, а затем сразу же на две секунды влево. (Теперь на 25-секундной отметке.) Затем он делает паузу до 33-секундной отметки, после чего снова поворачивается (*последующее время поворота головы).

Одновременно с началом цикла рука (двигатель 2) начинает махать. Этот мотор будет медленно вращаться вправо в течение 2 секунд, сделает паузу в 9 секунд и снова повернется влево на 2 секунды (чтобы вернуться в исходное положение). Затем двигатель 2 будет непрерывно поворачивать вправо в течение 2 секунд, а затем влево в течение 2 секунд (для непрерывного взмаха руки), пока не достигнет 33-секундной отметки (из 2-минутного и 45-секундного временного цикла). Затем этот двигатель/рука приостанавливается до тех пор, пока снова не повернется (*последующее время взмаха рукой).

На 11-секундной отметке (2-минутного 45-секундного временного цикла) двигатель 3 включится непрерывно вправо на 22 секунды (двигая туловище снеговика в танцевальном движении). Затем он останавливается на этой 33-секундной отметке, пока не включится снова (*последующий двигатель 3/танцевание).

  • На 33-й секунде первая песня заканчивается, а затем начинается новая, и при этом три двигателя возобновляют свои функции в определенное время (аналогично приведенной выше синхронизации), которые необходимо записать/запрограммировать, как указано выше.

, 👍-2

Обсуждение

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](https://chat.stackexchange.com/rooms/107899/discussion-on-question-by-tommy-adafruit-motor-shield-v1-need-help-running-3- Округ Колумбия)., @VE7JRO


1 ответ


0

Вам нужно переосмыслить то, что вы пытаетесь сделать. Как сказал Маженко, забудьте об опоздании. Наметьте временную шкалу, начиная с начала вашей программы. Поймите, чего вы хотите, чтобы произошло с течением времени. Скажем, например, вы хотите, чтобы ваш снеговик разыгрывал последовательность действий в течение 20 секунд, а затем повторял эту последовательность. скажем, в течение первых 2 секунд вы хотите, чтобы двигатель 1 работал, затем в течение следующих 5 секунд вы хотите, чтобы двигатель 2 и двигатель 1 работали, затем в течение еще 3 секунд вы хотите, чтобы двигатель 1 остановился, а двигатели 2 и 3 работали (теперь вы на 10 секунде). Наконец, вы хотите, чтобы все 3 двигателя работали в течение 10 секунд. Затем вы хотите, чтобы цикл повторился.

Запишите время в millis(). Это твой ноль. Выясните количество времени, прошедшее с начала, и когда вы доберетесь до нужных точек на временной шкале, активируйте различные двигательные состояния. Если вы хотите, чтобы действия вашего снеговика повторялись, определите время повторения и напишите свой цикл так, чтобы он повторялся каждый раз, когда проходит полное время повторения.

Базовая оболочка может выглядеть примерно так

unsigned long start;
unsigned long cycleTime = 20,000; //Скажем, время полного цикла для вашего снеговика составляет 20 секунд

void setup(); {
  start = millis();
  //больше кода установки
}


void loop() {
  //Прошедшее будет содержать количество миллисекунд с момента запуска программы
  unsigned long elapsed = millis() - start;

  //timeInCycle будет считать от 0 до 20 000 (20 секунд), а затем повторить
  //"%" - это оператор по модулю или остатку
  unsigned long timeInCycle = elapsed %  cycleTime; 

  //используем timeInCycle, чтобы решить, когда запускать различные действия
  //ваш снеговик для каждого цикла
}


Я не собираюсь кодировать вашу последовательность для вас. Это зависит от вас. Ваш код невозможно прочитать без отступов, поэтому я не буду пытаться его расшифровать.

,

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](https://chat.stackexchange.com/rooms/107900/discussion-on-answer-by-duncan-c-adafruit-motor-shield-v1-need-help-running- 3-сн)., @VE7JRO