Сервы и ServoTimer2
- Войдите на сайт для отправки комментариев
Пнд, 19/09/2016 - 20:52
Доброго времени суток! Вопрос- как при использовании библиотеки ServoTimer2 задать серве конкретный угол?
Прежде чем задать вопрос тут я прочел http://arduino.ru/forum/obshchii/prezhde-chem-sprosit-pro-servomashinku-servo-posmotri-tut. Ответа не нашел.
На одном из источников я нашел:
"Положение выходного вала сервомотора определяется длиной импульса. Серва может получать импульсы каждые 20 миллисекунд. Если импульс high длится 1 миллисекунду, угол поворота сервы будет равен нулю. Если 1.5 миллисекунды, тогда серва выйдет в свое центральное положение, а если 2 миллисекунды - выйдет в положение, которое соответствует 180 градусам"
Основываясь на этом написал такой скеч
void Rotate(){ val_1 = analogRead(joy1); delay(10); //recomanen posar-ho val_2 = analogRead(joy2); pos_1 = map (val_1, 0, 1024 , 1000, 2000); pos_2 = map (val_2, 0, 1024 , 1000, 2000); myservo_1.write(pos_1); myservo_2.write(pos_2);
Серва вращается, но не от 0 до 180 а примерно с 30 до 130 градусов.
Есть еще вот такой алгоритм:
void Rotate(){ val_1 = analogRead(joy1); delay(10); //recomanen posar-ho val_2 = analogRead(joy2); pos_1 = 3000 - (500 + val_1 * 1.8); pos_2 = 500 + val_2 * 1.8; myservo_1.write(pos_1); myservo_2.write(pos_2);
Я его не понимаю, но серва ходит в пределах от 10 до 170 градусов.
Как правильно дать команду. как расчитать и задать угол поворота сервы с библиотекой ServoTimer2 ?
Есть в среде Ардуино маленький секрет. Образцы->Servo->Knob. А там есть код
Но ардуина не может выдавать аналоговый сигнал на выход. Она выдает PWM сигнал, который и заменяет его.
qwone - спасибо Вам за проявлый интерес к вопросу, но, либо я не понял Ваш ответ, либо вы вопрос не поняли.
С библиотекой Servo.h я уже знаком и выставить там угол поворота сервы таки да, не проблема.
Вопрос по ServoTimer2.h , тут не так, как в Вашем примере
pos_1 = map (val_1, 0, 1024 , 700, 2200); Не в градусах а в милисекундах?
При такой формуле Серва начинает двигаться в диапазоне значений pos_1 от 800 до 2100. но опять не поворачивается ни к 0, ни к 180.
Попробовал еще и такой код
все равно серва на 0 и 180 не становится.
Может библиотека левая? Руки и мозх понятно, но уже должно было получиться.
У серв есть разброс параметров.
Нередко - весьма значительный.
Вам нужно всего навсего подобрать экспериментально, какие числа нужно подавать на вход конкретной сервы, чтобы она повернулась на нужный угол.
Рассчитать это в принципе невозможно.
И для другой сервы числа придется подбирать другие.
Но ведь с библиотекой Servo.h все работает на этих же сервах !
я подключал 2 разные
Если ориентироваться на это http://github.com/nabontra/ServoTimer2/blob/master/examples/threeservos/threeservos.ino
не совсем понятно - если с одной библиотекой работает зачем лезть в другую ?
В другую библиотеку пришлось залезть из-за того, что стандартная Servo конфликтует с VirtualWire , так как используют один и тот же таймер. А мне нужны обе.
По существу вопроса, к сожалению подсказки нет :(
Надо в теме писать "Помогите..."
Вопрос по форуму: возможно ли изменить стартовое сообщение? что бы там накапливать все возникшие вопросы и, возможно, финальный правильный ответ, чтобы не листать весь топик, в котором ответ может быть где-то посередине.
Доброго времени суток! Вопрос- как при использовании библиотеки ServoTimer2 задать серве конкретный угол?
Серва вращается, но не от 0 до 180 а примерно с 30 до 130 градусов.
Как правильно дать команду. как расчитать и задать угол поворота сервы с библиотекой ServoTimer2 ?
в библе написано
#define MIN_PULSE_WIDTH 750 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2250 // the longest pulse sent to a servo
а вы влепили от 1000 до 2000
Да. Указанный интервал я определил экспериментально. Но и с ним в начальной и конечную позиции снова не приходит. Буду пробовать с другими сервами. Т.е. если интервал значений от 750 до 2250, то 90 градусов это 1500. А 45 это 1125. Во! Сам понял :)
а от 1000 до 2000 быыло в примере библиотеки
ПАМАГИТЕ ! :)
Серва все равно движется в диапазоне от 30 до 150 градусов. На 0 и 180 не доходит.
Поставил обратно Servo.h и все кул. от 0 до 175 отлично ходит (хотя вручную бе питания можно довернуть где-то до 200)
Таки дело в калеченной библиотеке :(
для 995 сервы встречал такие парметры: 0-500мкс, а 180-2500 мкс, так примерно и поворачивается 1 градус где-то 10-11мкс
вот такие параметры
#define MIN_PULSE_WIDTH 750 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2250 // the longest pulse sent to a servo
как раз и отсекают около 25 град туда сюда
для проверки заливаешь скетч, взят где-то на просторах инета, и смотришь, как оно работает без вясяких библиотек.
Подбираешь свои времена, если требуется
Ну да.
Когда подружить библиотеки не удается, самый простой способ - отказаться от них совсем.
Спасибо !
Буду пробовать! А то я даже не сообразил в принципе поискать как управлять сервой без библиотеки .
Не, я вчера хотел попробовать, но сегодня открыл файл библиотеки, мало что понял и решил что это должно быть дюже сложно, управлять напрямую.
Спасибо за ценный совет. Библиотеки наверное удобно, но тут лучше ручками попробую.
pulseWidth = (myAngle * 10) + 500;
// конвертируем угол в микросекунды
поставил +400 и все сошлось. почти полные от 0 до 180
Все равно проблема осталась, экран в такой конфигурации библиотек не работает.
Значит, нужно избавиться от следующей библиотеки. :)
Ага, удалить библиотеку. Да и саму ардуинку в ящик и на балкон.
Я в этих таймерах (и не только) дуб-дубом. Вот на другой странице ЕвгенийП разъясняет, но там не для чайников, наверное.
Тоже про адафрутную библиотеку и RadioHead.
Таймер нашел, поменял в RH_ASK.cpp, но вот что там пишут про Header file - не понял.
// Should be moved to header file
#define RH_ASK_ARDUINO_USE_TIMER2
Экранчик запустился, но фигню показывает. С другой стороны, зачем на пульте с односторнней связью экран? только для отладки. Выбросил.
Спаисбо, ВН, Ваша рекомендация работает. Серва безупречна!