Непрерывное управление скоростью сервопривода с помощью контроллера Arduino Uno и сервощита

Это очень простое устройство, 2 сервопривода непрерывного действия FS5113R, непрерывно вращается в одном направлении. Вот оригинальный контент устройства, а именно сервощит похоже на русский, а вот библиотека, Я добавил в Arduino IDE, также у меня есть оригинальный код, который запускает это устройство, приведенный ниже.

Я пытаюсь выяснить, что я могу сделать со скоростью, чтобы она работала медленнее, я пробовал изменить задержку (15); число до 1000, но оно движется с той же скоростью. Я пробовал увеличивать переменную в цикле while (z < 2) и передавать ее с интервалом, но скорость такая же:

#include <Wire.h>
#include <Multiservo.h>   

#define SERVO_COUNT 2     

Multiservo servo[SERVO_COUNT];

int pos1 = 0;  
int pos2 = 0;

int z = 1;

void setup(void)  
{
  Wire.begin();

  for (int i = 0; i < SERVO_COUNT; ++i)  
  {
    servo[i].attach(i);  
    servo[i].write(0);  
  }
}

void loop(void)  
{ 
    while (z < 2){
        pos1 + 1;
        pos2 + 1;
        servo[1].write(pos1);   
        servo[2].write(pos2);           
        delay(15);  
    }
}

Любой совет, руководство или пример будут полезны

, 👍0

Обсуждение

Непонятно, чего именно вы пытаетесь добиться. Вы никогда не меняете «pos1» или «pos2», поэтому скорость не меняется. Попробуйте сделать pos1++; вместо pos1 + 1, @chrisl

@chrisl Привет, такое же поведение с pos1++, но я пытаюсь вращать двигатель медленнее, пример выше показывает существующий код, который запускает сервоприводы с заданной скоростью, @user61616

Если вы используете приведенный выше код с сервоприводом с непрерывным вращением, сервопривод сначала будет вращаться в одном направлении, замедляясь (длительность 1,3 секунды), затем изменяя направление вращения (когда значение проходит через 90), затем ускоряясь на 1,3 секунды, а затем сохраняя эту скорость до тех пор, пока pos1 и pos2 не переполнятся. Это займет 136 часов. Это то, что вы видите? Поскольку сервопривод не может изменить направление очень быстро, это движение не будет очень сильным, может быть, просто долгое подергивание в начале программы., @chrisl

@chrisl Я вижу движение обоих двигателей всегда в одном направлении, не меняя направление по мере необходимости, но слишком быстро, приведенный выше код используется по умолчанию для устройства. Моя цель сделать движение в одну сторону, но с меньшей скоростью, так же как и делается, за исключением описанного вами поведения, хотя на 136ч не проверял, @user61616


1 ответ


2

Скорость вашего сервопривода контролируется шириной импульса прямоугольного сигнала. Согласно техпаспорту сервопривода двигатель останавливается при импульсе около 1500 мкс (+- 5 мкс).

От 1500 до 900 мкс двигатель вращается по часовой стрелке. И это становится быстрее с уменьшением ширины импульса.

От 1500 до 2100 мкс двигатель вращается против часовой стрелки. И это становится быстрее с увеличением ширины импульса.

Далее мы должны проверить, могут ли ваш щит и библиотека обрабатывать эти значения и какое значение вы должны передать функции servo[i].write(?). Я могу читать кириллицу, но я недостаточно хорошо понимаю русский, чтобы читать ф. руководство. Поэтому мне нужно посмотреть код на GitHub (https://github.com/amperka/Multiservo/blob /master/library/Мультисерво ).

И вуаля:

Multiservo::attach(int pin, int minPulse, int maxPulse)

Вы можете определить минимальную и максимальную ширину импульса, это здорово. Давайте сделаем это:

#include <Multiservo.h>   
#define SERVO_COUNT 2     

Multiservo servo[SERVO_COUNT];
// скорость равна 0 (полная скорость по часовой стрелке)
int speed = 0;  

void setup(void)  
{
  for (int i = 0; i < SERVO_COUNT; ++i)  
  {
    servo[i].attach( i, 900, 2100);  
    // 900 - 2100 отображается от 0 до 180
    // так что 90 - это середина, где мотор останавливается
    // 180 двигатель работает максимально быстро против часовой стрелки
    // 0 двигатель работает с максимально возможной скоростью по часовой стрелке
    servo[i].write( speed );   
  }
}

void loop(void)  
{ 
   // Здесь я останавливаю программу, если двигатель останавливается.
   // Если вы используете меньшее значение, чем 89, вы можете остановить программу
   // на соответствующей скорости. Если вы используете более высокое значение вместо 89
   // мотор начинает вращаться против часовой стрелки.
   // Не используйте значение больше 179 или меньше 1.
   if ( ++speed > 89 ) speed = 90; 

   servo[1].write( speed );   
   servo[2].write( speed );           

   delay(25);  
}

Ах, потому что у меня нет аппаратного обеспечения, поэтому я не могу протестировать программу. Используйте его в качестве примера.

,

Здравствуйте, спасибо за ваш ответ. Как я уже сказал, я хочу изменить код для этого устройства, чтобы оба сервопривода всегда двигались в одном направлении с меньшей скоростью, но сейчас я не могу проверить ваш пример, потому что кажется, что этот щит поврежден, кроме того, я не я тоже не понимаю русский язык, так что я должен очень скоро сменить это устройство и проверить загрузку с вашим кодом, затем я прокомментирую результат, чтобы отметить ваш ответ, @user61616