Сервопривод продолжает сбрасывать положение, когда нет разницы в полученном значении?
Итак, я работаю над кодом, который в основном получает координаты 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;
}
}
@Black Prime, 👍1
1 ответ
Лучший ответ:
В 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;
И я предполагаю, что это происходит и тогда, когда значения не меняются, потому что вы никогда не меняете постоянную
переменную. Вы не выполнили никакой проверки, являются ли значения постоянными. (По крайней мере, вы не показали такой код и утверждаете, что остальная часть кода не имеет значения)
- Как управлять несколькими серводвигателями одновременно с помощью протопотока с помощью платы ШИМ I2C PCA9685?
- Один метод для 2 ультразвуковых датчиков не работает должным образом
- Pca9685 и WS2818B, 1 Nano
- Радиоуправляемая машинка, которая возвращается в центральное положение, если не нажата левая или правая кнопка
- Может ли arduino nano управлять двумя цепями
- Невозможно выйти из цикла while
- когда 3 компонента на Arduino nano работают вместе, один из них не работает
- avrdude ser_open() can't set com-state
Спасибо за ваш ответ, чувак, это было действительно полезно. Я думал, что мне нужно использовать цикл for, чтобы постоянно записывать значение, но с вашим объяснением все стало для меня более понятным. Что касается определения той же позиции, я позже исследовал и обнаружил, что вы могли бы в принципе использовать статические переменные для хранения старых значений, сравнивать их и иметь флаг, чтобы увидеть, были ли они равны или нет., @Black Prime