Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «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);
}
}
2 ответа
Вы уверены, что мышь не отправляет непрерывный поток единиц? Если бы это было так, то из-за буферизации все единицы будут обслужены до остановки сервопривода. Например, последовательность 11111, за которой следует 0, запустит движение 5 раз, прежде чем оно остановится и напечатает 0.
довольно просто:
switch (serial_received()) {
case -1: break; //-1=ничего не получено
case 0: break; //0 получено
case 1: servo_pos = ...; servo_move2(servo_pos); break; //обновляем положение сервопривода
case .... //другие команды
default: ...
}
вы можете заполнить функции тем, что подходит для вашей среды.
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Метод перебора битов в байте, отправленном по последовательному каналу.
- Arduino Uno по-прежнему загружается и работает, но нет последовательной связи через USB
- О UART один передатчик несколько приемников
- Отправка строки с Arduino на ESP8266 работает на UNO, но не на Pro Mini
- Повреждение данных SoftwareSerial - поиск предложений
- Когда я включаю сервопривод, он вращается сам по себе, прежде чем перейти в нужное положение и начать скетч.
- Как программировать микрочипы напрямую через USB
Логика вашего скетча заключается в перемещении от 0 до 180 и обратно при получении символа «1». Движение завершается до проверки следующего символа. Ваш эскиз не позволяет остановиться в текущей позиции во время движения., @Mikael Patel