Как исправить последовательную связь?
Я пытаюсь использовать последовательную связь для открытия и закрытия захвата Blue Robotics Newton. Захват работает с обычными командами, но когда я пытаюсь использовать последовательную связь для управления им, он работает очень медленно, и мои команды не соответствуют действию, которое я хотел бы. Например, я напишу "о" в последовательном мониторе и захват не открывается.
Кто-нибудь знает, что не так?
#include "Servo.h"
#define GRIPPER_PWM_PIN 10 // Выходной контакт PWM захвата
#define OPEN_TIME 5.0 // Время открытия захвата (секунды)
#define CLOSE_TIME 5.0 // Время закрытия захвата (секунды)
#define OPEN_PWM_US 1100 // Выход ШИМ захвата (мкс)
#define CLOSE_PWM_US 1900 // Выход ШИМ закрытия захвата (мкс)
int incomingByte =0; // для входящих последовательных данных
Servo gripper;
void setup() {
// Прикрепляем захват к нужному штифту
gripper.attach(GRIPPER_PWM_PIN);
Serial.begin(9600); // открывает последовательный порт, устанавливает скорость передачи данных 9600 бит/с
}
void loop() {
if (Serial.available() > 0){
incomingByte = Serial.read();
if (incomingByte == 'o')
{
// Открываем захват
gripper.writeMicroseconds(1100);
// Разрешить открытие захвата (микросекунды)
delay(OPEN_TIME*1000);
}
if (incomingByte == 'c')
{
// Закрыть захват
gripper.writeMicroseconds(1900);
// Пусть захват закроется на некоторое время (микросекунды)
delay(CLOSE_TIME*1000);
}
}
}
@sw14928, 👍1
Обсуждение1 ответ
Лучший ответ:
В вашем коде есть большая 5-секундная задержка сразу после обеих последовательных команд. Вам не нужна задержка там; это ничего не делает. Но это делает ваш код невосприимчивым. Поэтому вы можете просто удалить его.
Думаю, вы хотели сделать что-то на время и случайно оставили это там. Но вообще вы не должны использовать большой delay()
в любом коде. Как вы видели, это делает ваш код невосприимчивым, так как Arduino в это время ничего не делает. Вместо этого посмотрите на пример BlinkWithoutDelay
, который поставляется с Arduino IDE (это действительно важный принцип для изучения). Он использует функцию millis()
(или альтернативно функцию micros()
), чтобы проверить, не пора ли что-то сделать. Если да, он выполнит это, если нет, он быстро завершит работу и даст возможность выполнить остальную часть кода. Очень похоже на то, как если бы вы пекли пиццу: вы начинаете выпекать, а затем регулярно проверяете часы, не пора ли вынести пиццу. В промежутках вы можете делать другие вещи, например, реагировать на сообщения на своем телефоне. Тот же принцип, только в коде.
Отличный совет! Большое спасибо, @sw14928
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
возможно, удалите 5-секундные задержки или не отправляйте команды в это время., @Juraj
Почему у вас вообще есть эта 5-секундная задержка? Я не вижу в этом никакого смысла., @chrisl
Хорошо, это сработало - как я могу принять это как ответ!? Большое спасибо, @sw14928