Multiservo Shield

1. Введение

1.1. Особенности

  • Полностью избавляет от проблемы дрожащих сервоприводов
  • Предоставляет 18 сервовыходов, занимая только 2 вывода Arduino: SDA и SCL
  • Отдельное питание для сервоприводов
    • Возможность питать Arduino питанием для сервоприводов приводов
    • Максимальный ток для серв — 10 А
  • 6 трёхпроводных разъёмов напрямую с Arduino
  • Диаппазон напряжений питания
    • 3,3…5,5 В для цифровой цепи
    • ≤12 В для цепи питания серв
  • Диаппазон рабочих температур: -40°С…+85°C
  • Диаппазон температур хранения: -65°С…+150°C
  • Ток управляющей цепи в холостом режиме: 15 мА

1.2. Применение

  • Управление роботами-пауками
  • Управление руками-манипуляторами

1.3. Описание

Multiservo Shield — это плата расширения для Arduino Uno, позволяющая управлять 18-ю сервоприводами посредством всего двух выводов I²C интерфейса Arduino. Для управления этими сервоприводами на плате имеется специальный контроллер. Это позволяет избавиться от дрожания сервоприводов, которое всегда присутствует при управлении сервоприводами напрямую от Arduino. Плата имеет раздельное питание для серв и управляющей цепи.

2. Расположение и назначение выводов

Вывод Описание
0…17 Выход на сервопривод
D2, D3, D5, D6, D7, D8 Выводы с Arduino Uno
PWR+ Питание сервоприводов, «+»
PWR— Питание сервоприводов, «—»
PWR JOIN Перемычка объединения питаний
ICSP Интерфейс для обновления прошивки модуля

3. Применение

3.1. Базовая информация

Для того, чтобы начать использовать Multiservo Shield достаточно установить его на Arduino, подать питание на клеммник «PWR» или установить перемычку на контакты «PWR JOIN», и подключить хотя бы одну серву.

3.2. Пример простейшего подключения

multiservo_minimal.ino
#include <Wire.h>
#include <Multiservo.h>
 
Multiservo servo;
 
void setup(void)
{
  servo.attach(17);
}
 
void loop(void)
{
  servo.write(90);
 
  delay(1000);
}
MultiservoSweep.ino
#include <Wire.h>
#include <Multiservo.h>
 
Multiservo myservo;
 
int pos = 0;  
 
void setup(void)
{
  Wire.begin();
  myservo.attach(17);
}
 
void loop(void)
{
  for (pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
  { // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) // goes from 180 degrees to 0 degrees
  {
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

3.3. Пример подключения одновременно и к Arduino и к Multiservo

multiservo_warduino.ino
#include <Wire.h>
#include <Servo.h>
#include <Multiservo.h>
 
Servo arduino_servo;
Multiservo multi_servo;
 
void setup(void)
{
  arduino_servo.attach(7);
  multi_servo.attach(7);
}
 
void loop(void)
{
  arduino_servo.write(90);
  multi_servo.write(90);
 
  delay(1000);
}

3.4. Пример подключения паука

Код управления пауком оставляем вам написать в качестве домашнего задания.

4. Детальное описание

4.1. Встроенный микроконтроллер ATmega48PA

Multiservo Shield является интеллектуальным устройством — на плате размещён микроконтроллер, который принимает команды по интерфейсу I²C от Arduino Uno и исполняет их.

4.2. Избавление от дрожания сервоприводов

Встроенный микроконтроллер использует прерывания для работы с сервами. Команды он принимает только в фоновом режиме, т.ч. если в процессе принятия команды пришло время выдать импульс для сервоприводов, то передача команды обрывается. Поэтому сервоприводы, подключённые к Multiservo, не дрожат в состоянии покоя как это происходит в случае подключения их к Arduino. Дрожь вызвана флуктуациями длительности импульсов, выдаваемых Arduino; флуктуация возникает из-за наличия сторонних прерываний, которые конкурируют с прерываниями, по которым управляются сервоприводы. В Multiservo Shield в ATmega28PA не используются никакие прерывания, кроме тех, что нужны сервоприводам, поэтому этот модуль лишён флуктуаций сигнала.

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

Multiservo serv;
serv.setSendAttempts(4);// Пытаться посылать команду 4 раза

4.3. Библиотека Multiservo

Для того, чтобы работа с Multiservo Shield как можно меньше отличалась от работы с сервами напрямую, поставляется библиотека Multiservo. Интерфейс класса Multiservo ничем не отличается от интерфейса стандартного класса Servo. При этом номера выводов, которые передаются в функцию attach, являются номерами выводов на плате Multiservo Shield, а не Arduino.

4.4. Дополнительные 6 выводов для серв, трёхпроводных датчиков и модулей

На плате есть 6 разъемов для подключения по трёхпроводному интерфейсу, управляющие линии для которых выведены напрямую от Arduino. Эти разъемы обозначены как «Dn». Каждому управляющему выводу на разъёме «Dn» соответствует вывод «n» на плате Arduino (например, «D3» → «3»).

5. Рекомендации по питанию

Сервоприводам требуется большой ток для работы, поэтому предпочтительным способом питания является отдельное питание для сервоприводов. Так же стоит отметить, что для питания серв не пригодны маломощные источники питания, такие как «Крона». Используйте Li-Ion, Ni-Mh или алькалиновые элементы питания.

Факт наличия питания можно установить по горению светодиодов. Светодиод «μON» зажигается при подаче питания на цифровую часть модуля, «PON» — на силовую.

6. Спецификация

Параметр Мин Ном Макс Ед
Напряжение питания управляющей части 3,3 5,5 В
Напряжение питания силовой части 6 В
Ток, потребляемый цифровой частью 10 13 80 мА
Ток, потребляемый силовой частью 10 А
Температура хранения и транспортировки —65 +150 °С
Температура работы —40 20 +85 °С

7. Ссылки