Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».

Я работаю над проектом, в котором мне хотелось бы, чтобы значения, полученные от Xbox Kinect, активировали компоненты моего Arduino. В настоящее время я пытаюсь заставить серводвигатель включаться и вращаться, когда значение равно «1», и оставаться в одном положении (в настоящее время записано как 120 градусов), когда значение равно «0». Тем не менее, я могу нормально включить двигатель и начать вращение, но когда я отпускаю мышь (и это показывает, что значение «0» отправляется в обработку и на последовательный монитор), двигатель просто продолжает вращаться. Это мой текущий код:

char val; // Data received from the serial port
#include <Servo.h>
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  Serial.begin(9600);
}

void loop() {
  if (Serial.available())
  { // If data is available to read,
    val = Serial.read(); // read it and store it in val
  }
  if (val == '1') { // If 1 was received
    Serial.print ("1");// turn the LED on
    for (pos = 0; pos <= 120; pos += 1) { // goes from 0 degrees to 180 degrees
      // in steps of 1 degree
      myservo.write(pos);              // tell servo to go to position in variable 'pos'
      delay(15);                       // waits 15ms for the servo to reach the position
    }
    for (pos = 120; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
      myservo.write(pos);              // tell servo to go to position in variable 'pos'
      delay(15);                       // waits 15ms for the servo to reach the position
    }
  }
  if (val == '0') {
    Serial.print ("0");
    pos = 120;
    myservo.write(pos);
  }
}

, 👍1

Обсуждение

Логика вашего скетча заключается в перемещении от 0 до 180 и обратно при получении символа «1». Движение завершается до проверки следующего символа. Ваш эскиз не позволяет остановиться в текущей позиции во время движения., @Mikael Patel


2 ответа


1

Вы уверены, что мышь не отправляет непрерывный поток единиц? Если бы это было так, то из-за буферизации все единицы будут обслужены до остановки сервопривода. Например, последовательность 11111, за которой следует 0, запустит движение 5 раз, прежде чем оно остановится и напечатает 0.

,

-1

довольно просто:

switch (serial_received()) {
  case -1: break; //-1=ничего не получено
  case  0: break; //0 получено
  case  1: servo_pos = ...; servo_move2(servo_pos); break; //обновляем положение сервопривода
  case  .... //другие команды
  default: ...
}

вы можете заполнить функции тем, что подходит для вашей среды.

,