Статьи

Построить Arduino Motor / Stepper / Servo Shield — Часть 1. Сервоприводы

Этот пост начинает небольшую (или более крупную?) Серию учебных пособий с использованием Arduino Motor / Stepper / Servo Shield с  платой FRDM-KL25Z  . Этот экран двигателя, вероятно, является одним из самых универсальных на рынке и имеет 2 разъема сервопривода и 4 разъема для двигателя постоянного или шагового двигателя. Это делает его отличным щитом для любого робототехнического проекта. :-) 

Шаговый сервомотор Arduino с FRDM-KL25Z

Шаговый сервомотор Arduino с FRDM-KL25Z

Серия начинается с урока о том, как управлять двумя серводвигателями. И если это не то, что вы ожидаете сделать с этим щитом, тогда вы можете проголосовать и сказать мне, что вы хотите увидеть вместо этого на этом моторном щите  :-) .

OEM или оригинал?

Оригинальный Arduino Motor / Stepper / Servo Shield можно приобрести в  Adaftruit Industries по  цене менее 20 долларов. Я использую OEM версию, смотрите эту  ссылку . Функциональность та же, за исключением того, что OEM-версия работает только с двигателями до 16 В постоянного тока, в то время как оригинальный экран предназначен для двигателей до 25 В постоянного тока.

Детали сервопривода двигателя шагового двигателя

Детали сервопривода двигателя шагового двигателя

На плате установлены две  микросхемы  H-Bridge для двигателей STMicroelectronics L293D , которые могут приводить в действие до 4 двигателей постоянного тока (или до 2 шаговых двигателей) с током 0,6 А на мост (пик 1,2 А). 74HCT595N (на моей плате установлен  SN74HC595  от Texas Instrument) — это сдвиговый регистр, используемый для H-мостов, чтобы уменьшить количество необходимых выводов (подробнее об этом в следующем посте). Клеммная колодка с перемычкой обеспечивает питание постоянного / шагового двигателя. 5 В постоянного тока для сервоприводов берется с платы FRDM.

:!: FRDM-KL25Z может выдавать только несколько сотен мА на 5V Arduino. Это работает для небольших сервоприводов, но я рекомендую отключить питание 5 В для сервоприводов и использовать выделенные 5 В (или 6 В) для сервоприводов.

Контур

В этом руководстве я создаю проект с  CodeWarrior для MCU10.4  для платы FRDM-KL25Z, а затем добавляю поддержку двух серводвигателей.

Компоненты Процессор Эксперт

В этом руководстве используются добавленные компоненты Processor Expert, которые не являются частью дистрибутива CodeWarrior. Используются следующие другие компоненты:

  1. Ожидание : позволяет ждать в течение заданного времени
  2. Серво : драйвер высокого уровня для двигателей хобби сервп

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

Создание проекта CodeWarrior

Чтобы создать новый проект в CodeWarrior:

  1. Файл> Создать> Проект Bareboard, дать имя проекту
  2. Укажите устройство, которое будет использоваться: MKL25Z128
  3. OpenSDA как соединение
  4. Поддержка ввода / вывода может быть установлена ​​на «Нет ввода / вывода»
  5. Processor Expert как опция быстрой разработки приложений

Это создает отправную точку для моего проекта:

Создан новый серво-проект

Создан новый серво-проект

Серводвигатель

Серводвигатели используются в RC (радиоуправлении) или (хобби) робототехнике.

Типичный серводвигатель (Hitec HS-303)

Типичный серводвигатель (Hitec HS-303)

Мотор имеет 3 разъема:

  1. GND  (черный)
  2. Мощность  (красная), обычно 5 В, но может быть 6 В или даже выше
  3. ШИМ  (белый или желтый), сигнал для информации о положении

Сигнал ШИМ обычно имеет частоту 50 Гц (20 мс), с длительностью (высокая длительность) от 1 мс до 2 мс.

На снимке экрана ниже показан такой сигнал 50 Гц с рабочим циклом 1,5 мс (среднее положение сервопривода):

Сервосигнал

Сервосигнал

: Идея: Многие сервоприводы работают менее 1 мс и более 2 мс. Например, у многих сервоприводов Hitec диапазон составляет 0,9… 2,1 мс. Проверьте лист данных ваших сервоприводов для деталей. Если у вас нет таблицы данных, вы можете просто поэкспериментировать с другими значениями.

С режимом ШИМ от 1 мс до 2 мс в течение периода 20 мс это означает, что используется только 10% от всего режима ШИМ. Это означает, что если у вас разрешение ШИМ всего 8 бит, то можно использовать только 10% из 256 шагов. Таким образом, 8-битный сигнал ШИМ не дает мне точной настройки сервопривода.

Продолжительность рабочего цикла (1,2 мс) переводится в положение двигателя. Обычно сервопривод имеет встроенный регулятор с замкнутым контуром с микроконтроллером и потенциометром.

: Идея: Я обнаружил, что не важно иметь * точную частоту ШИМ * 50 Гц. Вам необходимо поэкспериментировать с вашим сервоприводом, если он работает также с более низкой или более высокой частотой или с нефиксированной частотой (например, если вы используете программный ШИМ). Многие сервоприводы строят среднее значение рабочего цикла, поэтому вам может потребоваться отправить несколько импульсов, пока сервопривод не отреагирует на изменение значения.

Компонент Эксперт Серво процессора

Здесь я использую свой собственный компонент ‘Servo’, который предлагает следующие возможности:

  • Конфигурация ШИМ (режим работы и период)
  • Мин. / Макс. И значения инициализации
  • Методы изменения рабочего цикла
  • Дополнительная поддержка оболочки командной строки: вы можете вводить команды и управлять сервоприводом. Это полезно для тестирования или калибровки.
  • Дополнительное «синхронизированное» перемещение, так что вы можете перемещать сервопривод быстрее или медленнее в новую позицию, управляемую прерыванием

: Идея: Конечно, можно использовать сервоприводы без каких-либо специальных компонентов.

В представлении «Компоненты» я добавляю компонент «Серво». Чтобы добавить его в свой проект, я могу дважды щелкнуть по нему или использовать значок «+» в этом представлении:

Сервокомпонент в представлении библиотеки компонентов

Сервокомпонент в представлении библиотеки компонентов

: Идея: В случае, если представления Processor Expert не отображаются, используйте меню Processor Expert> Show Views

Это добавит новый компонент ‘Servo’ в проект:

Серво компонент добавлен

Серво компонент добавлен

Но он показывает ошибки, так как сначала необходимо настроить параметры ШИМ и выводов.

Конфигурация ШИМ

На Arduino Мотор / шаговых / серво щит два заголовка серводвигатель соединены PWM1B и PWM1A (см  схематичное ):

Сервопривод на борту (источник: схема щита электроники DK)

Сервопривод на борту (источник: схема щита электроники DK)

После сигналов это заканчивается на следующих выводах на KL25Z:

  • Servo 1  => PWM1B => Arduino Header D10 => FRDM-KL25Z D10 => KL25Z pin 73 => PTD0 / SPI0_PCS0 / TPM0_CH0
  • Servo 2  => PWM1A => Arduino Header D9 => FRDM-KL25Z D9 => KL25Z pin 78 => ADC0_SE6b / PTD5 / SPI1_SCK / UART2_TX / TPM0_CH5

Из имен выводов на Kinets (TPM0_CH0 и TPM0_CH5) я вижу, что это будет тот же таймер (TPM0), но с разными номерами каналов (CH0 и CH5).

Для моего первого эксперта по сервопроцессору я создал «TimerUnit_LDD», которым я смогу поделиться (позже об этом). В TimerUnit_LDD реализует ‘ L ogical  D evice  D река’ для моего PWM:

TimerUnit_LDD

TimerUnit_LDD

Поэтому я выбираю компонент ШИМ внутри компонента серво и настраиваю его для TPM0_C0V и вывода PTD0 / SPI0_PCS0 / TPM0_CH0 с низкой начальной полярностью. Период 20 мс (50 Гц) и начальный импульс с 1,5 мс (средняя точка) уже должны быть предварительно настроены:

Конфигурация Servo1 PWM

Конфигурация Servo1 PWM

: Идея: Я рекомендую дать ему имя сигнала булавки (я использовал ‘Servo1’)

:!: То, что мне нужно установить низкую начальную полярность, на мой взгляд, является ошибкой Processor Expert: устройство поддерживает начальную высокую полярность, но как-то это не реализовано? Это означает, что полярность сигнала ШИМ теперь инвертирована: «высокий» рабочий цикл будет означать, что сигнал низкий. Нам нужно «вернуть» логику позже в компоненте Servo.

Из-за инвертированной логики ШИМ мне нужно установить атрибут «Инвертированный ШИМ» в компоненте Servo:

Инвертированный ШИМ

Инвертированный ШИМ

Другие настройки компонента Servo мы можем оставить «как есть» на данный момент. «Min Pos PWM» и «Max Pos PWM» определяют диапазон рабочего цикла ШИМ, который мы будем использовать позже для положения сервопривода.

Добавление второго сервопривода

Как и в случае с первым сервоприводом, я добавляю второй сервопривод из представления библиотеки компонентов. Поскольку в моей системе уже есть TimerUnit_LDD, Processor Expert спрашивает меня, хочу ли я повторно использовать существующий или создать новый компонент:

Диалог общего компонента

Диалог общего компонента

Как объяснено выше: я могу использовать один и тот же таймер (только другой вывод / канал), поэтому я выбрал существующий компонент и нажал OK.

Как и выше, я настраиваю канал таймера и вывод с начальной полярностью:

Конфигурация Servo2 PWM

Конфигурация Servo2 PWM

И я не должен забывать включить инвертированную логику:

Инвертированный ШИМ для Servo2

Инвертированный ШИМ для Servo2

Тестовое приложение

Время попробовать. Для этого я создаю простое демонстрационное приложение, которое меняет положение обоих сервоприводов. Сначала я добавляю компонент Wait в проект из библиотеки компонентов:

Добавлен компонент ожидания

Добавлен компонент ожидания

Поскольку у меня настроены все компоненты Processor Expert, я могу сгенерировать код:

Генерация кода эксперта процессора

Генерация кода эксперта процессора

Затем я добавляю новый заголовочный  Application.h файл в свой проект. Для этого я выбираю папку «Источники» моего проекта и использую  контекстное меню «  Создать»> «Файл заголовка», чтобы добавить мой новый файл заголовка:

Новое приложение.h

Новое приложение.h

В этом заголовочном файле  Application.h я добавляю прототип для подпрограммы запуска приложения:

Добавлен прототип APP_Run

Добавлен прототип APP_Run

Из  main() ин  ProcessorExpert.c, я называю эту функцию (не забудьте включить заголовочный файл):

Вызов APP_Run с основного

Вызов APP_Run с основного

Таким же образом я добавляю новый исходный файл Application.c:

Новое приложение.c

Новое приложение.c

Чтобы проверить мои сервоприводы, я использую метод SetPos (), который принимает 8-битное (от 0 до 255) значение, которое является позицией. Чтобы немного затормозить, я жду несколько миллисекунд между разными позициями:

#include "Application.h"
#include "WAIT1.h"
#include "SERVO1.h"
#include "SERVO2.h"
 
void APP_Run(void) {
  uint16_t pos;
 
  for(;;) {
    for(pos=0;pos<=255;pos++) {
      SERVO1_SetPos(pos);
      SERVO2_SetPos(pos);
      WAIT1_Waitms(50);
    }
  }
}

Сохраните все файлы, и мы должны быть готовы попробовать это на доске.

Сборка, загрузка и запуск

Это оно! Время построить проект (меню  Project> Build Project ) и загрузить его с помощью отладчика (меню  Run> Debug ) и запустить приложение. Если все идет правильно, то два сервопривода будут медленно поворачиваться в одном направлении до конечного положения, а затем возвращаться в исходное положение.

Резюме

На мой взгляд, очень просто использовать серводвигатели для хобби с FRDM-KL25Z, CodeWarrior, Processor Expert и дополнительными компонентами, а также Arduino / Stepper / Servo Shield. Я надеюсь, что этот пост будет полезен для начала ваших собственных экспериментов с любительскими серводвигателями, чтобы вывести любой роботизированный проект на новый уровень.

У меня есть  здесь, на GitHub,  проект, который показывает то, что объясняется в этом посте, но с гораздо большим количеством компонентов, наворотов и свистков :-)