Мой сервопривод не движется, только при попытке написать 180 градусов - PullRequest
0 голосов
/ 02 июля 2019

Мой сервопривод начинает «меняться» (это то, что код говорит мне в любом случае), когда он установлен на 180 градусов.

Я пробовал искать по сайту так же, как и по Google, но, похоже, это что-то, что очень конкретно связано с записью в Servo продвинутого неповторяющегося способа.

Код, который изменяет сервопривод:

#include <SoftwareSerial.h>
#include <Servo.h>

const int rxPin = 12;
const int txPin = 13;
SoftwareSerial bluetooth (rxPin, txPin);

Servo myServo;
boolean canMove = true;

int rotation = 0;
int currentRotation = 0;

void setup() {
  Serial.begin(9600); // Begins Serial communication
  bluetooth.begin(9600);
  myServo.attach(11); // Sets a servo on pin 11  
}

void loop() {
  // put your main code here, to run repeatedly:

  // Checks if Serial has something to read
  if (bluetooth.available() > 0) {
    rotation = bluetooth.read(); // Reads it and sets it to an integer
  }

  currentRotation = myServo.read();

  if (currentRotation != rotation) {
    Serial.println("Current Rotation:");
    Serial.println(currentRotation);
    Serial.println("Set to:");
    Serial.println(rotation);
    for (int i = currentRotation; i < rotation; i++) {
      Serial.println("Writing to servo");
      myServo.write(i);
    }  
  }

}

Существует программа обработки, которая отправляет данные в Arduino, но я прекрасно вижу, что цифры поступают в последовательный монитор Arduino (они варьируются от 0 до 180)

После этого в Serial Monitor отображается только:

Current Rotation:
93
Set to:
0
Current Rotation:
93
Set to:
0
Current Rotation:
93
Set to:
0
Current Rotation:
93
Set to:
0
Current Rotation:
93
Set to:
0

снова и снова. Сервопривод просто дергается взад и вперед. Единственный раз, когда он изменяется (номер, который нужно установить, поступает из программы обработки), это когда номер, для которого он установлен, равен 180. Затем он перемещается еще больше назад и вперед и говорит:

Current Rotation:
179
Set to:
180
Writing to servo
Current Rotation:
179
Set to:
180
Writing to servo

снова и снова. Что происходит и как я могу это исправить? Ура, и спасибо за помощь!

1 Ответ

1 голос
/ 02 июля 2019

Есть некоторые проблемы с вашим кодом:

  1. Вам не нужно читать текущее значение сервопривода, просто сохраните последнее заданное значение.

  2. Перемещение сервопривода шаг за шагом не является хорошим вариантом, так как оно может иметь некоторую ошибку при перемещении.Вам нужно найти динамическую задержку, основанную на пороге движения.Например, предположим, что максимальное время задержки для полного перемещения сервопривода от 0 до 180 составляет 2 секунды, поэтому, если вам нужно переместить сервопривод на 90 градусов, вам потребуется 1 секунда задержки.

  3. Вам просто нужно переместить сервопривод при получении новых данных, поэтому устанавливать сервопривод при получении новых данных.

Не забудьте установить max_delay в зависимости от вашего сервопривода.

#include <SoftwareSerial.h>
#include <Servo.h>

const int rxPin = 12;
const int txPin = 13;
SoftwareSerial bluetooth(rxPin, txPin);

Servo myServo;
boolean canMove = true;

int rotation = 0;
int currentRotation = 0;

// how much time takes servo to move
int move_delay = 0;
// maximum time for changing servo state from lowest to highest value
const int max_delay = 2;

void setup()
{
    Serial.begin(9600); // Begins Serial communication
    bluetooth.begin(9600);
    myServo.attach(11); // Sets a servo on pin 11
}

void loop()
{
    // put your main code here, to run repeatedly:

    // Checks if Serial has something to read
    if (bluetooth.available() > 0)
    {
        rotation = bluetooth.read(); // Reads it and sets it to an integer

        Serial.print("New value: ");
        Serial.println(rotation);
        Serial.print("Current Rotation: ");
        Serial.println(rotation);
        if (currentRotation != rotation)
        {
            Serial.println("Setting new value");
            // find a proper delay
            move_delay = (max_delay / 180) * (abs(rotation - currentRotation)) * 1000;
            myServo.write(rotation);
            delay(move_delay);
            currentRotation = rotation;
        }
    }
}
...