Как создать прерывание или возвращаемое значение для серводвигателя? - PullRequest
0 голосов
/ 08 октября 2018

Это был разочаровывающий день обучения у Arduino Tuts.

Я работаю над настройкой серводвигателя.Я выяснил, почему я не мог заставить его получать данные, и теперь я получил его, считывая через последовательный порт и поворачиваясь к соответствующим степеням.Но теперь кажется, что каждый раз, когда он проходит через него, он пытается сбросить его значение до 0 градусов.Я не назначил переменную равной 0, и цикл while должен действовать как прерывание, пока он ожидает ввода пользователя.Поэтому я не понимаю, почему это происходит.

Я также пытался вернуть значение pos, чтобы не изменять / сбрасывать значения во время каждого цикла, но продолжал получать ошибки компиляции.Мне сказали, что pos возвращает void.А потом я получил еще один, когда пытался объявить int pos как метод внутри цикла и вложил остальную часть кода в метод int.

Также интересное примечание: когда вы запускаете окно последовательного портав IDE он будет вращать двигатель на небольшую величину, несмотря на то, что вход не подается.После того, как заданный вход введен, он пойдет до тех степеней, а затем будет сброшен, как описано ранее.

Код:

#include <Servo.h> //Including the Servo code library

int servoPin = 6;
int servoDelay = 25;
int pos;

Servo myPointer; // Create a Servo object called myPointer

void setup() {
  Serial.begin(9600);
  //pinMode (servoPin, OUTPUT);

  myPointer.attach(servoPin);

  Serial.println("Hello");

}

void loop() {    


    Serial.println ("Where would you like the servo to point?");
    while (Serial.available()==0){
    }

    pos = Serial.parseInt();

    Serial.println (pos);

    myPointer.write(pos);
}

Сервопривод работает от источника питания 5 В на Arduinoи получает инструкции ОК.Он не сбрасывает позицию при запуске через void setup (), поэтому это должен быть цикл, вызывающий это.Я просто не знаю, почему или как это исправить.

1 Ответ

0 голосов
/ 08 октября 2018

Вы должны убедиться, что все сообщение получено, прежде чем приступить к его синтаксическому анализу.Либо установите межсимвольный интервал с Serial.setTimeout() (по умолчанию 1 с) на большее значение перед использованием:

Serial.setTimeout(2000);    
while (Serial.available() == 0) {}
duration = Serial.parseInt();

Или добавьте задержку между Serial.available() и Serial.parseInt(), если вышеупомянутое не решает всеваши проблемы.

while (Serial.available() == 0) {}
delay(4000);
duration = Serial.parseInt();

Serial.available() выпадет после первого полученного символа.Итак:

  • Установка межсимвольного таймаута продлила бы время перед анализом, ожидая после каждого нового символа, чтобы увидеть, будут ли получены какие-либо дополнительные символы.
  • Задержка перед синтаксическим анализом обеспечит получение всего сообщения перед попыткой его синтаксического анализа.

Могут также присутствовать дополнительные символы, такие как \n или \r, вызывающиеразобрать но без толковых данных.Serial.parseInt() возвращает 0, если не удалось преобразовать число.Итак:

  • Выполните проверку диапазона на 1 - 360 градусов, чтобы поймать их, не теряя большого диапазона поворота.
  • Проверьте, добавляет ли ваш терминал \n или \r.
  • После разбора очистите приемные буферы с помощью Serial.flush(), чтобы избавиться от любых оставшихся \n или \r символов.
...