Include servo h что это
Перейти к содержимому

Include servo h что это

  • автор:

Библиотека Servo

Эта библиотека функций для Arduino контроллера предоставляет набор функций для управления сервоприводами. Стандартные сервоприводы позволяют поворачивать привод на опредленный угол от 0 до 180 градусов обычно. Некоторые сервоприводы позволяют совершать полные обороты на заданной скорости.

Библиотека Servo позволяет одновременно управлять 12-ю сервоприводами на большинстве плат Arduino и 48-ю на Arduino Mega. На контроллерах отличных от Mega использование библиотеки отключает возможность использовать выходы 9 и 10 врежиме ШИМ даже если привод не подключен к этим выводам. На плате Mega могут быть использованы до 12 сервоприводов без потери функционала ШИМ. При использовании Mega для управления от 12 до 23 сервоприводов нельзя будет использовать выходы 11 и 12 для ШИМ.

Подключение

В общем случае сервопривод подключается 3-мя проводами : питание, земля и сигнальный. Обычно питание — красный провод и может быть подключен к выводу +5V на плате Arduino. Черный провод земля подключается к GND выводу Arduino, сигнальный, обычно желты, провод подключается к цифровому выводу котроллера Arduino. Следует отметить, что мощные сервоприводы могут создавать большую нагрузку, в этом случает он должен быть запитан отдельно (не через выход +5V Arduino). Тоже самое верно для случая подключения сразу нескольких сервоприводов. Убедитесь, что привод и контроллер подключены к общей земле.

Функции:

Servo.attach()

Подключает Servo к указанному выходу, с которого осуществляется управление приводом. На ранних версиях Arduino — 0016 и более ранних, библиотека Servo поддерживала управления только через порты 9 и 10.

Синтаксис

servo.attach(pin)
servo.attach(pin, min, max)

Параметры
  • servo: переменная типа Servo
  • pin: номер выхода, к которому подключаем servo и с которого осуществляется управление приводом
  • min (опциональный): ширина импульса в микросекундах, соответствующий минимальному (угол 0 градусов) положению сервопривода. (по умолчанию 544)
  • max (optional): ширина импульса в микросекундах, соответствующий максимальному (угол 180 градусов) положению сервопривода.
Пример
#include Servo myservo; void setup() < myservo.attach(9); >void loop() <>

Servo.write()

Передает значения для управления приводом. Для стандартного сервопривода это угол поворота. Для привод постоянного вращения, функция задает скорость вращения (0 — для максимальной скорости вращения в одну сторону, 180 — для максимальной скорости в другую сторону и около 90 для неподвижного состояния).

Синтаксис
Параметры
  • servo: переменная типа Servo
  • angle: значение записываемое в servo, от 0 до 180
Пример
#include Servo myservo; void setup() < myservo.attach(9); myservo.write(90); // устанавливает сервопривод в среднее положение >void loop() <>

Servo.writeMicroseconds()

Передает значение для управления сревоприводом в микросекундах (uS), устанавливая угол поворота на это значение. Для стандартного привода значение 1000 максимальный поворот против часовой стрелки, 2000 максимальный поворот по часовой стрелке, 1500 посередине.

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

Приводы постоянного вращения реагируют на данную комманду подобно реакции на функцию write().

Синтаксис
Параметры
  • servo: переменная типа Servo
  • uS: значение в микросекундах (int)
Пример
#include Servo myservo; void setup() < myservo.attach(9); myservo.writeMicroseconds(1500); // устанавливает привод в среднее положение >void loop() <>

Servo.read()

Считывает значение текущего положения сервопривода (значение записанное последним вызовом функции write()).

Синтаксис
Параметры
  • servo: a variable of type Servo
Возвращаемое значение

Положение (угол) сервопривода от 0 до 180.

Servo.attached()

Проверяет если переменная Servo подключена к выходу.

Синтаксис
Параметры
  • servo: переменная типа Servo
Возвращаемое значение
  • true если подключена; false в противном случае.

Servo.detach()

Отсоединяет переменную Servo от указанного выхода. Если все Servo переменные отсоединены, то выходы 9 и 10 могут быть использованы в режиме ШИМ с помощью analogWrite().

Синтаксис
Параметры
  • servo: переменная типа Servo

Библиотека Servo

Библиотека для arduino

Библиотека используется для подключения 3-х выводных сервопривода с ШИМ управлением к плате ардуино. Сигнал управления должен быть 50 Гц (длительность периода 20 миллисекунд), а ширина положительного импульса в микросекундах задает угол поворота (по умолчанию в библиотеке определены: минимальная ширина — 544 мкс, максимальная — 2400 мкс, что соответствует углам 0° и 180°).

Библиотека Servo входит в состав Arduino IDE. На всякий случай архив с библиотекой по ссылке ниже:

Описание библиотеки Servo для Ардуино

#include

Подключение библиотеки. Добавляется в верхнюю часть скетча.

Servo myservo;

Создание экземпляра класса Servo для работы с сервоприводом.

uint8_t attach(int pin)

Задать номер управляющего контакта ардуины pin , подключенного к сервоприводу. После вызова данного метода на указанном контакте начинается генерация ШИМ сигнала частотой 50 Гц и шириной импульса по умолчанию 1500 микросекунд.

myservo.attach(9);
uint8_t attach(int pin, int min, int max)

Задать номер управляющего контакта ардуины pin , подключенного к сервоприводу, а также минимальное min и максимальное max значения ширины импульсов в микросекундах (что будет соответствовать углам 0. По умолчанию min = 544 мкс , max = 2400 мкс .

myservo.attach(9, 1000, 2000);
void detach()

Останавливает генерацию ШИМ сигнала.

myservo.detach();
void write(int value)

Устанавливает угол value сервопривода в градусах. Если значение выходит из установленного диапазона, то оно воспринимается как угол в микросекундах.

myservo.write(45); // Установить угол 45°
void writeMicroseconds(int value)

Устанавливает ширину импульса в микросекундах.

myservo.writeMicroseconds(1250); // Установить ширину импульса 1250 мкс
int read()

Возвращает последнюю записанную ширину импульса в виде угла от 0° до 180°.

int d = myservo.read();
int readMicroseconds()

Возвращает последнюю записанную ширину импульса в микросекундах.

int us = myservo.read();
bool attached()

Возвращает true если сервопривод подключен, иначе — false .

if(!myservo.attached()) Serial.println("Сервопривод не подключен");

Работаем с сервоприводами

Сервопривод — это механизм с электромотором с управлением. Вы можете вращать механический привод на заданный угол с заданной скоростью или усилием.

Наиболее популярны сервоприводы, которые удерживают заданный угол и сервоприводы, поддерживающие заданную скорость вращения.

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

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

Кроме электромотора, редуктора и потенциометра в сервоприводе имеется электронная начинка, которая отвечает за приём внешнего параметра, считывание значений с потенциометра, их сравнение и включение/выключение мотора. Она-то и отвечает за поддержание отрицательной обратной связи.

К сервоприводу тянется три провода. Два из них отвечают за питание мотора и землю, третий доставляет управляющий сигнал, который используется для выставления положения устройства.

Servo

Крутящий момент и скорость поворота

Крутящий момент — векторная физическая величина, равная произведению радиус-вектора, проведённого от оси вращения к точке приложения силы, на вектор этой силы. Характеризует вращательное действие силы на твёрдое тело. Эта характеристика показывает, насколько тяжёлый груз сервопривод способен удержать в покое на рычаге заданной длины. Если крутящий момент сервопривода равен 5 кг×см, то это значит, что сервопривод удержит на весу в горизонтальном положении рычаг длины 1 см, на свободный конец которого подвесили 5 кг. Или, что эквивалентно, рычаг длины 5 см, к которому подвесили 1 кг.

Скорость сервопривода измеряется интервалом времени, который требуется рычагу сервопривода, чтобы повернуться на 60°. Характеристика 0,1 с/60° означает, что сервопривод поворачивается на 60° за 0,1 с. Из неё несложно вычислить скорость в более привычной величине, оборотах в минуту, но так сложилось, что при описании сервоприводов чаще всего используют такую единицу.

Иногда приходится искать компромисс между этими двумя характеристиками, так как если мы хотим надёжный, выдерживающий большой вес сервопривод, то мы должны быть готовы, что эта могучая установка будет медленно поворачиваться. А если мы хотим очень быстрый привод, то его будет относительно легко вывести из положения равновесия. При использовании одного и того же мотора баланс определяет конфигурация шестерней в редукторе.

Виды сервоприводов

Сервоприводы бывают аналоговые и цифровые. Различаются они лишь внутренней управляющей электроникой. Вместо специальной микросхемы аналогового сервопривода у цифрового собрата можно заметить на плате микропроцессор, который принимает импульсы, анализирует их и управляет мотором. Таким образом, в физическом исполнении отличие лишь в способе обработки импульсов и управлении мотором.

Шестерни для сервоприводов бывают из разных материалов: пластиковые, карбоновые, металлические.

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

Карбоновые шестерни более долговечны, практически не изнашиваются, в несколько раз прочнее нейлоновых. Основной недостаток — дороговизна.

Металлические шестерни являются самыми тяжёлыми, однако они выдерживают максимальные нагрузки. Достаточно быстро изнашиваются, так что придётся менять шестерни практически каждый сезон. Шестерни из титана — фавориты среди металлических шестерней, причём как по техническим характеристикам, так и по цене. Они достаточно дорогие.

Существует три типа моторов сервоприводов: обычный мотор с сердечником, мотор без сердечника и бесколлекторный мотор.

Обычный мотор с сердечником (справа) обладает плотным железным ротором с проволочной обмоткой и магнитами вокруг него. Ротор имеет несколько секций, поэтому когда мотор вращается, ротор вызывает небольшие колебания мотора при прохождении секций мимо магнитов, а в результате получается сервопривод, который вибрирует и является менее точным, чем сервопривод с мотором без сердечника. Мотор с полым ротором (слева) обладает единым магнитным сердечником с обмоткой в форме цилиндра или колокола вокруг магнита. Конструкция без сердечника легче по весу и не имеет секций, что приводит к более быстрому отклику и ровной работе без вибраций. Такие моторы дороже, но они обеспечивают более высокий уровень контроля, вращающего момента и скорости по сравнения со стандартными.

Сервоприводы с бесколлекторным мотором появились сравнительно недавно. У бесколлекторных моторов нет щёток, а значит они не создают сопротивление вращению и не изнашиваются, скорость и момент выше при токопотреблении равном коллекторным моторам. Сервоприводы с бесколлекторным мотором — самые дорогие сервоприводы, однако при этом они обладают лучшими характеристиками по сравнению с сервоприводами с другими типами моторов.

Подключение к Arduino

Многие сервоприводы могут быть подключены к Arduino непосредственно. Для этого от них идёт шлейф из трёх проводов:

  • красный — питание; подключается к контакту 3.3/5V или напрямую к источнику питания
  • коричневый или чёрный — земля
  • жёлтый или белый — сигнал; подключается к цифровому выходу Arduino

Servo

Обычный хобби-сервопривод во время работы потребляет более 100 мА. При этом Arduino способно выдавать до 500 мА. Поэтому, если вам в проекте необходимо использовать мощный сервопривод, есть смысл задуматься о выделении его в контур с дополнительным питанием.

На большинстве плат Arduino библиотека Servo поддерживает управление не более 12 сервоприводами, на Arduino Mega — 48. При этом есть небольшой побочный эффект использования этой библиотеки: если вы работаете не с Arduino Mega, то становится невозможным использовать функцию analogWrite() на 9 и 10 контактах независимо от того, подключены сервоприводы к этим контактам или нет. На Arduino Mega можно подключить до 12 сервоприводов без нарушения функционирования ШИМ/PWM, при использовании большего количества сервоприводов мы не сможем использовать analogWrite() на 11 и 12 контактах.

Библиотеки для управления сервоприводами (Servo) и для работы с приёмниками/ передатчиками на 433 МГц VirtualWire используют одно и то же прерывание. Это означает, что их нельзя использовать в одном проекте одновременно. Существует альтернативная библиотека для управления сервомоторами — Servo2.

Сервоприводы обычно имеют ограниченный угол вращения 180 градусов, их так и называют «сервопривод 180°». Но существуют сервоприводы с неограниченным углом поворота оси. Это сервоприводы постоянного вращения или «сервоприводы 360°».

Иногда при подключении серводвигателя не отрабатывают заданные команды или отрабатывают некорректно. Причина в том, что сервомоторы требуют достаточно большую мощность для питания, особенно в начале движения ротора. Эти резкие скачки потребляемой мощности могут сильно «просаживать» напряжение на Arduino. Может произойти даже перезагрузка платы. Если подобное происходит, вам надо добавить конденсатор (470 мкФ или больше) между рельсами GND и 5V на вашей макетке. Конденсатор выполняет роль своеобразного резервуара для электрического тока. Когда серводвигатель начинает работать, он получает остатки заряда с конденсатора и от источника питания Arduino одновременно. Длинная нога конденсатора — это позитивный контакт, она подключается к 5V. Отрицательный контакт часто маркируется символом ‘-‘.

Управляем через импульсы

Для начала попробуем управлять вручную без библиотек. Считываем показания из Serial Monitor — нужно ввести число от 0 до 9. Эти значения равномерно распределим на 180 градусов и получим 20 градусов на каждую единицу показаний.

 int servoPin = 9; // сигнальный провод от серво на порт 9 int val; void setup() < pinMode(servoPin, OUTPUT); Serial.begin(9600); Serial.println("Servo is ready"); >void loop() < // convert number 0 to 9 to corresponding 0-180 degree angle val = Serial.read(); if (val >= '0' && val > > // define a servo pulse function void servoPulse(int pin, int angle) < // convert angle to 500-2480 pulse width int pulseWidth = (angle * 11) + 500; digitalWrite(pin, HIGH); // set the level of servo pin as high delayMicroseconds(pulseWidth); // delay microsecond of pulse width digitalWrite(pin, LOW); // set the level of servo pin as low delay(20 - pulseWidth / 1000); >

Библиотека Servo

Можно генерировать управляющие импульсы самостоятельно, но это настолько распространённая задача, что для её упрощения существует стандартная библиотека Servo.

Сервопривод постоянного вращения можно управлять с помощью библиотек Servo или Servo2. Отличие заключается в том, что функция Servo.write(angle) задаёт не угол, а скорость вращения привода.

Библиотека Servo позволяет осуществлять программное управление сервоприводами. Управление осуществляется следующими функциями:

  • attach() — присоединяет объект к конкретному выводу платы. Возможны два варианта синтаксиса для этой функции: servo.attach(pin) и servo.attach(pin, min, max). При этом pin — номер пина, к которому присоединяют сервопривод, min и max — длины импульсов в микросекундах, отвечающих за углы поворота 0° и 180°. По умолчанию выставляются равными 544 мкс и 2400 мкс соответственно. Возвращаемого значения нет.
  • write() — отдаёт команду сервоприводу принять некоторое значение параметра. Синтаксис: servo.write(angle), где angle — угол, на который должен повернуться сервопривод
  • writeMicroseconds() — отдаёт команду послать на сервопривод имульс определённой длины, является низкоуровневым аналогом предыдущей команды. Синтаксис следующий: servo.writeMicroseconds(uS), где uS — длина импульса в микросекундах. Возвращаемого значения нет.
  • read() — читает текущее значение угла, в котором находится сервопривод. Синтаксис: servo.read(), возвращается целое значение от 0 до 180
  • attached() — проверка, была ли присоединён объект к конкретному пину. Синтаксис следующий: servo.attached(), возвращается логическая истина, если объект была присоединён к какому-либо пину, или ложь в обратном случае
  • detach() — производит действие, обратное действию attach(), то есть отсоединяет объект от пина, к которому был приписан. Синтаксис: servo.detach()

В библиотеке Servo для Arduino по умолчанию выставлены следующие значения длин импульса: 544 мкс — для 0° и 2400 мкс — для 180°.

Пример подключения двух сервоприводов.

 #include // создаём объекты для управления сервоприводами Servo myservo1; Servo myservo2; void setup() < // подключаем сервоприводы к выводам 11 и 12 myservo1.attach(11); myservo2.attach(12); >void loop() < // устанавливаем сервоприводы в серединное положение myservo1.write(90); myservo2.write(90); delay(500); // устанавливаем сервоприводы в крайнее левое положение myservo1.write(0); myservo2.write(0); delay(500); // устанавливаем сервоприводы в крайнее правое положение myservo1.write(180); myservo2.write(180); delay(500); >

Библиотека Servo не совместима с библиотекой VirtualWire для работы с приёмником и передатчиком на 433 МГц, так как они используют одно и то же прерывание. Это означает, что их нельзя использовать в одном проекте одновременно. Существует альтернативная библиотека для управления сервомоторами — Servo2. Все методы библиотеки Servo2 совпадают с методами Servo.

При работе с сервоприводами на 360 градусов функции работают по другому.

Функция Arduino Сервопривод 180° Сервопривод 360°
Servo.write(0) Крайне левое положение Полный ход в одном направлении
Servo.write(90) Среднее положение Остановка сервопривода
Servo.write(180) Крайне правое положение Полный ход в обратном направлении

Sweep

Скетч File | Examples | Servo | Sweep постоянно поворачивает насадку на 180 градусов и возвращает её обратно. В примере используется встроенная библиотека Servo.

Общая схема — красный провод идёт к питанию 5V, чёрный или коричневый идёт к GND, а жёлтый или белый к выводу платы (в нашем примере вывод 9).

Sweep

 #include Servo myservo; // создадим объект сервопривода int pos = 0; // начальная позиция void setup() < myservo.attach(9); // сервопривод на выводе 9 >void loop() < for (pos = 0; pos for (pos = 180; pos >= 0; pos -= 1) < // от 180 до 0 градусов myservo.write(pos); // просим повернуться на позицию значения переменной 'pos' delay(15); // ждём 15ms для достижения позиции >> 

Knob

Скетч File | Examples | Servo | Knob управляет сервоприводом при помощи потенциометра. В примере используется встроенная библиотека Servo.

Общая схема: у сервопривода — красный провод идёт к питанию 5V, чёрный или коричневый идёт к GND, а жёлтый или белый к выводу платы (в нашем примере вывод 9). У потенциометра средняя ножка соединяется с аналоговым выходом A0, остальные к питанию и земле.

Knob

 #include Servo myservo; // создадим объект сервопривода int potpin = 0; // аналоговый выход A0 для потенциометра int val; // значение, получаемое от аналогового выхода void setup() < myservo.attach(9); // сервопривод на выводе 9 >void loop() < val = analogRead(potpin); // считываем данные с потенциометра (от 0 до 1023) val = map(val, 0, 1023, 0, 180); // Преобразуем в интервал от 0 до 180 myservo.write(val); // устанавливаем позицию сервопривода delay(15); // небольшое ожидание, чтобы сервопривод успел выполнить команду >

Случайные повороты

Будем поворачивать серводвигатель на случайную величину. Практического смысла немного, но для демонстрации подойдёт.

 #include Servo servo; // создадим объект сервопривода long randomNumber; void setup() < servo.attach(9); randomSeed( analogRead(A0) ); >void loop()

Программирование Arduino — библиотека Servo

Как мы помним – сервомашинка – это мотор-редуктор, с обратной связью, благодаря которой можно повернуть выходной вал на строго определённый угол.
Стандартные рулевые машинки, вертятся от 0 до 180 градусов (также есть сервы постоянного вращения – т.н. Continuous Rotation Servo, чуть позже покажем, как обычную серву можно переделать до такого состояния).

Примечание:
В Arduino IDE 0017 библиотека Servo поддерживает до 12 серв (до 48 на Mega), а в IDE 0016 и ранее работает только на 9 и 10 пинах!

!Обратите внимание:
На платах, отличных от Mega, использование библиотеки отключает возможность использования analogWrite() (PWM) на пинах 9 и 10 (вне зависимости подключены к этим пинам сервы или нет). На платах Mega, до 12 серв могут использоваться без влияния на функциональность PWM, но использование от 12 до 23 сервомашинок отключит PWM на пинах 11 и 12.

Подключение
Схема включения сервомашики очень простая — у неё есть три провода:

— земля (коричневый/черный),
— питание +5 вольт (красный),
— сигнальный (оранжевый/желтый/белый).

Управляющий сигнал можно подавать напрямую с ноги МК, а вот силовое питание (особенно если задействовано более одной-двух серв) нужно подавать от внешнего источника питания (т.е. не от +5В Arduino). В этом случае – нужно не забыть соединить землю Arduino/CraftDuino с минусом внешнего источника питания.

Рассмотрим функции, которые предоставляет библиотека.

uint8_t attach(int pin);
uint8_t attach(int pin, int min, int max);

Описание:
Указываем пин к которому подключён управляющий провод сервы.

Примечание:
Версии Arduino IDE 0016 и младше позволяют подключение только к 9 и 10 пинам.

servo.attach(pin); servo.attach(pin, min, max);

Параметры:
(servo – объект класса Servo)
pin – номер порта к которому подключена серва

min (опционально) – ширина импульса в микросекундах устанавливающая положение вала сервы в 0 градусов (по-умолчанию 544)

max (опционально) — ширина импульса в микросекундах устанавливающая положение вала сервы в 180 градусов (по-умолчанию 2400)

#include Servo myservo; void setup() < myservo.attach(9); >void loop() <>

void write(int value);

Описание:
Устанавливаем угол поворота сервы в градусах.
В случае сервы постоянного вращения:
0 – вращение на полной скорости в одну сторону,
180 – вращение на полной скорости в другую сторону,
90 – нет вращения.

servo.write(angle);

Параметры:
angle – значение угла для поворота: от 0 до 180

#include Servo myservo; void setup() < myservo.attach(9); myservo.write(90); // поворачиваем серву на 90 градусов >void loop() <>

void writeMicroseconds(int value);

Описание:
Задаёт значение в микросекундах для длительности управляющего импульса. На стандартных сервах это приведёт к повороту вала на определённый угол ( 1000 — положение полностью против часовой стрелки, 2000 — положение полностью по часовой стрелке, и 1500 — в середине).
Примечание:
Значения могут быть разными на сервах разных производителей. Например, от 700 до 2300. Это можно определить экспериментально – увеличивая значения, пока серва продолжает поворачиваться. Обратите внимание, что попытки управления сервой вне её конечных точек (при этом появляется рычащий звук) приводит к увеличению потребления тока и такого следует избегать.

servo.writeMicroseconds(uS);

Параметры:
uS – значение ширины импульса в микросекундах (int)

#include Servo myservo; void setup() < myservo.attach(9); myservo.writeMicroseconds(1500); // в среднее положение >void loop() <>

Описание:
Считывает «текущий» угол поворота сервомашинки (значение, переданное в последнем вызове write()).

servo.read();

Возвращаемое значение:
Возвращает значение типа int — угол от 0 до 180 градусов.

Примечание:
Аналогично есть функция readMicroseconds();

bool attached();

Описание:
Определяем – есть ли привязка к серве через pin.

servo.attached();

Возвращаемое значение:
Возвращает true если есть привязка к pin-у и false – в противном случае.

void detach();

Описание:
Отключение пина от библиотеки Servo. Если все переменные Servo отключены – пины 9 и 10 можно использовать для PWM-вывода через analogWrite().

servo.detach();

Возвращаемое значение:
нет.

Рассмотрим пример работы библиотеки на примере Sweep, который поворачивает серву от 0 до 180 градусов и обратно (как-бы подметает).
File – Examples — Servo — Sweep

// Sweep // by BARRAGAN #include Servo myservo; // создаём объект для контроля сервы int pos = 0; // переменная для хранения позиции сервы void setup() < myservo.attach(9); // серва подключена к 9-му пину >void loop() < for(pos = 0; pos < 180; pos += 1) // от 0 до 180 градусов < // с шагом в 1 градус myservo.write(pos); // delay(15); // ждём 15ms пока серва займёт новое положение >for(pos = 180; pos>=1; pos-=1) // от 180 до 0 градусов < myservo.write(pos); delay(15); >>

Существуют и другие библиотеки:
SoftwareServo — http://www.arduino.cc/playground/ComponentLib/Servo — удобна одинаковым названием функций с системной библиотекой Servo
— она не ограничивает количество серв 8-ю, но требует для работы вызова метода
SoftwareServo::refresh()

#include SoftwareServo myservo; // объект сервы int potpin = 0; // пин для подключения потенциометра int val; // переменная для хранения значения с аналогового входа void setup() < myservo.attach(2); // серва подключена ко 2-му пину >void loop() < val = analogRead(potpin); // считываем значение с потенциометра (величина от 0 до 1023) val = map(val, 0, 1023, 0, 179); // переводим в значение от 0 до 180) myservo.write(val); // устанавливаем угол сервы delay(15); // ждём поворота SoftwareServo::refresh(); >

MegaServo — http://www.arduino.cc/playground/Code/MegaServo
— библиотека для более ранних версий IDE (в 0017 не подгрузится, т.к. она уже входит в состав IDE под именем Servo �� — позволяет контролировать до 12 серв

Cсылки
http://arduino.cc/en/Reference/Servo

29 мая, 2010

18 комментариев на «“Программирование Arduino — библиотека Servo”»

Dan_ex :
Спасибо, как раз кстати…
У меня тут пара проектов с Arduino а толковой информации моло. ��

«Continuous Rotation Servo» — да, да! Очень интересно! Особенно если можно сделать скорость вращения 1 оборот в 20 — 40 секунд!

conysSM :

Стандартные рулевые машинки, вертятся от 0 до 180 градусов (также есть сервы постоянного вращения – т.н. Continuous Rotation Servo, чуть позже покажем, как обычную серву можно переделать до такого состояния

Очень нужно чтоб сервушка крутилась на 360гр. Порылся по моему у вас везде где можно, но не нашёл как это сделать. Подобное в сети очень много но не где не описывается как потом управлять такой переделанной сервой, и тем более с помощью CraftDuino. Если эта статья есть у вас уже на сайте подскажите где её искать. Заранее благодарен.

Тут кто-то обещал написать про Сервы постоянного вращения / Continuous Rotation Servo. ��
Всё-всё-всё. Нашёл.
robocraft.ru/blog/mechanics/240.html
robocraft.ru/blog/mechanics/241.html

собираю многоножку на tower pro 946, у нее граничными значениями оказались 800 и 2200 мс, угол поворота — 60 градусов

Как подключить к arduino UNO 3 сервы? Обязательно покупать motor shield или что-то подобное? Нельзя ли напрямую?

разумеется, можно — Подключение сервомашинок к Arduino :

если сервы мощные, то стабилизатор питания контроллера будет очень сильно греться и может сгореть.
Выход — использовать для питания сервомашинки отдельный регулятор напряжения (L7805, КР142ЕН5А и т.п.)

Вроде бы понял, поправьте меня, если неправильно. То есть, теоретически, к Uno можно подключить 14 (маломощных) серво, создать для них объекты:

Servo servo0; Servo servo1; . Servo servo13;

потом назначить им порты:

servo0.attach(0); servo1.attach(1); . servo13.attach(13);

и управлять ими с помощью:

servo0.write(foo); servo1.write(foo); . servo13.write(foo);

execom :

Вроде бы понял, поправьте меня, если неправильно. То есть, теоретически, к Uno можно подключить 14 (маломощных) серво, создать для них объекты:

в UNO установлен контроллер ATmega8U2(ATmega328), а в библиотеке Servo имеется код:

// Say which 16 bit timers can be used and in what order #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #define _useTimer5 #define _useTimer1 #define _useTimer3 #define _useTimer4 typedef enum < _timer5, _timer1, _timer3, _timer4, _Nbr_16timers >timer16_Sequence_t ; #elif defined(__AVR_ATmega32U4__) #define _useTimer3 #define _useTimer1 typedef enum < _timer3, _timer1, _Nbr_16timers >timer16_Sequence_t ; #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) #define _useTimer3 #define _useTimer1 typedef enum < _timer3, _timer1, _Nbr_16timers >timer16_Sequence_t ; #elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__) #define _useTimer3 #define _useTimer1 typedef enum < _timer3, _timer1, _Nbr_16timers >timer16_Sequence_t ; #else // everything else #define _useTimer1 typedef enum < _timer1, _Nbr_16timers >timer16_Sequence_t ; #endif

Согласно которому распределяется порядок подключения и количество таймеров в зависимости от модели контроллера, в списке IF-ов нет используемого в UNO контроллера, следовательно применяется ELSE, согласно которому будет задействован 1 таймер — №1. Далее по коду можно обнаружить следующий код:

#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer #define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER)

говорящий что максимальное количество сервов определяется как произведения количества возможный таймеров на константу определяющую максимальное число сервоприводов на один таймер, равную 12 по всей видимости, стантартными приемами используя UNO и библиотеку servo можно включить 12 сервоприводов.

aleksasm :

Всем привет, переделал серву для вращения по кругу (360 градусов) подредактировал скетч но она вертится не останавливаясь. если подключая непеределаную серву она поворачивается на каждые 90 градусов. Но мне нужно все 360 а не 180. подскажите что не так.
вот скетч
#include
Servo myservo; void setup()
<
// устанавливаем пин как вывод управления сервой
myservo.attach(10);
> void loop()
<
// устанавливаем угол 0°
myservo.write(0);
delay(3000);
// устанавливаем угол 90°
myservo.write(90);
delay(3000);
// устанавливаем угол 180°
myservo.write(180);
delay(3000);
// устанавливаем угол 270°
myservo.write(270);
delay(3000);
>

Zoltberg :

ИМХО всё именно так как должно быть.
Серву, простыми средствами, не заставить поворачиваться более чем на 180.
Про устройство — тут .
только если потенциометр обратной связи менять на многооборотный но тогда точность станет невысокой.
Не могу знать как переделывали именно вы, но обычно сервы переделывают не столько на «360», сколько на «постоянное вращение» — см подробности .

aleksasm :

Я убрал фиксатор, вместо потенциометра подпаял 2 резистора по 3,3к. значит невозможно сделать чтобы она останавливалась через каждые 90?

Zoltberg :

Так невозможно — вы же вытащили потенциометр серва теперь ничего не знает о своём текущем положении.
Таки почитайте .

aleksasm :
Спасибо, будем довольствоваться поворотом на 180. Попробую шаговый движок прикрутить для своих нужд.
conysSM :

Здравствуйте. Помогите понять почему в новой версии arduino-1.0 при компиляции выдаётся вот такая ошибка:

In file included from Proverka_pde.cpp:1: D:\Program Files\arduino-1.0-windows\arduino-1.0\libraries\SoftwareServo /SoftwareServo.h:4:22: error: WProgram.h: No such file or directory.

Компилировал скетч который в этой статье в последнем примере. Также выдаются такие же ошибки в скетчах, где есть обращение в сторонние библиотеки. Делаю тоже самое в arduino-0022 — всё в порядке… В чём дело? помогите пожалуйста понять.

В Arduino IDE версии 1.0 , разработчики переименовали файл WProgram.h в Arduino.h

conysSM :

О, спасибо огромное, особенно за оперативность :)А то думал опять неделю ждать придётся, как год назад ��

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Arduino

Что такое Arduino? Зачем мне Arduino? Начало работы с Arduino Для начинающих ардуинщиков Радиодетали (точка входа для начинающих ардуинщиков) Первые шаги с Arduino 

Разделы

Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

если у вас черное окно попробуйте так. #include #include #include #include using namespace cv; using namespace std;…

Для Python 3.4: pip3 install tensorflow-1.1.0-cp34-cp34m-linux_armv7l.whl https://github.com/samjabrahams/tensorflow-on-raspberry-pi

PORTB = (PORTB & 0b11100111) | (i & 0b00000011); А почему Вы обнуляете биты 3 и 4, а заполняете биты…

OpenCV Робототехника Будущее за бионическими роботами? Нейронная сеть - введение 

Инфо

Материалы сайта являются авторскими. Копирование и публикация материалов без разрешения запрещены!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *