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

Ответить
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Серводвигатели

Сообщение Oleg »

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

Поэтому серводвигатели очень удобны для проектов, где требуется осуществлять весьма быстрое и относительно точное перемещение какого-либо рабочего органа.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Типы серводвигателей

Сообщение Oleg »

Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Проект: танцующая кукла Пепе на Raspberry Pi

Сообщение Oleg »

Серводвигатели очень быстро реагируют на команды смены позиции. В этом проекте это их свойство используется, чтобы потянуть марионетку за ниточку и заставить ее танцевать или двигаться в любом желаемом направлении.
Кукольный Пепе
Кукольный Пепе
Управление сервоприводами здесь строится на пошаговом проигрывании списка позиций их рабочих органов. В разд. «Проект: кукла Пепе обретает голос» марионетка получит возможность говорить, а в дальнейшем, благодаря выходу в Интернет, сможет исполнить танец, заданный определенным хештегом.

Комплектующие

Для реализации этого проекта на Raspberry Pi понадобятся следующие комплектующие:

16-канальный 12-битный модуль (драйвер) PWM/Servo
4 серводвигателя 9g
Переходник с круглым гнездом и винтовыми зажимами
Перемычки «мама-мама»
Перемычки «папа-папа»
Источник питания 5 В 2 А
4 зубочистки (длиной около 7-8 см каждая) Небольшая кукла (с бечевкой для каждой конечности)
Лист монтажного картона, формат А4
Клеевой пистолет или эпоксидный клей и дрель

Схема проекта

В проекте задействована плата Raspberry Pi в основном потому, чтобы ее можно подключить к Интернету, как будет показано позднее. Тем не менее, можно использовать и Arduino. В этом случае внешние модули PWM/Servo Adafruit нам не понадобятся, а подключить сервоприводы к Arduino надо будет с помощью макетной платы и перемычек «папа-папа». Однако потребуется целая куча таких перемычек!

Управляются руки и ноги куклы четырьмя сервоприводами 9g - по одному на каждую руку и ногу. Управление сервоприводами осуществляется с помощью 16-канальной контроллерной платы (драйвера) PWM/Servo компании Adafruit. Дополнительное преимущество такой конструкции заключается в том, что разъемы на проводах серводвигателей могут быть напрямую подключены к разъемам контроллерной платы (на рисунке, чтобы не запутать вас, показан только средний провод, идущий к плате от каждого сервопривода).
Подключение сервоприводов куклы к Raspberry P с помощью контроллерной платы (драйвера) PWMServo
Подключение сервоприводов куклы к Raspberry P с помощью контроллерной платы (драйвера) PWMServo
Одновременная работа четырех сервоприводов требует применения для их питания отдельного батарейного блока. Это необходимо для уменьшения влияния помех от двигателей на работу Raspberry Pi.

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

Сборка проекта

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

Шаг 1. Удлинение качалок сервоприводов

Серводвигатели поставляются с небольшим пакетиком разных пластиковых качалок, которые можно установить на выходном валу серводвигателя. Выберите прямую качалку и приклейте к ней зубочистку, как показано на рисунке ниже. Для этой цели отлично подойдут клеевой пистолет или эпоксидный клей.
Удлинение качалок серводвигателей
Удлинение качалок серводвигателей
Обратите внимание, что на конце каждой зубочистки оставлена капля клея. Это необходимо, чтобы предотвратить соскальзывание бечевки, когда она будет привязана к концу зубочистки.

Шаг 2. Изготовление шасси

Чтобы управлять движением конечностей куклы, качалки четырех сервоприводов должны иметь возможность свободно двигаться вверх и вниз. Чтобы разместить все на нужных местах, сделаем вырезы на подходящей монтажной панели (хорошо подходит картон для наклейки фотографий).

Для точного определения мест вырезов воспользуйтесь шаблоном. Разместите на монтажной панели распечатанный из файла шаблон и приклейте его к панели с помощью легкого клея, чтобы его можно было удалить перед приклеиванием к этой панели серводвигателей.
Снимок экрана 2023-09-01 155840.jpg
Использование шаблона
Использование шаблона
Сделав в панели канцелярским ножом два больших выреза согласно шаблону, просверлите также два небольших отверстия, которые нужны для бечевки, идущей к голове куклы и принимающей на себя основной ее вес.
Вырезы, отверстия и примерка размещения сервоприводов
Вырезы, отверстия и примерка размещения сервоприводов
Шаг 3. Приклеивание сервоприводов

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

Шаг 4. Подготовка куклы

На рисунке показана кукла, которой мы будем управлять в этом проекте. Одна бечевка закреплена на верхней части головы куклы она принимает на себя весь вес куклы. Эту бечевку следует пропустить через два отверстия, просверленные в монтажной панели (шасси), и завязать под ней.

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

Прежде чем закрепить куклу на новой конструкции, нужно подключить все сервоприводы и запустить нужные программы, чтобы установить качалки всех сервоприводов в правильное положение.
Кукла Пепе
Кукла Пепе
Шаг 5. Подключаем провода

Плату Raspberry Pi лучше сориентировать так, чтобы разъем интерфейса (I^2)C оказался на другой его стороне по отношению к модулю контроллера сервоприводов. Так будет удобнее при использовании оборудования, когда Пепе обретет голос.

Если хочется уменьшить количество пайки, то можно ограничиться припаиванием лишь четырех разъемов для сервоприводов, поскольку в этом проекте их задействовано только четыре. После подключения проводов по схеме, показанной на рисунке выше, все должно выглядеть так, как показано на рисунке ниже.
Схема управления пляшущей куклой в сборе
Схема управления пляшущей куклой в сборе
Следует убедиться в правильном подключении разъемов всех сервоприводов: оранжевый провод управления (Control) должен быть вверху, а коричневый или черный общий провод (GND) - внизу.

Теперь можно подсоединить питание 5 В для сервоприводов и отдельное питание для Raspberry Pi через разъем USB.

Шаг 6. Запуск тестовой программы

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

Код: Выделить всё

#!/usr/bin/python

from Adafruit_PWM_Servo_Driver import PWM
import time

# ===========================================================================
# Example Code
# ===========================================================================

# Initialise the PWM device using the default address
pwm = PWM(0x40)
# Note if you'd like more debug output you can instead run:
#pwm = PWM(0x40, debug=True)

servoMin = 150  # Min pulse length out of 4096
servoMax = 600  # Max pulse length out of 4096
  
def map(value, from_low, from_high, to_low, to_high):
  from_range = from_high - from_low
  to_range = to_high - to_low
  scale_factor = float(from_range) / float(to_range)
  return to_low + (value / scale_factor)
  
  
def set_angle(channel, angle):
  pulse = int(map(angle, 0, 180, servoMin, servoMax))
  pwm.setPWM(channel, 0, pulse)

pwm.setPWMFreq(60)                        # Set frequency to 60 Hz
while (True):
  angle = input("Angle:")
  set_angle(0, angle)
  set_angle(1, angle)
  set_angle(2, angle)
  set_angle(3, angle)
Модуль серводвигателей Adafruit использует интерфейс (1^2)С, который в Raspberry Pi по умолчанию выключен.

НАСТРОЙКА (1^2)С НА RASPBERRY PI

Для начала убедитесь, что ваш менеджер пакетов актуален - это делается с помощью следующей команды:

$ sudo apt-get update

Далее запустите конфигуратор raspi-config

$ sudo raspi-config

В появившемся меню выберите пункт Advanced (Дополнительно), а затем (1^2)С - появится запрос Would you like the ARM I2C interface to be enabled? (Хотите включить интерфейс I2С?). Выберите вариант Yes (Да). Будет задан вопрос Would you like the I2C kernel module to be loaded by default? (Загружать модуль I2С по умолчанию?) Это подходящий в данном случае вариант, поэтому снова следует ответить Yes (Да) Выберите пункт Finish (Готово) для выхода из конфигуратора raspi-config.

Выполните следующую команду из вашего домашнего каталога, чтобы установить некоторые полезные инструменты (I^2)С:
sudo apt-get install python-smbus i2c-tools

Убедиться, что Raspberry Pi подключается к плате сервоприводов Adafruit и готов к работе, можно, выполнив такую команду:
$ sudo i2cdetect -y 1

Вы должны увидеть следующий результат (числа 40 и 70 в таблице означают, что плата подключена):
n.jpg
Настроив интерфейс (I^2)С, снимите качалки с валов сервоприводов и запустите программу написанную выше. При появлении запроса введите значение угла 90

$ sudo python set_servos.py
Angle: 90
Angle:


Сервоприводы должны с жужжанием повернуться на угол 90°. Теперь можно закрепить качалки настолько близко к горизонтали, насколько это позволят сделать зубцы на валах сервоприводов.

Шаг 7. Подключение куклы

Теперь, когда все сервоприводы заняли положение 90°, подвяжите бечевку, идущую от головы куклы, к отверстиям в центре шасси. Затем привяжите бечевки, идущие от конечностей куклы, к удлиненным качалкам серводвигателей. Бечевки нужно прикрепить так, чтобы руки и ноги оказались в наполовину поднятом положении.

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

Программа для Raspberry Pi

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

Вы можете запустить программу даже до того, как взглянуть на код.

Код: Выделить всё

from Adafruit_PWM_Servo_Driver import PWM   # 1
import time

pwm = PWM(0x40)

servoMin = 150  # Min pulse length out of 4095     # 2
servoMax = 600  # Max pulse length out of 4095

dance = [      # 3
  #lh  lf  rf  rh
  [90, 90, 90, 90],
  [130, 30, 30, 130],
  [30, 130, 130, 30]    
]

delay = 0.2   # 4
  
def map(value, from_low, from_high, to_low, to_high):  # 5
  from_range = from_high - from_low
  to_range = to_high - to_low
  scale_factor = float(from_range) / float(to_range)
  return to_low + (value / scale_factor)
  
  
def set_angle(channel, angle):  # 6
  pulse = int(map(angle, 0, 180, servoMin, servoMax))
  pwm.setPWM(channel, 0, pulse)
  
def dance_step(step):  # 7
  set_angle(0, step[0])
  set_angle(1, step[1])
  set_angle(2, step[2])
  set_angle(3, step[3])
  

pwm.setPWMFreq(60)   # 8


while (True):   # 9
  for step in dance:
      dance_step(step)
      time.sleep(delay)
Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

1. Плата Adafruit может быть использована не только для управления серводвигателями, но и другими устройствами, воспринимающими ШИМ-сигнал, например, светодиодами. Именно поэтому код импортирует класс под названием PWN (ШИМ).

2. Две константы: servoMin и servoMax задают длительность импульса между 0 и 4095, где 4095 соответствует 100% включению:

3. Массив dance содержит три группы данных для конкретного танца. Сюда можно добавить столько строк, сколько захочется. Каждая строка состоит из массива из четырех значений. Это угол поворота серводвигателей для левой руки, левой ноги, правой ноги и правой руки соответственно. Поскольку серводвигатели рук и ног смонтированы зеркально по отношению друг к другу, угол более 90° означает поднятие руки, но опускание ноги (это необходимо учитывать при составлении своего оригинального танца).

4. Переменная delay задает паузу между каждым шагом танца. Чем меньше ее значение, тем быстрее будет двигаться кукла

5. Функция map служит для подтягивания значения угла к правому (максимальному) значению длительности импульса при использовании в функции set_angle.

6. Функция set_angle имеет два параметра: первый из них задает номер канала серводвигателя (от 0 до 3), а второй угол - поворота.

7. Функция dance_step задает углы для четырех серводвигателей конечностей и приводит каждый серводвигатель к заданному углу.

8. Установка частоты ШИМ 60 раз в секунду дает серию импульсов каждые 17 MC- это примерно то, что нужно серводвигателю.

9. На каждую итерацию цикла главной программы приходится один шаг в танце серводвигатели устанавливаются на заданные углы, затем выдерживается пауза перед новым шагом. Когда будут выполнены все шаги, заданные в программе, все начнется заново.

Пусть Пепе не только танцует...

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

Ответить