Пповорот сервопривода на 90 градусов

#include <Servo.h>

Servo myservo;  // создаем сервообъект для управления сервоприводом
// на большинстве плат можно создать двенадцать сервообъектов

int pos = 0;    // переменная для хранения положения сервопривода

void setup() {
  myservo.attach(9);  // присоединяем сервопривод к контакту 9 к объекту сервопривода
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // переход от 0 градусов к 180 градусам
    // с шагом в 1 градус
    myservo.write(pos);              // сообщаем сервоприводу перейти в позицию в переменной 'pos'
    delay(15);                       // ждем 15 мс, пока сервопривод не достигнет позиции
  }
  for (pos = 180; pos >= 0; pos -= 1) { // переход от 180 градусов к 0 градусам
    myservo.write(pos);              // сообщаем сервоприводу перейти в позицию в переменной 'pos'
    delay(15);                       // ждем 15 мс, пока сервопривод не достигнет позиции
  }
}

Я нашел этот код, который заставляет сервопривод поворачиваться на 180 градусов и обратно, но когда я переключаю 180 градусов на 90, что мне и нужно, мой сервопривод этого не делает (я пробовал код в симуляторе Arduino).

Нужно ли мне изменить что-то еще в коде (например, время задержки), чтобы оно увеличивалось на 90 градусов вверх, а затем на 90 градусов вниз?

Вот ссылка на схему:

https://circuits.io/circuits/3597808-servo-90-grades

, 👍3

Обсуждение

«Когда я переключаю 180 градусов на 90 градусов, это то, что мне нужно, мой сервопривод этого не делает» - Так что * делает * он делает? ... (Я попробовал код в симуляторе Arduino) - Что происходит с *настоящим* Arduino и *настоящим* сервоприводом? Симуляторы - это всего лишь приближение. Они никогда не могут быть такими же хорошими, как настоящие., @Majenko

@Majenko Что он делает, так это поднимается на 180 градусов и начинает подметать между 180 и 90 градусами. На самом деле это действительно странно, потому что я вообще не развернул код на 180 градусов. Вы думаете, что симулятор Arduino не точен с сервоприводами?, @hehexd

Симулятор, похоже, хреновый. Получите настоящий сервопривод для вашего Arduino. Они очень дешевые., @Majenko

Либо так, либо вы неправильно интерпретируете выходной сигнал сервопривода, и то, что вы считаете 180 °, на самом деле 0 °., @Majenko

@Majenko Я попробую с настоящим сервоприводом, но странно то, что этот первый код, который я опубликовал, работает только на 180 градусов и обратно, для любого другого числа сервопривод поворачивается в диапазоне от 90 до 180 градусов. Симулятор BDW создан компанией Autodesk., @hehexd

Сними видео результата и потом выложи., @Dat Ha

@DatHa Я отредактировал вопрос., @hehexd


3 ответа


Лучший ответ:

2

Нет, вам не нужно изменять временную задержку, чтобы заставить ее вращаться на 90 градусов, задержка просто изменит скорость вращения сервопривода. Ошибка используемого вами симулятора, так как скетч с 180 замененным на 90 работает безупречно.

#include <Servo.h> 

Servo myservo;  // создаем сервообъект для управления сервоприводом
                // можно создать максимум восемь сервообъектов

int pos = 0;    // переменная для хранения положения сервопривода

void setup() 
{ 
  myservo.attach(9);  // присоединяем сервопривод к контакту 9 к объекту сервопривода
} 


void loop() 
{ 
  for(pos = 0; pos < 90; pos += 1)  // изменяется от 0 градусов до 180 градусов
  {                                  // с шагом в 1 градус
    myservo.write(pos);              // сообщаем сервоприводу перейти в позицию в переменной 'pos'
    delay(15);                       // ждем 15 мс, пока сервопривод не достигнет позиции
  } 
  for(pos = 90; pos>=1; pos-=1)     // переходит от 180 градусов к 0 градусам
  {                                
    myservo.write(pos);              // сообщаем сервоприводу перейти в позицию в переменной 'pos'
    delay(15);                       // ждем 15 мс, пока сервопривод не достигнет позиции
  } 
}

УБЕДИТЕСЬ, ЧТО ВЫ ЗАМЕНИЛИ ОБЕИ 180 НА 90.

,

Я так и сделал, и ничего.., @hehexd


2

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

,

Когда вы впервые нажимаете «кнопку воспроизведения», анимация сервопривода дико прыгает. Почему это происходит?, @VE7JRO


0

Эта строка кода правильно настроит таймеры ШИМ для вывода правильного сигнала для перемещения сервопривода на значение, установленное в «pos»

myservo.write(pos);

К скорости это не имеет никакого отношения. Сервопривод попытается достичь позиции как можно быстрее.

Задержка(15) в вашем коде — это время задержки между каждым "myservo.write(pos);"

Цикл for работает следующим образом:

myservo.write(0); // Перейти к 0 градусам
delay(15); // Подождите 15 мс
myservo.write(1); // Переходим на 1 градус
delay(15); // Подождите 15 мс
myservo.write(2); // Переходим на 2 градуса
delay(15); // Подождите 15 мс
myservo.write(3); // Переходим на 3 градуса
delay(15); // Подождите 15 мс

и т. д.

Время в секундах, необходимое для поворота, равно (диапазон_в_градусах x 15)/1000

например, 180 градусов x 15 мс/1000 = 2,7 секунды 90 градусов x 15 мс/1000 = 1,35 секунды

Увеличение задержки на 15 мс замедлит вращение сервопривода.

Кроме того, убедитесь, что вы изменили угол 180 градусов на 90 в ОБОИХ циклах for. Если вы измените значение на единицу, сервопривод будет медленно перемещаться от 0 до 90, затем прыгать до 180 и медленно возвращаться к 0 и повторять действия. (или наоборот, в зависимости от того, какой из них вы забыли изменить)

,