- Управление серводвигателями с помощью микроконтроллеров AVR AtMega32
- Управление Сервоприводом.
- Демонстрационнаяпрограмма приведена ниже, показано, как использовать сервомоторов смикроконтроллером AVR. Работы программы очень проста, она начинается синициализации таймера и PWM.В начале фиксируеться сервопривод на 0 градусов, азатем перемещается на 90 градусов и подождатв некоторое время перемещается на135 градусов, и наконец, на 180градусов. Этот процесс повторяется до тех пор, пока привод подключен к питанию.
- Сборка HEXAPOD. Электроника + Калибровка
- Введение:
- Видео:
- Нам понадобится:
- Схема подключения:
- Питание:
- Код программы:
- Функции библиотеки iarduino_Hexapod:
- Функция begin();
- Функция go();
- Функция set_motion();
- Функция set_motionA();
- Функция calibration();
- Калибровка:
Управление серводвигателями с помощью микроконтроллеров AVR AtMega32
Сервоприводыприменяются также для контроля руля RC- автомобилей, робототехники и т.д. Существует много видов сервоприводов, но здесь мы сосредоточимсяна малых сервоприводы так называемых hobby . H obb y двигатель и его механизм управления встроен в один блок. Подключение осуществляеться спомощью трех присоединительных проводов . Мы будем использовать сервопривод FutabaS3003 .
FutabaS3003 проводки.
1.RED -> Управление позицией ,питание +4.8В до 6В
3.WHITE -> Сигнал управления.
Управление Сервоприводом.
Управлятьсервоприводом легко с помощью микроконтроллера,не нужно никаких внешнихдрайверов. Просто подаваяуправляющий сигнал сервопривод будет позиционировать на любой заданный угол. Частота управляющего сигнала обычно 50hz (т.е.период 20 мс), а длительность импульса задает величину угла.
Для FutabaS3003 яузнал следующие синхронизацию . Соотношение между шириной импульса иуглом поворота сервопривода, приводится ниже. Заметим,что этот сервопривод способен вращаться только между 0 и 180 градусов.
- 0.388ms= 0 градусов.
- 1.264ms= 90 градусов.
- (Нейтральнаяпозиция) 2.14ms= 180 градусов.
Управление Серво двигателем.
Вы можете использовать микроконтроллер AVR с функцией PWM дляуправления сервомоторов. Таким образом, PWM автоматически сгенерирует сигналыблокировки сервопривода и центральный процессор контролера освободится длядругих задач. Чтобы понять, как можно настроить и использовать PWM необходимоиметь базовые знания аппаратных таймеров и PWM модулей в AVR.
Здесь мы будемиспользовать AVR Timer модуль, который является 16bit таймером и имеет два канала PWM (А и B).
Частота центрального процессора составляет 16 МГц,эта частота — максимальная частота,на которой большинство AVR способны работать.Так же будем использовать делитель частоты на 64. Так таймера получат 16MHz/64 =250khz (4 мкс).Таймер установим в режим 14.
Функциитаймера в режими 14
- РежимFAST PWM
- T T OP Значение = ICR1
Так таймер будет считать от 0 до ICR1. Формуладля частоты ШИМ и расчеты по значению TOP приводится ниже.
Такимобразом, мы устанавливаем ICR1A = 4999,это дает нам PWM периода 20мс (50 Гц).Убедитесь что в режими выводаустанавленны правильные настройки COM1A1, COM1A0 (для PWM канала) и COM1B1,COM1B0 (для PWM канал B)
COM1A1= 1 и COM1A0 = 0 (PWM Источник)
COM1B1= 1 и COM1B0 = 0 (PWM канал B)
Теперь рабочий цикл может быть установлен путем настройки OCR1A иOCR1B регистров. Эти два регистрауправления PWM периодом Так как период таймера 4мкс (помните 16 МГц разделили на 64), Мы можем вычислить значения, необходимые для поворотасервопривод на определенный угол.
§ Servoугол 0 градусов требуется ширина импульса 0.388ms (388uS), поэтому значениеOCR1A = 388us/4us = 97
§ Servoугол 90 градусов требуется ширина импульса 1.264ms (1264uS), поэтому значениеOCR1A = 1264us/4us = 316
§ Servoугол 180 градусов требуется ширина импульса 2.140ms (2140uS), поэтому значениеOCR1A = 2140us/4us = 535
Такимобразом, мы можете вычислить значение OCR1A (или OCR1B для второгосервопривода) для любого угла. Заметимчто значение OCR1x колеблются от 97 до535 для углов от 0 до 180 градусов.
Программа управления двигателем.
Демонстрационнаяпрограмма приведена ниже, показано, как использовать сервомоторов смикроконтроллером AVR. Работы программы очень проста, она начинается синициализации таймера и PWM.В начале фиксируеться сервопривод на 0 градусов, азатем перемещается на 90 градусов и подождатв некоторое время перемещается на135 градусов, и наконец, на 180градусов. Этот процесс повторяется до тех пор, пока привод подключен к питанию.
Параметрыдля правильной работы программы.
- LOW Fuse = 0xFF и HIGH Fuse = 0xC9
- Частота= 16 МГц.
- Сервомоторклеймо Futaba S3003 .
- MCUявляется AtMega32 или однокристальный микроконтроллер ATmega16.
Сборка HEXAPOD. Электроника + Калибровка
Введение:
Установка и подключение электроники HEXAPOD, является заключительным этапом сборки.
Видео:
Нам понадобится:
- Arduino х 1шт.
- Servo Shield на 16 каналов х 1шт.
- Trema Shield х 1шт.
- Trema кнопка x 2шт. (для калибровки)
- Trema светодиод x 1шт. (для калибровки)
- Trema ИК-приёмник x 1шт.
- ИК пульт дистанционного управления x 1шт.
- Контактные колодки x 1 комплект.
- Крепежи.
- Стойка x 4шт.
- Винт x 4шт.
- Гайка x 4шт.
- Источник питания. (подробнее в разделе питание)
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_MultiServo (для работы с Multi Servo Shield).
- Библиотека iarduino_Hexapod (для работы с Hexapod).
- Библиотека iarduino_IR (для работы с ИК приёмником).
- Библиотека EEPROM (для работы с EEPROM) входит в стандартный набор
Схема подключения:
Сначала нужно закрепить arduino Uno, при помощи крепежей , на Hexapod. Далее на arduino Uno устанавливается servo shield, к которому подключаются выводы сервоприводов. Далее, через контактные колодки, на servo shield устанавливается trema shield, к которому подключаются trema кнопки , trema светодиод и trema ИК-приёмник .
Модули | Arduino |
---|---|
Кнопка A | 2 (можно изменить) |
Кнопка B | 3 (можно изменить) |
Светодиод | 4 (можно изменить) |
ИК-приёмник | 7 (можно изменить) |
Сервоприводы | Servo Shield | |
---|---|---|
1 конечность | Горизонтальный сустав | 0 (можно изменить) |
Вертикальный сустав | 1 (можно изменить) | |
2 конечность | Горизонтальный сустав | 2 (можно изменить) |
Вертикальный сустав | 3 (можно изменить) | |
3 конечность | Горизонтальный сустав | 4 (можно изменить) |
Вертикальный сустав | 5 (можно изменить) | |
4 конечность | Горизонтальный сустав | 6 (можно изменить) |
Вертикальный сустав | 7 (можно изменить) | |
5 конечность | Горизонтальный сустав | 8 (можно изменить) |
Вертикальный сустав | 9 (можно изменить) | |
6 конечность | Горизонтальный сустав | 10 (можно изменить) |
Вертикальный сустав | 11 (можно изменить) |
- Выводы кнопок и светодиода можно изменить на любые цифровые, указав их при объявлении переменной IXP:
- Вывод ИК-приёмника можно изменить на любой цифровой, указав его при объявлении переменной IR:
- Выводы сервоприводов можно изменить на любые из 16 доступных на servo shield, указав их в файле: Servo.h библиотеки iarduino_Hexapod.
Питание:
У Servo Shield имеется два питания: логическая часть запитывается от arduino, через выводы 5V (можно поменять на 3V3) и GND, а силовая часть Servo Shield запитывается отдельно, через выводы V+ и GND напряжением 5В постоянного тока до 2А (зелёный клеммник). Так как силовая часть Servo Shield потребляет значительные токи, она требует отдельного источника питания. Не запитывайте силовую часть Servo Shield от выхода 5V arduino.
Рекомендуем запитывать hexapod от источника питания 7. 12В, подключив arduino к источнику напрямую (вывод Vin), а силовую часть Servo shield через понижающий преобразователь 5В 3А.
Код программы:
Функции библиотеки iarduino_Hexapod:
Функция begin();
- Назначение: Инициализация Hexapod.
- Синтаксис: begin(тип_сервоприводов);
- Параметры: SERVO_SG90, или SERVO_MG90, или SERVO_MG996R, или SERVO_FutabaS3003
- Возвращаемые значения: Нет.
- Примечание: Вызывается 1 раз в коде setup.
- Пример:
Функция go();
- Назначение: Движение Hexapod.
- Синтаксис:
- 1 вариант: go(X , Y , Z );
- 2 вариант: go(команда , параметр_команды);
- Параметры:
- X: от -10 (влево) до +10 (вправо).
- Y: от -10 (назад) до +10 (вперёд). — необязательный параметр
- Z: от -10 (вниз) до +10 (вверх). — необязательный параметр
- команда:
- GO_ON — движение вперед.
- GO_BACK — движение назад.
- GO_LEFT — поворот влево.
- GO_RIGHT — поворот вправо.
- GO_ON_LEFT — движение вперед и поворот влево.
- GO_ON_RIGHT — движение вперед и поворот вправо.
- GO_BACK_LEFT — движение назад и поворот влево.
- GO_BACK_RIGHT — движение назад и поворот вправо.
- COM_STOP — команда стоп.
- COM_SIT — команда сидеть.
- COM_NOD — команда поклон.
- COM_UP — команда встать.
- COM_LAY — команда лежать.
- COM_TEST — команда тест.
- COM_SLEEP — команда спать.
- COM_EMPTY — команда пустая.
- параметр_команды: значение от 0 до 10 определяющее скорость или уровень. — необязательный параметр
- Возвращаемые значения: Нет.
- Пример:
Функция set_motion();
- Назначение: Движение конечностями Hexapod.
- Синтаксис: set_motion(№_конечности , №_сустава , положение_сустава);
- Параметры:
- №_конечности: от 1 до 6 или SERVO_ALL для всех конечностей сразу.
- №_сустава: 1 (вертикальный), или 2 (горизонтальный).
- положение_сустава: от 0 (внизу или сзади) до 100 (вверху или спереди) или SERVO_FREE (отключить сервопривод).
- Возвращаемые значения: Нет.
- Пример:
Функция set_motionA();
- Назначение: Движение конечностями Hexapod по градусу.
- Синтаксис: set_motionA(№_конечности , градус_движения);
- Параметры:
- №_конечности: от 1 до 6 или SERVO_ALL для всех конечностей сразу
- градус_движения: от 1 до 360 см. примечание
- Возвращаемые значения: Нет.
- Примечание: Представьте себе, как движется конечность? Она повторяет одни и те же движения (иногда с разным размахом): проходит внизу спереди назад, поднимается вверх, сверху быстрее проходит вперёд, опускается вниз, и всё повторяется. Если представить весь этот круг в виде 360°, то каждое положение конечности, можно представить числом от 1 до 360, это и есть градус_движения.
- Пример:
Функция calibration();
- Назначение: калибровка суставов конечностей Hexapod.
- Синтаксис: calibration();
- Параметры: Нет.
- Возвращаемые значения: Нет.
- Примечание: Вызывается 1 раз в коде loop. Сама перехватывает нажатие кнопок A и B
- Пример:
В библиотеке доступна 1 переменная: uint8_t walking, определяющая тип походки (по умолчанию = 2).
- 0 — все конечности движутся одинаково, похоже на плавание брасом
- 1 — конечности движутся с задержкой на 1/6 в следующем порядке: 1,2,3,4,5,6
- 2 — конечности движутся с задержкой на 1/6 в следующем порядке: 1,3,5,2,4,6
- 3 — конечности движутся с задержкой на 1/6 в следующем порядке: 1,4,5,2,3,6
Присвойте значение данной переменной и заставьте пойти Hexapod вызвав функцию go(); для просмотра отличий в его походке.
Калибровка:
Так как невозможно установить сервоприводы идеально по центру суставов конечностей, в библиотеке iarduino_Hexapod реализована функция calibration (), которая указывается в коде loop. Эта функция перехватывает нажатие на кнопки A и B, и выполняет процесс калибровки, позволяя сохранить реальное центральное положение суставов в энергонезависимую память EEPROM.
Если калибровка ни разу не производилась, то Hexapod не будет реагировать на команды, а светодиод будет постоянно гореть.
- Нажмите и удерживайте обе кнопки A и B:
- Hexapod перейдёт в режим установки вертикальных суставов:
- Все суставы отключены (горизонтальные и вертикальные).
(светодиод равномерно мигает 1 раз в секунду) - Однократное нажатие на кнопку A приведет к поднятию всех вертикальных суставов.
(светодиод учащённо мигает) - Однократное нажатие на кнопку B приведет к отключению всех вертикальных суставов.
(светодиод равномерно мигает 1 раз в секунду) - Нажатие и удержание обеих кнопок A и B приведёт к выходу из данного режима.
- Hexapod перейдёт в режим центрирования вертикальных суставов:
(светодиод кратковременно загорается после длительной паузы)
(светодиод кратковременно загорается после небольшой паузы)
(светодиод кратковременно загорается после небольшой паузы)
- Hexapod перейдёт в режим центрирования горизонтальных суставов:
(светодиод долго горит с кратковременными паузами)
(светодиод горит с кратковременными паузами)
(светодиод горит с кратковременными паузами)
- Hexapod перейдёт в режим тестирования:
(светодиод непрерывно горит)
(светодиод не горит)
После того как калибровка произведена, можно объявлять переменную IXP без параметров (без выводов к которым подключены кнопки и светодиод), а сами кнопки и светодиод, исключить из схемы. Саму же функцию calibration() можно закомментировать или удалить из кода loop.