Заставьте 3 сервопривода двигаться подобно волне

У меня возникли некоторые проблемы с программированием 3 сервоприводов для движения подобно волне. Так, например, все мои сервоприводы начинаются с 90 градусов. Я хочу, чтобы мой первый сервопривод двигался, и когда он достигнет 135 градусов, я хочу, чтобы мой второй сервопривод двигался вместе с первым, затем, когда он достигнет 135 градусов, я хочу, чтобы мой третий сервопривод двигался вместе с первым и вторым. Затем идите в обратном направлении. Это имеет смысл?

Вот что у меня есть на данный момент.

#include <Servo.h>

//Создаем объект сервопривода для управления сервоприводом
Servo left;
Servo middle;
Servo right;

//Переменные для хранения положения сервопривода
int post = 180;
int post2 = 90;
int back = 90;
int forward = 135;

int firstTriggerAngle = 135;
int secondTriggerAngle = 180;

//Задерживать
int mid = 4;

void setup() 
{
  Serial.begin(9600);

  //Прикрепляет сервоприводы к контактам Arduino к объекту сервопривода
  left.attach(4);
  middle.attach(3);
  right.attach(2);

  //Исходное положение
  left.write(back);
  middle.write(back);
  right.write(back);
}

void loop()
{
  for (int i=back; i>=forward; i+=1)
  {
    left.write(i);
    if( i > firstTriggerAngle)
    {
      post = map(i, 90, 135, 135, 90);
      middle.write(post);
    }
    if(post > secondTriggerAngle)
    {
      post2 = map(post, 90, 135, 135, 90);  // зависит от используемых вами углов
      right.write(post2);
    }
    delay(mid);
 }
}

, 👍0


1 ответ


1

Самый простой способ — определить, на сколько градусов вы хотите переместиться в целом.

В вашем случае это 180 шагов (от 90 до 180, что составляет 90 шагов, и от 180 до 90, что составляет еще 90 шагов).

Затем используйте цикл for со счетчиком шагов на 180 и составьте 3 простые формулы для сопоставления 180 возможных градусов с желаемым положением сервопривода.

Таким образом, первая формула будет выглядеть так (шаг 0..90 -> перемещение от 90 до 180, шаг 90..180-> перемещение от 180 до 0).

int calcServo1(int step)
{
    if (step < 90)
    {
        return 90 + step;
    }
    else
    {
        return 270 - step; // 180 - (step - 90);
    }
}

Для второго это должно быть:

  • шаг 0..45: первая итерация: 90, в противном случае 135..90
  • шаг 45..135: 90..180
  • шаг 135..180: 180..135

Код будет примерно таким:

int calcServoPos2(int iteration, int step)
{ 
    if (step < 45)
    {
        if (iteration == 0)
        {
            return 90;
        }
        else
        {
            return 135 - step;
        }
   else if (step < 135)
   {
         return step + 45;
   }
   else
   {
       return step - 45; //  step - 180 + 135
   }   
}

Сервопривод 3 я оставлю на ваше усмотрение.

Из вашего основного цикла вы вызываете позиции:

 int iteration = 0;

 while (loop)
 {
      for (int step = 0; step < 180; step++)
      {
         int servo1pos = CalcServo1(iteration, step);
         servo1.write(servo1pos);

         int servo2pos = CalcServo2(iteration, step);
         servo2.write(servo2pos);

         int servo3pos = CalcServo2(iteration, step);
         servo3.write(servo3pos);

         delay(mid);
     }
     iteration++;
  }
,