КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

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

Исходники изображение:
Библиотеки:

Общие сведения:

Multi Servo Shield на 16 сервоприводов - используется для управления сервоприводами по шине I2C.

Видео:

Спецификация:

  • Напряжение питания прикладываемое к выходам: 5 ... 6 В.
  • Ток нагрузки на выходах: до 25 мА.
  • Частота тактирования: 25 МГц внутренний генератор (±3%).
  • Количество каналов ШИМ: 16 шт.
  • Разрешение ШИМ: 12 бит 4096 тактов (от 0 до 100%).
  • Выходная частота ШИМ: 24 … 1526 Гц (для сервоприводов устанавливается в 50 Гц)
  • Рабочая частота шины I2C: … 100кГц, 400кГц, 1МГц.
  • Рабочая температура: -40 … 85 °C.

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

Servo Shield устанавливается на Arduino UNO и использует только два аппаратных вывода шины I2C. Адрес Servo Shield на шине 0x40.

Питание:

  • Если Servo Shield используется для управления сервоприводами, то выходное напряжение берется ТОЛЬКО от внешнего источника питания 5 - 6 В, который подключается к клеммнику Vin.
  • Если Servo Shield используется как расширитель цифровых выходов Arduino, то внешнее питание на Servo Shield не подаётся.

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

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

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

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

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

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

Примеры:

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

#include <Wire.h>                       //  Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_MultiServo.
#include <iarduino_MultiServo.h>        //  Подключаем библиотеку 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(&Wire);                    //  Инициируем работу с MultiServoShield, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire)
}
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 <Wire.h>                       //  Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_MultiServo.
#include <iarduino_MultiServo.h>        //  Подключаем библиотеку 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(&Wire);                    //  Инициируем работу с MultiServoShield, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire)
}
void loop(){
// Управляем сервоприводами как и в предыдущем примере
}

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

#include <Wire.h>                       //  Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_MultiServo.
#include <iarduino_MultiServo.h>        //  Подключаем библиотеку iarduino_MultiServo
iarduino_MultiServo MSS;                //  Создаём объект MSS, для работы с библиотекой
void setup() {
   MSS.begin(&Wire, 0x40, 1000);        //  Инициируем работу с MultiServoShield.
                                        //  указывая ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire)
                                        //  адрес MultiServoShield на шине I2C (по умолчанию 0x40)
                                        //  и частоту сигнала ШИМ (по умолчанию 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

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

В данном разделе описаны функции библиотеки iarduino_MultiServo для работы с Multi Servo Shield на 16 сервоприводов.

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

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

  • Если используется аппаратная шина I2C:
#include <Wire.h>                  // Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_MultiServo.h
                                   //
#include <iarduino_MultiServo.h>   // Подключаем библиотеку для работы с модулем.
iarduino_MultiServo MSS;           // Объявляем объект MSS, для работы с функциями библиотеки iarduino_MultiServo.
                                   //
void setup(){                      //
     ...                           //
     MSS.begin(&Wire);             // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire).
     ...                           // Доступны объекты: &Wire, &Wire1, &Wire2...
}                                  //
  • Если используется программная шина I2C:
#include <iarduino_I2C_Software.h> // Подключаем библиотеку для работы с программной шиной I2C, до подключения библиотеки iarduino_MultiServo.h
SoftTwoWire sWire(3,4);            // Создаём объект программной шины I2C указав выводы которым будет назначена роль линий: SDA, SCL.
                                   //
#include <iarduino_MultiServo.h>   // Подключаем библиотеку для работы с модулем.
iarduino_MultiServo MSS;           // Объявляем объект MSS, для работы с функциями библиотеки iarduino_MultiServo.
                                   //
void setup(){                      //
     ...                           //
     MSS.begin(&sWire);            // Инициируем работу с модулем, указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire).
     ...                           //
}                                  //
  • В обоих примерах сначала подключается библиотека для работы с шиной I2C. Для аппаратной шины библиотека Wire.h (предустановлена в Arduino IDE), а для программной шины библиотека iarduino_I2C_Software.h, с созданием объекта которому указываются выбранные вами выводы шины, в примере выводы (3-SDA, 4-SCL).
  • Далее подключается библиотека и создаётся объект для работы с модулем.
  • В коде Setup(), при инициализации работы с модулем указывается ссылка на объект работы с выбранной шиной I2C begin(&ШИНА). Остальные строки кода одинаковы для любой шины I2C.

Функция begin();

  • Назначение: Инициализация работы с Multi Servo Shiel.
  • Синтаксис: begin( [ АДРЕС [ , ЧАСТОТА ]] );
  • Параметры:
    • &ШИНА - Ссылка на объект для работы с шиной I2C на которой находится модуль.
      • Для аппаратной шины: &Wire, &Wire1, &Wire2..., если подключена библиотека Wire.h
      • Для программной шины: ссылка на объект библиотеки iarduino_I2C_Software.h.
      • Параметр является не обязательным, по умолчанию используется ссылка &Wire.
    • АДРЕС - адрес Shield на шине I2C, указывается от 0 до 127 (по умолчанию 0x40).
    • ЧАСТОТА - Частота ШИМ, указывается в Гц от 1 до 1526 (по умолчанию 50 Гц).
  • Возвращаемые значения: Нет.
  • Примечание: Достаточно вызвать 1 раз в коде Setup, но допускаются и повторные вызовы, если требуется изменить частоту или адрес.
  • Пример:
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, для угла МАКС_УГОЛ.
  • Возвращаемые значения: Нет.
  • Примечание: Достаточно вызвать 1 раз, как до, так и после функции begin, но до функции servoWrite.
  • Пример:
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°, указывающее угол поворота для сервопривода.
  • Возвращаемые значения: Нет.
  • Примечание: Сервопривод не повернётся на угол, больше, чем указанный в функции servoSet().
  • Пример:
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 кГц)
  • Возвращаемые значения: Нет.
  • Примечание: Функцию можно вызывать как до, так и после функции begin.
  • Пример:
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.
  • Возвращаемые значения: Нет.
  • Примечание: При указании HIGH и выборе схемы с открытым стоком, на выходах будет состояние IMPEDANCE.
  • Пример:
MSS.outState(LOW);                          // При подаче 1 на вход чипа «OE», на всех выходах установится низкий уровень.
MSS.outState(HIGH);                         // При подаче 1 на вход чипа «OE», на всех выходах установится высокий уровень.
MSS.outState(IMPEDANCE);                    // При подаче 1 на вход чипа «OE», на всех выходах установится уровень высокого импеданса.

Функция extClock();

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

Функция reg();

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

Применение:

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

Ссылки:




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями