Заставьте 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);
}
}
@Lexi Robinson, 👍0
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++;
}
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Сообщение об ошибке: "exit status 1 expected initializer before 'void'."
- Arduino Mega TIMER1 интервал в одну секунду
- Serial — отправляет данные в Arduino, пока Arduino отправляет данные
- Почему этот код не воспроизводит преобразованный заголовочный файл wav2c через Arduino на мой динамик?
- Отображение нескольких температурных выходов с термисторами
- подключение светодиода к DHT и кодовой комбинации