Сервопривод продолжает сбрасывать положение, когда нет разницы в полученном значении?

Итак, я работаю над кодом, который в основном получает координаты x и y и сохраняет их в переменной. Всякий раз, когда принимается координата, она проходит через условный оператор для сохранения их в переменной x и y, а затем передает ее в функцию сервомотора. Затем эта функция серводвигателя перемещается в соответствии с тем, что задано. Это работает хорошо, нопо мере того, как значения обновляются с течением времени, положение сервопривода всегда сбрасывается, а затем возвращается на прежнее место, снова и снова. Даже когда координаты остаются неизменными, он просто сбрасывается, а затем возвращается в свое положение снова и снова.

Как мне сделать так, чтобы он не только не сбрасывался, а затем возвращался туда, где он был, но вместо этого перемещал его туда, куда он должен был идти, но и останавливал его сброс в любом случае, когда позиция остается неизменной?

Приведенный ниже код - это то, что я пытался сделать, чтобы в основном облегчить проблему "сброса положения при неизменных координатах". К сожалению, это не сработало.

bool constant = false;
// Остальная часть промежуточного кода, не имеющая отношения к проблеме

// Соответствующие коды ниже
void statusCodes() {
  if (received_str == "1") {
    Serial.println("Raspberry Pi - Connection Established");
  } else if (received_str == "2") {
    Serial.println("Raspberry Pi - Data Received");
  } else if (received_str == "100") {
    Serial.println("Raspberry Pi - Status OK");
  } else if (received_str[0] == '(' ) {
    Serial.println("Coordinates Received, Ready to Delete Target!");
    if (constant == true) { // проверяет, является ли эта константа логическим значением true
      movement = false;
    } else {
      movement == true;
    }
    int r = sscanf(received_str.c_str(), "(%d, %d)", &x, &y);
    Serial.print("X: ");
    Serial.println(x);
    Serial.print("Y: ");
    Serial.println(y);
  }
}

void onDetectTarget() {
  x = map(x, 0, 1023, 0, 180);
  y = map(y, 0, 1023, 0, 180);
  if (movement == true) {
    for (pos = 0; pos <= x; pos += 1) {
      myservo.write(pos);
      delay(15);
    }
    movement = false; // исправлено
    pos = 0; // исправлено
   
  }
}

void compareOldNew() {
  x_old = x;
  y_old = y;
  delay(900);
  if (x == x_old && y == y_old) {
    constant = true;
  } else {
    constant = false;
  }
}

, 👍1


1 ответ


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

3

В onDetectTarget() вы используете этот цикл for

for (pos = 0; pos <= x; pos += 1) {
  myservo.write(pos);
  delay(15);
}

Таким образом, каждый раз, когда движение выполняется верно, сервопривод снова запускается от нуля до целевого положения. Таким образом, он не будет "сбрасываться", но всегда будет приближаться к новому целевому значению с нулевой позиции. У вас есть два варианта исправить это:

  • Если вы просто хотите достичь целевой позиции, просто замените цикл for одним myservo.write(x).

  • Если вы хотите, чтобы сервопривод перемещался медленнее в новое целевое положение, вам необходимо сохранить последнее установленное положение сервопривода в переменной, а затем запустить цикл for от этого значения до нового целевого значения. Итак, объявите соответствующую переменную (например, в глобальной области видимости):

      int current_pos = 0;
    

    Затем запустите цикл for из этой позиции в новую целевую позицию:

      for(pos = current_pos; pos <= x; pos += 1)
    

    И после цикла for вы можете установить current_pos в новое положение сервопривода:

      current_pos = x;
    

И я предполагаю, что это происходит и тогда, когда значения не меняются, потому что вы никогда не меняете постоянную переменную. Вы не выполнили никакой проверки, являются ли значения постоянными. (По крайней мере, вы не показали такой код и утверждаете, что остальная часть кода не имеет значения)

,

Спасибо за ваш ответ, чувак, это было действительно полезно. Я думал, что мне нужно использовать цикл for, чтобы постоянно записывать значение, но с вашим объяснением все стало для меня более понятным. Что касается определения той же позиции, я позже исследовал и обнаружил, что вы могли бы в принципе использовать статические переменные для хранения старых значений, сравнивать их и иметь флаг, чтобы увидеть, были ли они равны или нет., @Black Prime