Сколько сервоприводов можно подключить к arduino
Перейти к содержимому

Сколько сервоприводов можно подключить к arduino

  • автор:

Arduino.ru

Я совсем зеленый в электронике, начинаю осваиваться потихоньку. Купил arduino mega2560 + десяток серв RDS3115mg + 5 шт. MG995, планирую все эти сервы подключить к arduino. Заметил что при выполнении задания для одной сервы бывает ноут издает звук отключившейся usb, в одном из видео видел сказали что это бывает если не хватает питания, да и чтобы подключить такое большое количество серв одновременно понимаю что нужно внешнее питание. В спецификации серв RDS3115mg написано Напряжение: 4.8v — 8.4v, для MG995 Рабочее напряжение : 4,8 — 7.2Volts. В местном магазинчике радиолектроники есть импульсные блоки питания на 7,5 V и 9 V, на 1А, 2A, 3A.

Вопросы собственно следующие:

1) на сколько вольт и ампер лучше взять блок питания? Чем больше тем лучше или с 3A есть шанс что-то спалить?

2) Чтобы подключить сразу все сервы лучше запитать их через отдельную плату или с адаптером через arduino?

спользуется конденсатор. Мне нужно подключать конденсатор для каждой сервы или достаточно одного в цепи? Или достаточно одного, но чем больше серв то нужен конденсатор с другим номиналом?

  • Войдите на сайт для отправки комментариев

Вс, 28/09/2014 — 10:44
Зарегистрирован: 05.01.2012

Конденсатора на 220 достаточно. Каждой серве надо свой, причем чтобы находился рядом с этой сервой, а не возле разъёма в одном месте 9 штук напаять. Ещё полезны керамические по 0.1 мкФ но они впринципе, есть уже внутри самой сервы.

Блок на 7.5 подходит только для RDS3115. Если в этой же цепи будут MG995, они поимеют перенапряжение в 0.3 вольта. Существует определённый запас, но это в любом случае превышение предельных эксплуатационных параметров, то есть не 100% надёжно. Ищите блок на 6 В.

Ток — чем больше тем лучше, максимальный ток у блоков питания обозначает его запас, максимум который он может вывезти.

Питание серв отдельное, т. к. они шумят.

  • Войдите на сайт для отправки комментариев

Вс, 28/09/2014 — 11:53
Зарегистрирован: 28.09.2014

Подкажите, пожалуйста еще:

1) Как понять на сколько серв мне хватит 2A или 3A?

2) Могу ли я соединить сначало сервы RDS3115, а потом с помощью какого-то элемента понизить напряжение до 6V и дальше подключать MG995ки? И не будет ли это конфликтовать с тем что блок питания импульсный?

3) И еще такой вопросик: подключаю ардуину к ноутбуку через usb, мультиметром мерию выход в ардуино на 5V, и мультиметр показывает что там 4,7V. Нормально ли это? И из-за чего может это быть? USB не поставляет 5V или ардуина китайская и не дает честные 5V или мультиметр врет?

  • Войдите на сайт для отправки комментариев

Вс, 28/09/2014 — 14:59
Зарегистрирован: 05.01.2012

Начну с адского вопроса 3.

Есть такая вещь, делитель напряжения. Он состоит из двух резисторов, соединённых вместе одним концом. Крайние концы резисторов — вход делителя. Место соединения, и один из крайних — выход. Пусть напряжение на входе — E, а на выходе — U. Тогда напряжение на выходе равно U=E*(R2/(R1+R2)), где R1, R2 — номиналы резисторов.

Блок питания в ноутбуке, и какой-либо потребитель в USB порте (в данном случае Arduino) образуют такой делитель. Причём, так как мы знаем закон Ома U=I/R (где I — ток), то повысить ток, имея конечное фиксированное напряжение, возможно только уменьшив резистор. Arduino — резистор, и его номинал тем меньше, чем больше потребителей (серв, датчиков, индикаторов и прочей х__ты) к ней подключено. Подумав ещё над формулой делителя, откроем для себя, что при уменьшении резистора R2 (Arduino воткнутой в USB порт) имеем эффект уменьшения напряжения U на выходе «делителя». Это называется «падение напряжения на нагрузке». 4.7 В — это и есть результат этого эффекта, нагрузка потребляет некоторый ток, напряжение просаживается на 0.3 В. Если отключить, будет 5 В. В общем и целом, 4.7 В на выходе — это нормально, поэтому можно забить и не париться. Ещё рекомендуется почитать учебник.

2. Могу. Не будет. Этот элемент называется 7805, ищите. Ну будет не 6 В а 5. Не критично.

1. Открываем умный браузер гуглохром, и вбиваем в адресной строке фразу: «RDS3115 datasheet». Вообще очень советую запомнить слово datasheet, это по-буржуйски «справочный листок». Производитель указывает в этом документе всю инфу по компоненту, причём излагая подробнейшим образом. Там есть уйма полезного.

Operating Voltage:4.8-7.2Volts
Operating Current:150mA

Вооружившись китайским калькулятором (или вбив Win+R>calc>Enter>150*10>Enter, лол), поймём что десять таких серв будут кушать 1.5 А. Ищем ту же инфу по MG995. Та же проверенная схема: умный браузер (да вообще-то подойдёт любой браузер), фраза «MG995 datasheet», копаем ссылки. Вторая страница в поиске будет http://www.dx.com/p/mg995-tower-pro-servo-gear-for-r-c-car-plane-helicopter-148051#.VCflV_l_uXw, там написано: Working Voltage : 3.0V~7.2V; Working current: 100mA. Также считаем калькулятором и приходим к выводу, что 5 таких серв потребуют 0.5 А. Складываем 1.5+0.5, получаем 2 А. Это максимальный потребляемый ток, если вообще все сервы будут крутиться одновременно. Поэтому допустимо ставить блок на 2 А. Однако, есть правило защиты от дурака, оно гласит: предельные эксплуатационные параметры должны иметь запас 50%. Поэтому умножим 2 на 1.5 (если непонятно, то 150%=1.5), получим 3. Итого ответ: блок можно ставить на 2 А. Но лучше на 3.

  • Войдите на сайт для отправки комментариев

Arduino.ru

Хочу поставить еще один преобразователь LM2596 и запитать от него сервоприводы, при этом аккумулятор будет один общий (т.е 2 понижающих преобразователя работают от одного 12v аккумулятора — один на плату ардуино, второй на сервоприводы)

Слышал, что в подобных случаях надо объединять землю (gnd) у сервоприводов и платы, объясните поподбронее, как правильнее подключить и допустима ли вообще такая схема подключения?

  • Войдите на сайт для отправки комментариев

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

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

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

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

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

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

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

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()

Multi Servo Shield (на 16 сервоприводов)

Рядом с клеммником питания расположены три контакта с перемычкой.

Питание Multi Servo Shield

  • Если перемычка замыкает контакты расположенные ближе к клеммнику «Общ. Пит.», то питание с Servo Shield подаётся на вход Arduino «Vin» (общее питание берется с Servo Shield). Не требуется отдельного питания Arduino.
  • Если перемычка расположена на контактах дальше от клеммника, или отсутствует, то питание должно подаваться на Arduino, а на Servo Shield подаётся только в том случае, если он используется для управления сервоприводами (раздельное питание).

Подробнее о Servo Shield:

Servo Shield построен на базе чипа PCA9685, все функции которого, реализованы в библиотеке iarduino_MultiServo. Данный Shield позиционируется как устройство управления сервоприводами, но его можно использовать и в качестве расширителя цифровых выходов Arduino (не входов, а только выходов) с возможностью вывода сигналов ШИМ, в таком случае внешнее питание на клеммник Vin не подаётся.

Для работы с Servo Shield предлагаем воспользоваться библиотекой iarduino_MultiServo, в которой реализован весь функционал чипа PCA9685.

Подробнее про установку библиотеки читайте в нашей инструкции.

Примеры:

Управление сервоприводами: SG90, MG90, MG996R, Futaba S3003:

#include // Подключаем библиотеку iarduino_MultiServo iarduino_MultiServo MSS; // Объявляем объект MSS, для работы с библиотекой void setup() < // Указываем какой тип сервопривода подключен к выводам MultiServoShield MSS.servoSet(0, SERVO_SG90); // Сервопривод SG90 подключён к выводу № 0 MultiServoShield. MSS.servoSet(1, SERVO_SG90); // Сервопривод SG90 подключён к выводу № 1 MultiServoShield. MSS.servoSet(2, SERVO_SG90); // Сервопривод SG90 подключён к выводу № 2 MultiServoShield. MSS.servoSet(3, SERVO_MG90); // Сервопривод MG90 подключён к выводу № 3 MultiServoShield. MSS.servoSet(4, SERVO_MG996R); // Сервопривод MG996R подключён к выводу № 4 MultiServoShield. MSS.servoSet(5, SERVO_FutabaS3003); // Сервопривод Futaba S3003 подключён к выводу № 5 MultiServoShield. // MSS.servoSet(SERVO_ALL, SERVO_SG90); // На любом выводе используются только сервоприводы SG90 MSS.begin(); // Инициируем работу с MultiServoShield >void loop() < // Управляем сервоприводами MSS.servoWrite(3, 50); // Повернуть сервопривод, подключённый к 3 выводу, на 50° delay(1000); // Ждём 1 сек. MSS.servoWrite(5, 120); // Повернуть сервопривод, подключённый к 5 выводу, на 120° delay(1000); // Ждём 1 сек. MSS.servoWrite(SERVO_ALL, 180); // Повернуть все сервоприводы на 180° delay(1000); // Ждём 1 сек. MSS.servoWrite(SERVO_ALL, 0); // Повернуть все сервоприводы на 0° delay(1000); // Ждём 1 сек. >

Управление любыми сервоприводами:

#include // Подключаем библиотеку iarduino_MultiServo iarduino_MultiServo MSS; // Объявляем объект MSS, для работы с библиотекой void setup() < // Указываем какой тип сервопривода подключен к выводам MultiServoShield MSS.servoSet(0, 180, 130, 470); // К выводу 0, подключен сервопривод с максимальным углом поворота 180°, ШИМ для 0° = 130. ШИМ для 180° = 470 MSS.servoSet(1, 120, 100, 500); // К выводу 1, подключен сервопривод с максимальным углом поворота 120°, ШИМ для 0° = 100. ШИМ для 120° = 500 // MSS.servoSet(SERVO_ALL, 90, 50, 300);// На любом выводе используются сервоприводы с максимальным углом поворота 90°, ШИМ для 0° = 50. ШИМ для 90° = 300 MSS.begin(); // Инициируем работу с MultiServoShield >void loop() < // Управляем сервоприводами как и в предыдущем примере >

Управление выходами Arduino: (расширитель выходов)

#include // Подключаем библиотеку iarduino_MultiServo iarduino_MultiServo MSS; // Объявляем объект MSS, для работы с библиотекой void setup() < MSS.begin(0x40, 1000); // Инициируем работу с MultiServoShield // указывая адрес MultiServoShield на шине I2C: 0x40 (по умолчанию 0x40) // и частоту сигнала ШИМ: 1000 Гц (по умолчанию 50 Гц), можно указать от 1 до 1526 Гц >void loop()< MSS.digitalWrite(5, LOW); // Устанавливаем на 5 выводе низкий уровень (уровень логического «0») MSS.digitalWrite(6, HIGH); // Устанавливаем на 6 выводе высокий уровень (уровень логической «1») MSS.digitalWrite(SERVO_ALL, LOW); // Устанавливаем на всех выводах низкий уровень (уровень логического «0») MSS.digitalWrite(SERVO_ALL, HIGH); // Устанавливаем на всех выводах высокий уровень (уровень логической «1») MSS.analogWrite(0, 1023); // Устанавливаем на 0 выводе сигнал ШИМ с коэффициентом заполнения 1023 (25%), допускаются значения от 0 до 4095 MSS.analogWrite(1, 2047); // Устанавливаем на 1 выводе сигнал ШИМ с коэффициентом заполнения 2047 (50%), допускаются значения от 0 до 4095 MSS.analogWrite(SERVO_ALL, 3071); // Устанавливаем на всех выводах сигнал ШИМ с коэффициентом заполнения 3071 (75%), допускаются значения от 0 до 4095 MSS.analogWrite(10, 4095); // Устанавливаем на 10 выводе сигнал ШИМ с коэффициентом заполнения 4095 (100%), допускаются значения от 0 до 4095 MSS.analogWrite(2, 2047, 1023); // Устанавливаем на 2 выводе сигнал ШИМ с коэффициентом заполнения 2047 (50%), допускаются значения от 0 до 4095 // и фазовым сдвигом 1023 (25%), допускаются значения от 0 до 4095. // Фазовый сдвиг - необязательный параметр указывается от 0 до 4095 (по умолчанию 0) // устанавливает задержку сигнала ШИМ по отношению к другим выводам, но не влияет на коэффициент заполнения MSS.analogRead(5); // Читаем ранее установленный коэффициент заполнения ШИМ на выводе 5 // если на выводе был установлен низкий уровень (LOW), то функция вернёт 0 // если на выводе был установлен высокий уровень (HIGH), то функция вернёт 4096 // в нашем случае, функция вернёт 3071

Описание основных функций библиотеки:

Данная библиотека может использовать как аппаратную, так и программную реализацию шины I2C.
О том как выбрать тип шины I2C рассказано в статье Wiki - расширенные возможности библиотек iarduino для шины I2C.

Подключение библиотеки:

#include // Подключаем библиотеку. iarduino_MultiServo MSS; // Объявляем объект MSS, для работы с Multi Servo Shield.

Функция begin();

  • Назначение: Инициализация работы с Multi Servo Shiel.
  • Синтаксис: begin( [ АДРЕС [ , ЧАСТОТА ]] );
  • Параметры:
    • АДРЕС - адрес Shield на шине I2C, указывается от 0 до 127 (по умолчанию 0x40).
    • ЧАСТОТА - Частота ШИМ, указывается в Гц от 1 до 1526 (по умолчанию 50 Гц).
    MSS.begin(); // Инициируем работу с MultiServoShield, используя значения по умолчанию (адрес на шине I2C = 0x40, частота ШИМ = 50 Гц). MSS.begin(0x41); // Инициируем работу с MultiServoShield, используя адрес на шине I2C = 0x41 и частоту ШИМ = 50 Гц (по умолчанию). MSS.begin(0x40, 1000); // Инициируем работу с MultiServoShield, используя адрес на шине I2C = 0x40 и частоту ШИМ = 1 кГц.

    Функция servoSet();

    • Назначение: Установка параметров для каждого подключённого сервопривода.
    • Синтаксис:
      • servoSet( №_ВЫХОДА , НАЗВАНИЕ ); // Только для сервоприводов SG90, MG90, MG996R, Futaba S3003.
      • servoSet( №_ВЫХОДА , МАКС_УГОЛ , ШИМ_МИН , ШИМ_МАКС ); // Для любых сервоприводов.
      • №_ВЫХОДА - число, от 0 до 15. Если указать SERVO_ALL, то параметры применятся ко всем выходам.
      • НАЗВАНИЕ - одно из названий: SERVO_SG90, SERVO_MG90, SERVO_MG996R, SERVO_FutabaS3003.
      • МАКС_УГОЛ - число в градусах, от 1 до 360, указывающее максимально возможный угол сервопривода.
      • ШИМ_МИН - коэффициент заполнения ШИМ, от 0 до 4095, для угла 0°.
      • ШИМ_МАКС - коэффициент заполнения ШИМ, от 0 до 4095, для угла МАКС_УГОЛ.
      MSS.servoSet(SERVO_ALL, SERVO_SG90 ); // Указываем, что все подключённые сервоприводы являются SG90. MSS.servoSet(14 , SERVO_MG996R ); // Указываем, что сервопривод на 14 выводе является MG996R. MSS.servoSet(15 , 180, 200, 500); // Указываем, что сервопривод на 15 выводе имеет максимальный угол поворота 180°, углу 0° соответствует ШИМ 200, а максимальному углу (180°) соответствует ШИМ 500.

      Функция servoWrite();

      • Назначение: Поворот указанного сервопривода на заданный угол.
      • Синтаксис: servoWrite( №_ВЫХОДА , УГОЛ );
      • Параметры:
        • №_ВЫХОДА - число, от 0 до 15. Если указать SERVO_ALL, то повернутся все сервоприводы.
        • УГОЛ - число в градусах, от 0° до 360°, указывающее угол поворота для сервопривода.
        MSS.servoWrite(SERVO_ALL, 100); // Повернуть все сервоприводы на угол 100°. MSS.servoWrite(14 , 120); // Повернуть сервопривод, подключённый к 14 выходу, на угол 120°.

        Функция analogWrite();

        • Назначение: Установка сигнала ШИМ на указанном выходе, с указанным коэффициентом заполнения.
        • Синтаксис: analogWrite( №_ВЫХОДА , ШИМ [ , ФАЗОВЫЙ_СДВИГ ] );
        • Параметры:
          • №_ВЫХОДА - число, от 0 до 15. Если указать SERVO_ALL, то значения применятся ко всем выходам.
          • ШИМ - коэффициент заполнения ШИМ, лежит в пределах от 0 до 4095.
          • ФАЗОВЫЙ_СДВИГ - число, от 0 до 4095 (по умолчанию 0)
          • Функция работает как одноимённая функция для обычных выходов ШИМ, но в диапазоне 0. 4095.
          • Фазовый сдвиг, задерживает начало каждого импульса ШИМ по отношению к другим выводам.
          MSS.analogWrite(SERVO_ALL, 3071); // Устанавливаем на всех выходах сигнал ШИМ с коэффициентом заполнения 3071 (75%). MSS.analogWrite(10, 4095); // Устанавливаем на 10 выходе сигнал ШИМ с коэффициентом заполнения 4095 (100%). MSS.analogWrite(2, 2047, 1023); // Устанавливаем на 2 выходе сигнал ШИМ с коэффициентом заполнения 2047 (50%) и фазовым сдвигом 1023 (90° по отношению к остальным выводам)

          Функция digitalWrite();

          • Назначение: Установка логического состояния LOW или HIGH на выходе.
          • Синтаксис: digitalWrite( №_ВЫВОДА , СОСТОЯНИЕ );
          • Параметры:
            • №_ВЫВОДА - число, от 0 до 15. Если указать SERVO_ALL, то состояние установится на всех выходах.
            • СОСТОЯНИЕ - одно из логических состояний LOW или HIGH.
            MSS.digitalWrite(SERVO_ALL, LOW); // Устанавливаем на всех выходах, уровень логического 0. MSS.digitalWrite(0, HIGH); // Устанавливаем на 0 выходе, уровень логической 1.

            Функция analogRead();

            • Назначение: Чтение ранее установленного коэффициента заполнения ШИМ.
            • Синтаксис: analogRead( №_ВЫВОДА );
            • Параметры:
              • №_ВЫВОДА - число, от 0 до 15, указывающее выход состояние которого требуется проверить.
              • Ранее установленный коэффициент заполнения ШИМ от 0 до 4095.
              • Если был установлен постоянный уровень LOW, то функция вернёт 0
              • Если был установлен постоянный уровень HIGH, то функция вернёт 4096.
              • Примечание: Работает как одноимённая функция для аналоговых входов, но в диапазоне 0. 4096.
              int i = MSS.analogRead( 5 ); // Присваиваем переменной i, установленное ранее, значение ШИМ на 5 выходе.

              Указанных функций достаточно, для управления сервоприводами, или работой с Servo Shield как с расширителем выходов, но для реализации более сложных задач, в библиотеке реализованы дополнительные функции.

              Описание дополнительных функций библиотеки:

              Функция bus();

              • Назначение: Устанавливает скорость работы Multi Servo Shield на шине I2C.
              • Синтаксис: bus( ЧАСТОТА );
              • Параметры:
                • ЧАСТОТА - указывается в кГц от 1 до ((F_CPU/10000)-16)/2 (по умолчанию 100 кГц)
                MSS.bus(400); // Устанавливаем скорость работы шины I2C в значение 400 Кбит/сек.

                Функция restart();

                • Назначение: Перезагружает Multi Servo Shield, с установкой значений по умолчанию.
                • Синтаксис: restart();
                • Параметры: Нет.
                • Возвращаемые значения: Нет.
                • Примечание: Нет.
                • Пример:
                MSS.restart(); // Перезагружаем Multi Servo Shield.

                Функция invert();

                • Назначение: Инвертирует сигналы на всех выходах Multi Servo Shield.
                • Синтаксис: invert( ФЛАГ );
                • Параметры:
                  • ФЛАГ - принимает значение true или false, указывающее инвертировать или нет состояние на выходах.
                  MSS.invert(true); // Инвертируем сигналы на всех выходах.

                  Функция outdrv();

                  • Назначение: Устанавливает схему с каскадным выходом выводов внутри чипа.
                  • Синтаксис: outdrv( ФЛАГ );
                  • Параметры:
                    • ФЛАГ - принимает значение true (схема с каскадным выходом) или false (схема с открытым стоком).
                    • Схема с каскадным выходом используется если внешние устройства подключены к Shield через драйвер.
                    • Схема с открытым стоком используется если внешние устройства подключены к Shield напрямую, без драйвера.
                    MSS.outdrv(true); // Устанавливаем подключение выходов чипа по внутренней схеме с каскадным выходом. MSS.outdrv(false); // Устанавливаем подключение выходов чипа по внутренней схеме с открытым стоком.

                    Функция outState();

                    • Назначение: Устанавливает одно из трех состояний на всех выходах, если на входе OE установлена «1».
                    • Синтаксис: outState( СОСТОЯНИЕ );
                    • Параметры:
                      • СОСТОЯНИЕ - одно из трех значений: LOW , HIGH или IMPEDANCE.
                      MSS.outState(LOW); // При подаче 1 на вход чипа «OE», на всех выходах установится низкий уровень. MSS.outState(HIGH); // При подаче 1 на вход чипа «OE», на всех выходах установится высокий уровень. MSS.outState(IMPEDANCE); // При подаче 1 на вход чипа «OE», на всех выходах установится уровень высокого импеданса.

                      Функция extClock();

                      • Назначение: Устанавливает работу чипа от внешнего источника тактирования, с указанием его частоты.
                      • Синтаксис: extClock( ЧАСТОТА );
                      • Параметры:
                        • ЧАСТОТА - число, от 1 до 50'000, указывает частоту внешнего источника тактирования в кГц.
                        MSS.extClock(10000); // Указываем чипу, работать от внешнего источника тактирования, настроенного на частоту 10 МГц MSS.extClock(false); // Указываем чипу, работать от внутреннего источника тактирования

                        Функция reg();

                        • Назначение: Чтение или запись одного байта данных в (из) регистр чипа.
                        • Синтаксис: reg( АДРЕС [ , ДАННЫЕ ] );
                        • Параметры:
                          • АДРЕС - число указывающее адрес регистра, данные которого нужно прочитать/записать.
                          • ДАННЫЕ - байт данных для записи.
                          • Если функция вызвана без параметра ДАННЫЕ, то она вернет байт данных находящийся в регистре с указанным адресом.
                          • Если функция вызвана с параметром ДАННЫЕ, то она запишет указанные данные в регистр с указанным адресом.
                          byte i = MSS.reg(0x05); // Читаем байт данных из 5 регистра чипа в переменную i MSS.reg(0x05,0x00); // Устанавливаем значение 0 в 5 регистр чипа

                          Применение:

                          • Управление сервоприводами (до 16 шт.)
                          • Устройство расширения выходов Arduino (не входов)

                          Ссылки:

                          • Multi Servo Shield на 16 сервоприводов.
                          • Библиотека iarduino_MultiServo.
                          • Wiki - Установка библиотек в Arduino IDE.
                          • Расширенные возможности библиотек iarduino для шины I2C.

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

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