Как исправить последовательную связь?

Я пытаюсь использовать последовательную связь для открытия и закрытия захвата 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);
   }
 }
}

, 👍1

Обсуждение

возможно, удалите 5-секундные задержки или не отправляйте команды в это время., @Juraj

Почему у вас вообще есть эта 5-секундная задержка? Я не вижу в этом никакого смысла., @chrisl

Хорошо, это сработало - как я могу принять это как ответ!? Большое спасибо, @sw14928


1 ответ


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

0

В вашем коде есть большая 5-секундная задержка сразу после обеих последовательных команд. Вам не нужна задержка там; это ничего не делает. Но это делает ваш код невосприимчивым. Поэтому вы можете просто удалить его.

Думаю, вы хотели сделать что-то на время и случайно оставили это там. Но вообще вы не должны использовать большой delay() в любом коде. Как вы видели, это делает ваш код невосприимчивым, так как Arduino в это время ничего не делает. Вместо этого посмотрите на пример BlinkWithoutDelay, который поставляется с Arduino IDE (это действительно важный принцип для изучения). Он использует функцию millis() (или альтернативно функцию micros()), чтобы проверить, не пора ли что-то сделать. Если да, он выполнит это, если нет, он быстро завершит работу и даст возможность выполнить остальную часть кода. Очень похоже на то, как если бы вы пекли пиццу: вы начинаете выпекать, а затем регулярно проверяете часы, не пора ли вынести пиццу. В промежутках вы можете делать другие вещи, например, реагировать на сообщения на своем телефоне. Тот же принцип, только в коде.

,

Отличный совет! Большое спасибо, @sw14928